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

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

1、数据库级数据准备:

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

2、pom文件核心jar引入:

        <!-- spring 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
         <!-- mybatis 依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
         <!-- mysql 依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

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

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

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

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

  4.1、   主数据源配置:

@Configuration
@MapperScan(basePackages = "com.nandao.multipledatasource.mapper.masterBb", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class MasterDataSourceConfig {

    @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源),导致启动服务时会报找不到主数据源的错误
    @Bean("db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.masterBb") //读取application.yml中的配置参数映射成为一个对象
    public DataSource getDb1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean("db1SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml"));
        return bean.getObject();
    }

    @Primary
    @Bean("db1SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

  4.2、 从数据源配置:

@Configuration
@MapperScan(basePackages = "com.nandao.multipledatasource.mapper.slaveDb", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class SlaveDataSourceConfig {

    @Bean("db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slaveDb")
    public DataSource getDb1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean("db2SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml"));
        return bean.getObject();
    }

    @Bean("db2SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

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

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

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值