• SpringBoot集成mybatis分包配置多数据源


    从今天开始我分享一下配置多数据源的多种方式,多维度、动态、多租户定制化配置多种数据源,此篇我们进行SpringBoot集成mybatis分包配置多数据源,这是比较通用的配置方式,大家也容易理解,废话少说我们进入正题!

    1、数据库级数据准备:

    在本地新建两个数据库,名称分别为user_master 和user_slave ,新建一张user表,表结构就是通常的字段,姓名、年龄等,就不细说了。

    2、pom文件核心jar引入:

    1. <!-- spring 依赖 -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. </dependency>
    6. <!-- mybatis 依赖 -->
    7. <dependency>
    8. <groupId>org.mybatis.spring.boot</groupId>
    9. <artifactId>mybatis-spring-boot-starter</artifactId>
    10. <version>2.1.0</version>
    11. </dependency>
    12. <!-- mysql 依赖 -->
    13. <dependency>
    14. <groupId>mysql</groupId>
    15. <artifactId>mysql-connector-java</artifactId>
    16. <scope>runtime</scope>
    17. </dependency>

    3、yml 多个数据源的配置信息:

    1. server:
    2. port: 8090 # 启动端口
    3. spring:
    4. datasource:
    5. masterDb: # 数据源1
    6. jdbc-url: jdbc:mysql://localhost:3306/user_master?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
    7. username: root
    8. password: root
    9. driver-class-name: com.mysql.cj.jdbc.Driver
    10. slaveDb: # 数据源2
    11. jdbc-url: jdbc:mysql://localhost:3306/user_slave?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
    12. username: root
    13. password: root
    14. driver-class-name: com.mysql.cj.jdbc.Driver

    注意:各个版本的 springboot 配置 datasource 时参数有所变化,例如低版本配置数据库 url时用 url 属性,高版本使用 jdbc-url 属性!

    4、服务启动初始化数据源配置:每个库采用一个配置文件处理

      4.1、   主数据源配置:

    1. @Configuration
    2. @MapperScan(basePackages = "com.nandao.multipledatasource.mapper.masterBb", sqlSessionFactoryRef = "db1SqlSessionFactory")
    3. public class MasterDataSourceConfig {
    4. @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源),导致启动服务时会报找不到主数据源的错误
    5. @Bean("db1DataSource")
    6. @ConfigurationProperties(prefix = "spring.datasource.masterBb") //读取application.yml中的配置参数映射成为一个对象
    7. public DataSource getDb1DataSource(){
    8. return DataSourceBuilder.create().build();
    9. }
    10. @Primary
    11. @Bean("db1SqlSessionFactory")
    12. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
    13. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    14. bean.setDataSource(dataSource);
    15. // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
    16. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml"));
    17. return bean.getObject();
    18. }
    19. @Primary
    20. @Bean("db1SqlSessionTemplate")
    21. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
    22. return new SqlSessionTemplate(sqlSessionFactory);
    23. }
    24. }

      4.2、 从数据源配置:

    1. @Configuration
    2. @MapperScan(basePackages = "com.nandao.multipledatasource.mapper.slaveDb", sqlSessionFactoryRef = "db2SqlSessionFactory")
    3. public class SlaveDataSourceConfig {
    4. @Bean("db2DataSource")
    5. @ConfigurationProperties(prefix = "spring.datasource.slaveDb")
    6. public DataSource getDb1DataSource(){
    7. return DataSourceBuilder.create().build();
    8. }
    9. @Bean("db2SqlSessionFactory")
    10. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
    11. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    12. bean.setDataSource(dataSource);
    13. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml"));
    14. return bean.getObject();
    15. }
    16. @Bean("db2SqlSessionTemplate")
    17. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
    18. return new SqlSessionTemplate(sqlSessionFactory);
    19. }
    20. }

    注意事项:
    在 service 层中根据不同的业务注入不同的 dao 层如果是主从复制- -读写分离:比如 masterDb 中负责增删改,slaveDb 中负责查询。但是需要注意的是负责增删改的数据库必须是主库(master).

    到此、最常用的多数据配置分享完毕,此维度业务场景是读写分离的场景,如果是不同的业务配置不同的数据源,也是类似的配置,只不过是业务数据源的名称不同而已,比如两个数据库:user_db、order_db等等,下篇我们从另外一个维度分享多数据源获取,根据请求的类型、用户,判断选用哪个数据源,动态获取,敬请期待!

     

     

  • 相关阅读:
    GIT记录
    软考(高级)是否需要报班,大家有什么建议?
    Win11鼠标动不了 键盘怎么代替鼠标操作
    动态顺序串的基本实现
    【机器学习】阿里云天池竞赛——工业蒸汽量预测(5)
    kafka:大规模实时数据流的必选
    NISP证书有什么用?NISP证书就业方向?
    论文选题分享及思路(一)《基于C51单片机的自动化测量产线的设计》
    PTE-RA总结
    leetcode每天5题-Day54(贪心3)
  • 原文地址:https://blog.csdn.net/nandao158/article/details/128112859