最近项目上用到多数据源处理,索性就写了一篇博文吧,项目中使用 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版权协议,转载请附上原文出处链接和本声明。