楼主: 无名者1901
195 0

[其他] MyBatis基础入门《十》Spring Boot 整合 MyBatis:从单数据源到多数据源实战 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

42%

还不是VIP/贵宾

-

威望
0
论坛币
7 个
通用积分
0.0104
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
50 点
帖子
4
精华
0
在线时间
0 小时
注册时间
2018-10-27
最后登录
2018-10-29

楼主
无名者1901 发表于 2025-12-12 11:29:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、快速集成:单数据源配置

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 扫描管理,避免在每个接口重复添加
  • @Mapper
  • 在多数据源环境下,严格区分读写 Mapper 的包路径;
  • 生产环境中关闭
  • log-impl
  • 改用 Logback 等专业日志框架记录 SQL 执行情况;
  • 结合 Druid 或 HikariCP 实现连接池状态监控,提升系统可观测性。

四、功能扩展:集成 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 语句,仅需一行代码即可完成物理分页处理。

五、总结归纳

@Transactional
DataSource
@MapperScan
能力项 Spring Boot + MyBatis 实现方案
单数据源配置
mybatis-spring-boot-starter
+
application.yml
事务管理 由 Spring 统一托管,基于
多数据源支持 配置多个
数据源路由策略 采用分包机制实现读写分离
分页功能 集成 PageHelper Starter 插件
SQL 日志输出
mybatis.configuration.log-impl

核心优势总结:
“零 XML 配置、自动事务管理、无缝整合主流组件、开箱即用,满足生产环境需求!”

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Spring Pring boot RING 基础入门

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-21 20:12