开发者学堂课程【SpringBoot 实战教程: 区分多数据源实现(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10802
区分多数据源实现(一)
1、通过包名区分多数据源,数据库使用的是mysql数据库,使用的数据库端框架是 mybatis,需要把 mybatis 和 mysql 架包进行依赖,放到工程中,web 做好依赖。
<!--springboot 集成 mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2、进行两个数据源的配置,先看相对应的数据库,其中一个是db1数据库,操作里面的 users 表,另外一个是 db5 数据库,操作里面的 user 表,两个数据库要配置两个数据源,在全局配置文件中配置,创建file,命名为 application.properties。两个数据源需要写两组。左边属性的名字不一样,在之前配置数据源的属性名,中间增加了 db1,另外一个是 db5,如果用相同的名字,springboot 无法区分,相当于名字属于自定义的,springboot 并不认识这些属性名。
#SpringBoot 整合多数据源
针对于 db1数据库,根据它生成 datasource 数据源对象,需要取到值
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db1.username=root
spring.datasource.db1.password=root
spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1
spring.datasource.db5.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db5.username=root
spring.datasource.db5.password=root
spring.datasource.db5.url=jdbc:mysql://localhost:3306/db5
3、为每个数据源进行相关配置,创建一个包,命名为 com.qianfeng.datasource。
4、针对每一个数据库,配置相应的信息,创建一个 class,命名为 DataSource1。
根据里面的信息创建 DataSource,创建 SqlSessionFactory,创建事务管理器,输入以下代码,进行导入。
@Configuration//注册到Spring容器中
@MapperScan(basePackages="com.qianfeng.db1.mapper",sqlSessionFactoryRef="db1
用来扫描 mapper,不同的数据源操作的 mapper 不一样,所以这里指明了对应的 mapper 所在的包,也就是这个数据源要用com.qianfeng.db1.mapper 的 mapper,同时指明了SessionFactory对象的引用
SqlSessionFactory")
publicclassDataSource1{
//privateDataSource1(){}
/**
*配置 db1数据库
*@return
*/
@Bean(name="db1Datasource")
这个对象用这个名字注入到容器中
@ConfigurationProperties(prefix="spring.datasource.db1")
指定前缀,根据以 db1开头的信息生成数据源对象
Public
DataSource
testDatasource(){
生成数据源 DataSource 对象
Return
DataSourceBuilder.create().build();
}
/**
*创建 SqlSessionFactory需要依赖数据源
*@paramdataSource
*@return
*@throwsException
*/
@Bean(name="db1SqlSessionFactory")
@Primary
publicSqlSessionFactory
testSqlSessionFactory(@Qualifier("db1Datasource")DataSourcedataSource)
throwsException{
SqlSessionFactoryBean
bean=newSqlSessionFactoryBean();
通过FactoryBean创建 SqlSessionFactory
bean.setDataSource(dataSource);
Return
bean.getObject();
最终返回 SqlSessionFactory 对象
}
/**
*配置事务管理
*@paramdataSource
*@return
*/
@Bean(name="db1TransactionManager")
最终创建事务管理器对象的引用,通过 bean 注入到容器中
Public
DataSourceTransactionManager
testTransactionManager(
@Qualifier("db1Datasource")DataSourcedataSource){
依赖数据源,事务来自 connection,connection就在数据源中
Return
new
DataSourceTransactionManager(dataSource);
}
@Bean(name="db1SqlSessionTemplate")
这是对象的引用,把它注入到容器中
Public
SqlSessionTemplate
线程安全对象可以实现数据库操作
testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory")
从db1SqlSessionFactory获取 SqlSessionTemplate对象
SqlSessionFactory
sqlSessionFactory){
封装数据库操作
Return
new
SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages="com.qianfeng.db5.mapper",sqlSessionFactoryRef="db5
SqlSessionFactory")
publicclassDataSource2{
/**
这些都是和数据源相关的配置,所以在 class 上加入注解 Configuration,注册到 spring 容器中。
5、按照这个道理,为另外一个数据源创建 class,命名为 DataSource2。
@Configuration
@MapperScan (basePackages="com. qianfeng. db5. mapper" , sqlSessionFactoryRef="db5SqlSessionFactory
MapperScan
扫描对应 mapper 的包,要创建 mapper 时,包名要和这个一致,后面对应的是 sqlSessionFactory 的引用
public class DataSource2
{
*配置db5数据库
*@return
*/
@Bean(name="db5Datasource")
@ConfigurationProperties(prefix="spring.datasource.db5")
Public
DataSource
testDatasource(){
Return
DataSourceBuilder.create().build();
}
/**
*创建SqlSessionFactory
*@paramdataSource
*@return
*@throwsException
*/
@Bean(name="db5SqlSessionFactory")
Public
SqlSessionFactory
testSqlSessionFactory(@Qualifier("db5Datasource")DataSourcedataSource)
throwsException{
SqlSessionFactoryBean
bean=newSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//如果还有分页等其他事务//bean.setMapperLocations(newPathMatchingResourcePatternResolver().
//getResources("classpath:mybatis/test1/*.xml"));
returnbean.getObject();
}
/**
*配置事务管理
*@paramdataSource
*@return
*/
@Bean(name="db5TransactionManager")
PublicDataSourceTransactionManagertestTransactionManager(
@Qualifier("db5Datasource")DataSourcedataSource){
Return
new
DataSourceTransactionManager(dataSource);
}
@Bean(name="db5SqlSessionTemplate")
publicSqlSessionTemplate
testSqlSessionTemplate(@Qualifier("db5SqlSessionFactory")
SqlSessionFactorysqlSessionFactory){
Return
new
SqlSessionTemplate(sqlSessionFactory);
}
}