一、快速集成:单数据源配置
1. 引入 Maven 依赖
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version> <!-- 注意:适配 Spring Boot 3.x -->
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
注意:
- 若使用 Spring Boot 3.x,需引入版本 3.x+ 的相关依赖。
- 若为 Spring Boot 2.x 环境,请将版本降至 2.3.x 使用。
mybatis-spring-boot-starter
2. 配置文件设置
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # XML 文件位置
type-aliases-package: com.charles.entity # 实体类别名包
configuration:
map-underscore-to-camel-case: true # 下划线转驼峰
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印 SQL
3. 创建实体类与 Mapper 接口
// User.java
package com.charles.entity;
public class User {
private Integer id;
private String username;
// getter / setter
}
// UserMapper.java
package com.charles.mapper;
import com.charles.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper // ???? 关键注解!
public interface UserMapper {
User selectById(Integer id);
void insert(User user);
}
Mapper 注册方式(任选其一):
- 在每一个 Mapper 接口上添加注解:
@Mapper
- 或在启动类上统一添加注解(推荐方式,避免重复声明):
@MapperScan("com.charles.mapper")
4. 编写 Service 层并控制事务
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// ? 自动开启事务(默认 REQUIRED)
@Transactional
public void createUser(User user) {
userMapper.insert(user);
// 模拟异常:若此处出错,insert 会回滚
if (user.getUsername().contains("error")) {
throw new RuntimeException("模拟异常");
}
}
public User getUser(Integer id) {
return userMapper.selectById(id); // 只读,无需事务
}
}
提示:Spring 提供的
@Transactional
机制可与 MyBatis 完美配合,无需手动执行提交或回滚操作,事务由容器自动管理。
二、进阶应用:多数据源配置(Multi-DataSource)
场景说明
- 主库(master):处理写操作,如订单创建、用户注册等;
- 从库(slave):承担读操作,例如报表生成、数据查询等。
步骤 1:配置两个独立的数据源
spring:
datasource:
master:
jdbc-url: jdbc:mysql://localhost:3306/master_db
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
jdbc-url: jdbc:mysql://localhost:3306/slave_db
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
注意:Spring Boot 2.7 及以上版本应使用
jdbc-url
而非
url
(HikariCP 连接池的要求)。
步骤 2:定义主从数据源配置类
// MasterDataSourceConfig.java
@Configuration
@MapperScan(
basePackages = "com.charles.mapper.master",
sqlSessionFactoryRef = "masterSqlSessionFactory"
)
public class MasterDataSourceConfig {
@Bean
@Primary // 主数据源
@ConfigurationProperties("spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource ds)
throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryFactoryBean();
factory.setDataSource(ds);
factory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/master/*.xml"));
return factory.getObject();
}
@Bean
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(
@Qualifier("masterSqlSessionFactory") SqlSessionFactory sf) {
return new SqlSessionTemplate(sf);
}
}
// SlaveDataSourceConfig.java(类似,去掉 @Primary,包路径改为 slave)
步骤 3:按功能划分 Mapper 包结构
src/main/java
└── com.charles.mapper
├── master
│ └── UserWriteMapper.java // 写操作
└── slave
└── UserReadMapper.java // 读操作
通过包路径分离读写逻辑,实现写操作访问主库,读操作路由至从库,达成读写分离目标。
三、常见问题与最佳实践
Q1:启动时报错 “No qualifying bean of type 'XXXMapper'”?
原因分析:Mapper 接口未被正确扫描到。
解决方案:检查
@MapperScan
中指定的包路径是否覆盖了所有 Mapper 所在的包。
Q2:事务未生效?
可能原因:
- 被标注的方法不是 public 访问权限;
- 存在内部调用(如 this.method()),导致 AOP 拦截失效;
- 异常被捕获但未向上抛出,事务无法触发回滚。
解决建议:确保使用
@Transactional
注解的方法由外部 Bean 调用,并且运行时抛出 RuntimeException 类型异常以激活事务回滚机制。
最佳实践建议
- 统一在启动类使用
@MapperScan
@Mapper
log-impl
四、功能扩展:集成 PageHelper 分页插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
使用方法:
public List<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return userMapper.selectAll(); // 自动分页
}
优势说明:无需修改原有 SQL 语句,仅需一行代码即可完成物理分页处理。
五、总结归纳
| 能力项 | Spring Boot + MyBatis 实现方案 |
|---|---|
| 单数据源配置 |
+
|
| 事务管理 | 由 Spring 统一托管,基于 |
| 多数据源支持 | 配置多个 |
| 数据源路由策略 | 采用分包机制实现读写分离 |
| 分页功能 | 集成 PageHelper Starter 插件 |
| SQL 日志输出 |
|
核心优势总结:
“零 XML 配置、自动事务管理、无缝整合主流组件、开箱即用,满足生产环境需求!”


雷达卡


京公网安备 11010802022788号







