springboot mybatis plus 多数据源

最近项目上用到多数据源处理,索性就写了一篇博文吧,项目中使用 springboot(2.7.5) 、mybatis plus 、druid

 1、核心项目依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>

2、数据源手动注入虽然是多数据源但是只能有一个是主数据源(config)

order_db数据源

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.ldd.multipledatademo.dao.order.mapper", sqlSessionTemplateRef = "orderSqlSessionTemplate", sqlSessionFactoryRef = "orderSqlSessionFactory")
public class OrderDataSourceConfig {


    @Autowired
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    @Value("${spring.datasource.order.type}")
    private String dataSourceType;

    @Value("${spring.datasource.order.mapperLocations}")
    private String mapperLocations;

    @Value("${spring.datasource.order.typeAliasesPackage}")
    private String typeAliasesPackage;

    @Bean(name = "orderDataSource")
    @Primary // 这里设置了主数据源 其他数据源就不要设置这个了 不然就报错了。。。
    @ConfigurationProperties(prefix = "spring.datasource.order")
    public DataSource dataSource() throws ClassNotFoundException {
        if (StringUtils.isNotEmpty(dataSourceType)) {
            final Class<DataSource> aClass = (Class<DataSource>) Class.forName(dataSourceType);
            return DataSourceBuilder.create().type(aClass).build();
        }
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "orderSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPlugins(mybatisPlusInterceptor);
        if (StringUtils.isNotEmpty(dataSourceType)) {
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            sessionFactory.setMapperLocations(resolver.getResources(mapperLocations));
        }
        if (StringUtils.isNotEmpty(typeAliasesPackage)) {
            sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        }
        return sessionFactory.getObject();
    }

    @Primary
    @Bean(name = "orderTransactionManager")
    public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

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

}

user_db 数据源

package com.ldd.multipledatademo.config;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.ldd.multipledatademo.dao.user.mapper", sqlSessionTemplateRef = "userSqlSessionTemplate", sqlSessionFactoryRef = "userSqlSessionFactory")
public class UserDataSourceConfig {


    @Autowired
    private MybatisPlusInterceptor mybatisPlusInterceptor;


    @Value("${spring.datasource.user.type}")
    private String dataSourceType;

    @Value("${spring.datasource.user.mapperLocations}")
    private String mapperLocations;

    @Value("${spring.datasource.user.typeAliasesPackage}")
    private String typeAliasesPackage;

    @Bean(name = "userDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.user")
    public DataSource dataSource() throws ClassNotFoundException {
        if (StringUtils.isNotEmpty(dataSourceType)) {
            final Class<DataSource> aClass = (Class<DataSource>) Class.forName(dataSourceType);
            return DataSourceBuilder.create().type(aClass).build();
        }
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "userSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPlugins(mybatisPlusInterceptor);
        if (StringUtils.isNotEmpty(dataSourceType)) {
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            sessionFactory.setMapperLocations(resolver.getResources(mapperLocations));
        }
        if (StringUtils.isNotEmpty(typeAliasesPackage)) {
            sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        }
        return sessionFactory.getObject();
    }

    @Bean(name = "userTransactionManager")
    public DataSourceTransactionManager userTransactionManager(@Qualifier("userDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("userSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

mybatis 分页插件 一定别忘记了  不然用mybatis plus 分页不生效哦。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {


    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //数据库类型是MySql,因此参数填写DbType.MYSQL
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

3、yaml配置参考自己根据项目配置,数据库链接池不一样配置也有差异哦:

server.port=8085
spring.application.name=multiple-data-demo
# 这个是我集成swagger 需要的和这个多数据源配置无关的哦。spring.mvc.pathmatch.matching-strategy=ant_path_matcher

# 订单数据源配置 默认主数据源
spring.datasource.order.name=order-web
spring.datasource.order.url=jdbc:mysql://127.0.0.1:3306/order_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.order.username=root
spring.datasource.order.password=root
spring.datasource.order.driver-class=com.mysql.cj.jdbc.Driver
#spring.datasource.order.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.order.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.order.mapperLocations=classpath*:mapper/order/*Mapper.xml
spring.datasource.order.typeAliasesPackage=com.ldd.multipledatademo.dao.order.entity
spring.datasource.order.druid.initialSize=1
spring.datasource.order.druid.minIdle=3
spring.datasource.order.druid.maxActive=20
spring.datasource.order.druid.maxWait=60000
spring.datasource.order.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.order.druid.minEvictableIdleTimeMillis=30000
spring.datasource.order.druid.validationQuery=select 'x'
spring.datasource.order.druid.testWhileIdle=true
spring.datasource.order.druid.testOnBorrow=false
spring.datasource.order.druid.testOnReturn=false
spring.datasource.order.druid.poolPreparedStatements=false
spring.datasource.order.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.order.druid.filters=stat,wall,slf4j
spring.datasource.order.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# user 数据源配置
spring.datasource.user.name=user-web
spring.datasource.user.url=jdbc:mysql://127.0.0.1:3306/user_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.user.username=root
spring.datasource.user.password=root
spring.datasource.user.driver-class=com.mysql.cj.jdbc.Driver
#spring.datasource.user.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.user.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.user.mapperLocations=classpath*:mapper/user/*Mapper.xml
spring.datasource.user.typeAliasesPackage=com.ldd.multipledatademo.dao.user.entity
spring.datasource.user.druid.initialSize=1
spring.datasource.user.druid.minIdle=3
spring.datasource.user.druid.maxActive=20
spring.datasource.user.druid.maxWait=60000
spring.datasource.user.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.user.druid.minEvictableIdleTimeMillis=30000
spring.datasource.user.druid.validationQuery=select 'x'
spring.datasource.user.druid.testWhileIdle=true
spring.datasource.user.druid.testOnBorrow=false
spring.datasource.user.druid.testOnReturn=false
spring.datasource.user.druid.poolPreparedStatements=false
spring.datasource.user.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.user.druid.filters=stat,wall,slf4j
spring.datasource.user.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

最后上链接。GitHub - leehuihui/multiple-data-demo

由于mybatis plus 各个版本有差异 mybatis 分页插件 这个根据各个版本的具体实现去搞了。

如果问题烦请各位看官大佬 不吝指教。


版权声明:本文为u012736401原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。