spring boot+druid+mybatis-plus整合实现多数据源(分包方式)

多数据源的实现方式大致分为注解和分包两种方式,因不希望在每个service都要加注解,故我的项目中选择的是基于分包的方式。

SpringBoot 版本为v2.1.3.RELEASE,Mybatis plus 版本为3.3.2。
  1. 配置文件application.yml
server:
  port: 9003

spring:
  application:
    name: xxx
  datasource:
    druid:
      test1:
        url: jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource  # 下面为连接池的补充设置,应用到上面所有数据源中
        initialSize: 5  # 初始化大小,最小,最大
        maxActive: 20
        minIdle: 5
        maxWait: 60000  # 配置获取连接等待超时的时间
        timeBetweenEvictionRunsMillis: 60000  # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        minEvictableIdleTimeMillis: 30000 # 配置一个连接在池中最小生存的时间,单位是毫秒
        testOnBorrow: false
        testOnReturn: false
        testWhileIdle: true
      test2:
        url: jdbc:mysql://192.168.101.129:3306/db2?characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
        driver-class-name: com.mysql.jdbc.Driver
        initialSize: 5  #初始建立连接数量
        minIdle: 5  #最小连接数量
        maxActive: 20 #最大连接数量
        maxWait: 10000  #获取连接最大等待时间,毫秒
        testOnBorrow: true #申请连接时检测连接是否有效
        testOnReturn: false #归还连接时检测连接是否有效
        timeBetweenEvictionRunsMillis: 60000 #配置间隔检测连接是否有效的时间(单位是毫秒)
        minEvictableIdleTimeMillis: 300000  #连接在连接池的最小生存时间(毫秒)
  1. 数据源配置
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.jst.framework.api.config.MybatisPlusConfig;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.jst.manage.mapper.test01", sqlSessionFactoryRef = "defaultSqlSessionFactory")
public class DataSourceConfig1 {
    // 将这个对象放入Spring容器中
    @Bean(name = "defaultDataSource")
    // 表示这个数据源是默认数据源
    @Primary
    // 读取application.properties中的配置参数映射成为一个对象
    // prefix表示参数的前缀
    @ConfigurationProperties(prefix = "spring.datasource.druid.test1")
    public DataSource getDefaultDateSource() {
//        return DataSourceBuilder.create().build();
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "mybatis-plus.configuration")
    public MybatisConfiguration globalConfiguration(){
        return new MybatisConfiguration();
    }

    @Bean(name = "defaultSqlSessionFactory")
    // 表示这个数据源是默认数据源
    @Primary
    // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
    public SqlSessionFactory defaultSqlSessionFactory(@Qualifier("defaultDataSource") DataSource datasource,MybatisConfiguration config)
            throws Exception {
//        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setConfiguration(config);
        // 设置mybatis的xml所在位置
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:**/mapper/test01/*.xml"));
        return bean.getObject();
    }

    @Bean("defaultTransactionManager")
    @Primary
    public DataSourceTransactionManager defaultTransactionManager(@Qualifier("defaultDataSource") DataSource datasource){
        return new DataSourceTransactionManager(datasource);
    }

    @Bean("defaultSqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary

    public SqlSessionTemplate defaultsqlsessiontemplate(
            @Qualifier("defaultSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

有几个数据源写几个数据库配置

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.jst.manage.mapper.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSourceConfig2 {
    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.test2")
    public DataSource getDateSource2() {
//        return DataSourceBuilder.create().build();
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource)
            throws Exception {
//        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(datasource);

        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath*:**/mapper/test02/*.xml"));
        return bean.getObject();
    }

    @Bean("test2TransactionManager")
    public DataSourceTransactionManager defaultTransactionManager(@Qualifier("test2DataSource") DataSource datasource){
        return new DataSourceTransactionManager(datasource);
    }

    @Bean("test2SqlSessionTemplate")
    public SqlSessionTemplate test2sqlsessiontemplate(
            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

这样在test01包下就会使用默认的数据源,在test02包下就会使用另外的数据源。

  1. 问题
    1. 与druid连接池整合失败:
      添加druid的配置文件,在创建数据源的时候使用DruidDataSourceBuilder
    2. 实现多数据源后mybatis-plus的配置文件失效:
      失效原因是配置多数据源,自定义的sqlsessionFactory不会加载mybatis配置,而单数据源的sqlsessionFactory不是自定义的默认去加载了mybatis配置
      解决:在创建SqlSessionFactory的时候使用MybatisSqlSessionFactoryBean,用代码的方式进行配置,设置到MybatisSqlSessionFactoryBean对象中。

若有不足和错误的地方,欢迎留言指明与交流!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值