引子
最近项目中,由于数据源更替,部分原来的需要通过REST API获取的数据需要切换成 直接从数据库中获取,所以,需要给项目配置多数据源。在查阅了一些文档后,这里记录下自己亲身实践后的结果,希望能帮到大家。
配置项
下面是在 application.properties 中配置的数据:
# 多数据源配置,数据源一
user.datasource.jdbcUrl=
user.datasource.username=
user.datasource.password=
user.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
user.datasource.read-only=false
user.datasource.maximum-pool-size=20
user.datasource.minimum-idle=1
# 多数据源配置,数据源二
student.datasource.jdbcUrl=
student.datasource.username=
student.datasource.password=
student.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
student.datasource.read-only=false
student.datasource.maximum-pool-size=20
student.datasource.minimum-idle=1
下面是Java配置,主要配置DataSource、SqlSessionFactory、SqlSessionTemplate 三个Bean。
在这里我只给出核心的配置代码,项目的完整代码可参考代码附件。
第一个数据源的配置:
@Configuration
@MapperScan(basePackages = {"com.zereao.multidatasource.mybatis.dao.student"}, sqlSessionTemplateRef = "studentSqlSessionTemplate")
public class StudentDataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "student.datasource")
public DataSource studentDataSource() {
return new HikariDataSource();
}
@Bean
public SqlSessionFactory studentSqlSessionFactory(@Qualifier("studentDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean
public SqlSessionTemplate studentSqlSessionTemplate(@Qualifier("studentSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
第二个数据源的配置:
@Configuration
@MapperScan(basePackages = {"com.zereao.multidatasource.mybatis.dao.user"}, sqlSessionTemplateRef = "userSqlSessionTemplate")
public class UserDataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "user.datasource")
public DataSource userDataSource() {
return new HikariDataSource();
}
@Bean
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean
public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
对比上面两个不同数据源的配置,大家应该就能理解其作用原理了:
在不同的@MapperScan 注解的属性 basePackages 指定的包下,使用不同的 sqlSessionTemplate。
而不同的sqlSessionTemplate在构建时,使用的不同的 sqlSessionFactory;不同的sqlSessionFactory又使用的是不同的数据源(DataSource)。
所以,其最终作用的结果就是:不同的包下的所有Mapper,使用不同的数据源进行查询操作。
代码附件
完整代码:https://download.youkuaiyun.com/download/Zereao/12031372
总结
遇到问题多看看官方文档,还是能学到很多东西的。作者也是在不断学习之中,如果有什么地方没有描述清楚的,欢迎大家指出哦~
参考文档
1、https://mybatis.org/mybatis-3/zh/configuration.html#environments