一、核心原理
-
Spring Boot 的自动配置
-
通过
mybatis-spring-boot-starter
自动配置DataSource
(连接池)、SqlSessionFactory
和SqlSessionTemplate
。 -
扫描
@Mapper
接口或指定包路径,生成动态代理实现类。
-
-
MyBatis 的核心组件
-
SqlSessionFactory
:生产SqlSession
的工厂,负责加载 MyBatis 配置和映射文件。 -
SqlSession
:封装了 JDBC 操作,通过Executor
执行 SQL。 -
Mapper 接口
:通过动态代理将 Java 方法调用绑定到 XML 或注解中的 SQL。
-
二、Java 示例
1. 项目依赖 (pom.xml
)
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis + Spring Boot 整合 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
2. 数据源配置 (application.properties
)
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml # XML 映射文件路径
mybatis.type-aliases-package=com.example.entity # 实体类包别名
3. 实体类 (User.java
)
package com.example.entity;public class User {private Integer id;private String name;private String email;// Getters and Setters }
4. Mapper 接口 (UserMapper.java
)
package com.example.mapper;import com.example.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select;@Mapper // 标记为 MyBatis Mapper 接口 public interface UserMapper {// 注解方式定义 SQL@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(int id);// XML 方式定义 SQL(见下方 UserMapper.xml)User getUserByName(String name); }
5. XML 映射文件 (resources/mapper/UserMapper.xml
)
<?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="com.example.mapper.UserMapper"><select id="getUserByName" resultType="User">SELECT * FROM user WHERE name = #{name}</select> </mapper>
运行 HTML
6. Service 层 (UserService.java
)
package com.example.service;import com.example.entity.User; import com.example.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;@Service public class UserService {@Autowiredprivate UserMapper userMapper; // 注入动态代理对象// 通过注解 SQL 查询public User getUserById(int id) {return userMapper.getUserById(id);}// 通过 XML SQL 查询public User getUserByName(String name) {return userMapper.getUserByName(name);}// 事务管理示例@Transactionalpublic void updateUser(User user) {// 更新操作(需在 Mapper 中定义 SQL)} }
7. 启动类 (Application.java
)
package com.example;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplication @EnableTransactionManagement // 启用事务管理 public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
三、执行流程
-
启动应用
-
Spring Boot 自动配置
DataSource
和SqlSessionFactory
。 -
扫描
@Mapper
接口,生成动态代理对象。
-
-
方法调用
-
调用
userMapper.getUserById(1)
时,动态代理对象通过SqlSession
执行注解中的 SQL。 -
调用
userMapper.getUserByName("Alice")
时,查找UserMapper.xml
中对应的 SQL。
-
-
事务管理
-
使用
@Transactional
注解的方法由 Spring AOP 代理管理事务。
-
四、关键机制
-
动态代理
MyBatis 通过MapperProxy
为接口生成代理对象,将方法调用映射到 SQL 执行。 -
SQL 解析
-
#{}
使用预编译(防止 SQL 注入),${}
直接拼接 SQL(需谨慎使用)。
-
-
事务整合
Spring 的DataSourceTransactionManager
管理 MyBatis 的数据库操作,确保事务一致性。
五、常见问题
-
Mapper 接口未找到
-
确保使用
@Mapper
或@MapperScan("com.example.mapper")
扫描接口。
-
-
XML 文件未加载
-
检查
mybatis.mapper-locations
配置路径是否匹配。
-
-
事务不生效
-
确保启动类添加
@EnableTransactionManagement
,并在方法上使用@Transactional
。
-
通过上述示例和原理,Spring Boot 与 MyBatis 实现了简洁高效的数据库操作,开发者只需关注 SQL 和业务逻辑,框架自动处理底层连接、事务和映射。