SpringBoot2+Mabatis+Druid多数据源配置
SpringBoot2+Mabatis+Druid多数据源配置在我们的项目终,使用多个数据源的情况极其常见,所以在项目终配置多数据源,并使mybatis自动识别DataSource就变得 尤为重要!
在springboot2.X中,因为删除了RelaxedPropertyResolver 和 RelaxedDataBinder所属的bind包,所以通过AOP注入的方式已经不能注册数据源了,所以我们只能重新撕开其他的办法!下面是具体的实现过程。
2.yaml配置文件4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.6 com.lb demo 0.0.1-SNAPSHOT demo springboot2 project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-data-jdbc org.springframework.boot spring-boot-starter-jdbc org.mybatis.spring.boot mybatis-spring-boot-starter 2.2.0 com.alibaba druid 1.1.23 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
spring:
datasource:
master:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/dw_1?characterEncoding=utf8&useSSL=false&autoReconnect=true
username: root
password: Ssdsj_!&*_RedRcd_77925
diver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/dw_2?characterEncoding=utf8&useSSL=false&autoReconnect=true
username: root
password: Ssdsj_!&*_RedRcd_77925
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
server:
port: 8081
mybatis:
type-aliases-package: com.lb.demo.*
mapper-locations: classpath:mapper
public DataSource getDataSource() {
return DruidDataSourceBuilder.newInstance().getDataSource();
}
@Bean(name="masterSqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")
);
return bean.getObject();
}
@Bean(name="masterTransactionManager")//配置事务
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
package com.lb.demo.config;
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.lb.demo.slaveMapper" ,sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDruidConfig {
@Bean(name="slaveDataSource")
@ConfigurationProperties(prefix="spring.datasource.slave")
public DataSource getDataSource() {
return DruidDataSourceBuilder.newInstance().getDataSource();
}
@Bean(name="slaveSqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")
);
return bean.getObject();
}
@Bean(name="slaveTransactionManager")//配置事务
public DataSourceTransactionManager testTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="slaveSqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
显然,以上配置会让
masterMapper调用master数据库,而slaveMapper则调用slave数据源的数据。



