一、核心原理
-
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 {
@Autowired
private UserMapper userMapper; // 注入动态代理对象
// 通过注解 SQL 查询
public User getUserById(int id) {
return userMapper.getUserById(id);
}
// 通过 XML SQL 查询
public User getUserByName(String name) {
return userMapper.getUserByName(name);
}
// 事务管理示例
@Transactional
public 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 和业务逻辑,框架自动处理底层连接、事务和映射。