当前位置: 首页 > news >正文

Mybatis入门手册

介绍

MyBatis 是一个优秀的持久层框架,它简化了 Java 应用程序与关系型数据库之间的交互。MyBatis 通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射,避免了传统 JDBC 编程中的大量样板代码。

XML方式配置Mybatis

现在不常用,稍微了解一下即可,1对1,1对多等细节方面不作赘述

项目结构分析

Mybatis_1
└── src   ├── main   │   ├── java   │   │   └── org.palmer.mybatis_1   │   │       ├── mapper   │   │       │    └── UserMapper.java   │   │       └── pojo   │   │            └── User.java   │   └── resources   │       ├── application.properties   │       ├── db.properties   │       ├── mapper   │       │   └── UserMapper.xml  │       ├── mybatis-config.xml   └── test       └── java           └── org.palmer.mybatis_1                └── MybatisXmlTest.java
  • org.palmer.mybatis_1/

    • mapper包:存放 Mapper 接口(也称为 DAO 接口)。 它定义了操作数据库的方法(如 insertUsergetUserById),但不包含实现类。MyBatis 在运行时会利用 JDK 动态代理技术,根据接口方法的签名和对应的 XML 配置,自动生成实现类对象(代理对象)来执行 SQL。
    • pojo包:存放java 实体类
  • resources/

    • mybatis-config.xml : MyBatis 的全局核心配置文件。 它用于配置数据库连接环境(Environment)、事务管理器、数据源,以及注册映射文件(即告诉 MyBatis 去哪里加载 mapper 包下的 XML 文件),是整个框架运行的基础。
    • application.properties文件:将配置代码从业务代码里解耦出来,直观方便,更改配置时不用重新编译
    • db.properties文件:将数据库驱动、用户、密码、等关键信息解耦出来,直观方便,更改配置时不用重新编译
    • mapper包:存放后缀为.xml的SQL映射文件,通过<namespace>标签关联对应的java接口,通过id属性关联接口中的方法,然后编写实际的SQL语句;接口一般和一个实体(pojo类)对应,从而实现了SQL 语句与 Java 代码的解耦。

xxxMapper接口

定义接口

public interface UserMapper {public User getUserById(int id);public void insertUser(User user);
}

xxxMapper.xml

id要和接口的方法名字一致

  • #{} :预编译参数,防止 SQL 注入,推荐使用。
  • ${} :字符串替换,存在 SQL 注入风险,仅用于动态表名、列名等场景。
开启获取主键功能

useGeneratedKeys="true":开启功能,告诉 MyBatis 使用 JDBC 的 getGeneratedKeys获取主键的值

主键回填

keyProperty="id":告诉 MyBatis 把拿到的主键值,赋值给 Java 对象的哪个属性。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.palmer.mybatis_1.mapper.UserMapper"><select id="getUserById" parameterType="int" resultType="org.palmer.mybatis_1.pojo.User">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser" parameterType="org.palmer.mybatis_1.pojo.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users(name, age) VALUES(#{name}, #{age})</insert><update id="updateUser" parameterType="org.palmer.mybatis_1.pojo.User">UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteUserById" parameterType="int">DELETE from users where id = #{id}</delete>
</mapper>

mybatis-config.xml

为Mybatis的全局配置文件

  1. ${xxx}:占位符,从配置文件获取它的实际值;Spring Boot 环境下,占位符会自动从 application.properties 读取;纯 MyBatis 环境,需要通过 <properties> 标签明确指定从哪里读取,我们指明为的db.properties
  2. 加载SQL映射文件:告诉 MyBatis 去当前目录的哪个包加载 SQL 映射定义。
<mappers><mapper resource="mapper/UserMapper.xml"/><mapper resource="mapper/OrderMapper.xml"/>// ..... 可以映射多个
</mappers>

其余配置与JDBC一致,不再追述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>// 指定读取的<properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

db.properties

Mybatis会来这个配置文件找寻数据库的信息

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/SSM
username = root
password = xxxxxxxx

使用测试

  1. 读取全局配置文件:定义配置文件路径,例如 resource = "mybatis-config.xml"
  2. 获取输入流:使用 MyBatis 工具类加载配置,即 InputStream inputStream = Resources.getResourceAsStream(resource)
  3. 构建工厂对象:利用建造者模式,通过 SqlSessionFactoryBuilder().build(inputStream) 根据输入流构造出 SqlSessionFactory 对象
  4. 开启会话:调用工厂方法 sqlSessionFactory.openSession() 获取一个 SqlSession 会话对象
  5. 执行操作:通过 SqlSession 获取 Mapper 的代理对象,调用其方法执行 SQL;对于增删改操作需显式调用 session.commit() 提交事务,查询结果会自动映射为 POJO,最后自动关闭 SqlSession (try-with-resources或者sqlSession.close()手动关闭)。

简单测试代码

    public static void main(String[] args) throws IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = new User("palmer", 18);mapper.insertUser(user);System.out.println(mapper.getUserById(user.getId()));sqlSession.commit();sqlSession.close();}

实际业务中要确保资源的释放和异常处理

public class MybatisXmlTest {// 测试数据常量private static final String TEST_USER_NAME = "palmer";private static final int TEST_USER_AGE = 18;public static void main(String[] args) {String resource = "mybatis-config.xml";// 使用 try-with-resources 自动管理资源try (InputStream inputStream = Resources.getResourceAsStream(resource)) {// 1. 创建 SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 打开 SqlSession(自动关闭)try (SqlSession session = sqlSessionFactory.openSession()) {// 3. 获取 Mapper 代理对象UserMapper mapper = session.getMapper(UserMapper.class);System.out.println("张珈铭249980843");// 4. 执行插入操作User user = new User(TEST_USER_NAME, TEST_USER_AGE);mapper.insertUser(user);System.out.println("用户插入成功!自动生成的id:" + user.getId());System.out.println(user.getId());// 5. 执行查询操作user = mapper.getUserById(user.getId());System.out.println("查询结果:" + user);// 6. 更新操作System.out.println("---- 更新测试");user.setAge(22);user.setName("oddpalmer");mapper.updateUser(user);user = mapper.getUserById(user.getId());System.out.println("查询结果:" + user);// 7. 删除操作System.out.println("---- 删除测试");mapper.deleteUserById(user.getId());user = mapper.getUserById(user.getId());if(user == null)System.out.println("删除成功");session.commit(); // 提交事务}} catch (IOException e) {System.err.println("配置文件加载失败!");e.printStackTrace();} catch (Exception e) {System.err.println("数据库操作失败!");e.printStackTrace();}}

注解方式配置Mybatis

在简单业务上,用注解可以简化CRUD操作;生产环境中仍然推荐xml注解配置,灵活直观。这里的注解只是替换了每个接口的xml映射,所以还是需要全局配置文件?

MyBatis 提供了一套原生注解对应 SQL 的增删改查操作,无需编写 XML 映射文件,直接在 Mapper 接口方法上添加注解即可完成 SQL 绑定,核心注解如下:

  • @Insert:添加
  • @Update:修改
  • @Delete:删除
  • @Select:查询
  • @Option:设置主键
  • @Result:实现结果集封装
  • @Results:可以和@Result一起使用,封装多个结果集
  • @One:实现一对一和多对一的结果集封装
  • @Many:实现一对多结果级封装

更改mybatis-config.xml配置文件

指明要用注解映射SQL语句的接口用 <mapper class>

    <mappers><!-- <mapper resource="mapper/UserMapper.xml"/> 注释掉--><mapper class="org.palmer.mybatis_1.mapper.UserMapper"/> </mappers>

更改接口

@Options:对应了获取主键值的功能,和主键回填功能

public interface UserMapper {@Select("select * from users where id = #{id}")public User getUserById(int id);@Insert("insert into users(name, age) values(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")public int insertUser(User user);@Update("update users set name = #{name}, age = #{age} where id = #{id}")public void updateUser(User user);@Delete("delete from users where id = #{id}")public int deleteUserById(int id);
}

其余配置可以不变,Ez

http://www.jsqmd.com/news/705572/

相关文章:

  • Synology HDD db:3步解锁群晖NAS硬盘兼容性限制的终极指南
  • Godot游戏资源解包终极指南:快速提取PCK文件的完整解决方案
  • 微信立减金怎么兑换?闲置额度居然能变实打实的零花钱 - 京顺回收
  • 3分钟上手Translumo:打破语言障碍的智能屏幕翻译神器
  • 抖音无水印视频下载终极指南:3分钟掌握批量下载技巧,轻松获取高清资源
  • FreeModbus移植避坑指南:如何优雅地处理临界区与事件队列(含FreeRTOS示例)
  • 魔兽世界API与宏命令工具:提升游戏体验的终极解决方案
  • AI时代的To B PMF,还成立吗?
  • 像搭积木一样改造你的Windows系统
  • 小红书数据采集技术解决方案:基于Appium与Mitmproxy的混合架构实现
  • 【优化求解】带惯性项的自适应交替方向乘子法iADMMn求解带正则化的逻辑回归矩阵分解问题(对比ADMM和梯度下降法GD算法)【含Matlab源码 15370期】
  • 如何编写可维护的SQL视图脚本_规范与文档化建议
  • 【Docker WASM边缘部署终极指南】:20年架构师亲授3大性能瓶颈突破法,错过再等5年!
  • Rust高性能网络编程实战:基于Tokio构建可编程流量处理框架
  • 面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
  • Cursor Pro免费激活实战指南:自动化配置与设备标识重置方案
  • 工业4.0数字孪生:滑动窗口优化实战
  • InsForge:为AI智能体打造语义化后端平台,实现全栈开发自动化
  • 故障分级标准(Incident Severity)P级别 / SEV级别介绍(P0 / SEV1)
  • 【优化求解】ADMM的电动车辆车队最优充电策略【含Matlab源码 15374期】
  • 第4课:Subagent —— 拆解大任务,上下文隔离
  • 终极指南:如何用ComfyUI-Florence2快速实现15种视觉AI任务
  • Godot PCK文件解包终极指南:如何轻松提取游戏资源
  • 千问3.5-2B助力STM32开发:嵌入式系统代码注释与文档生成
  • 【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显
  • 如何高效配置RTL8852BE Wi-Fi 6驱动:5步实现Linux系统最佳无线性能
  • 深度神经网络解析:从原理到工程实践
  • 2026年3月钢管定制加工推荐,钢管/304不锈钢管/不锈钢管/304钢管,钢管零切联系电话 - 品牌推荐师
  • 4月揭秘:市场口碑好的冷却镜面辊生产企业推荐,压花辊/压延辊/镜面辊/冷却镜面辊/电磁加热辊,冷却镜面辊企业推荐 - 品牌推荐师
  • 3分钟解锁iPhone网络共享:Windows驱动安装终极指南 [特殊字符]