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 接口)。 它定义了操作数据库的方法(如
insertUser、getUserById),但不包含实现类。MyBatis 在运行时会利用 JDK 动态代理技术,根据接口方法的签名和对应的 XML 配置,自动生成实现类对象(代理对象)来执行 SQL。 - pojo包:存放java 实体类
- mapper包:存放 Mapper 接口(也称为 DAO 接口)。 它定义了操作数据库的方法(如
-
resources/
- mybatis-config.xml : MyBatis 的全局核心配置文件。 它用于配置数据库连接环境(Environment)、事务管理器、数据源,以及注册映射文件(即告诉 MyBatis 去哪里加载
mapper包下的 XML 文件),是整个框架运行的基础。 - application.properties文件:将配置代码从业务代码里解耦出来,直观方便,更改配置时不用重新编译
- db.properties文件:将数据库驱动、用户、密码、等关键信息解耦出来,直观方便,更改配置时不用重新编译
- mapper包:存放后缀为.xml的SQL映射文件,通过
<namespace>标签关联对应的java接口,通过id属性关联接口中的方法,然后编写实际的SQL语句;接口一般和一个实体(pojo类)对应,从而实现了SQL 语句与 Java 代码的解耦。
- mybatis-config.xml : MyBatis 的全局核心配置文件。 它用于配置数据库连接环境(Environment)、事务管理器、数据源,以及注册映射文件(即告诉 MyBatis 去哪里加载
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的全局配置文件
${xxx}:占位符,从配置文件获取它的实际值;Spring Boot 环境下,占位符会自动从application.properties读取;纯 MyBatis 环境,需要通过<properties>标签明确指定从哪里读取,我们指明为的db.properties- 加载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
用测试
- 读取全局配置文件:定义配置文件路径,例如
resource = "mybatis-config.xml" - 获取输入流:使用 MyBatis 工具类加载配置,即
InputStream inputStream = Resources.getResourceAsStream(resource) - 构建工厂对象:利用建造者模式,通过
SqlSessionFactoryBuilder().build(inputStream)根据输入流构造出 SqlSessionFactory 对象 - 开启会话:调用工厂方法
sqlSessionFactory.openSession()获取一个 SqlSession 会话对象 - 执行操作:通过 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. 创建 SqlSessionFactory SqlSessionFactory 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); }
原文出处:
Oddpalmer, Mybatis入门手册, https://www.cnblogs.com/oddpalmer/p/19933944

浙公网安备 33010602011771号