概述
今天公司需要将数据库中的一部分数据库表迁移到另外一个数据库,而我负责的项目需要操作在该更改下需要操作两个数据库。
1. 思路分析
- 单个数据库我们需要一个 DataSource,而 Mybatis 中一个 SqlSessionFactory 对象中只存有一个DataSource 的引用。那么就有两个方案
- 创建两个 SqlSessionFactory 对象。
- 动态切换数据源
这篇博客记录一下方式一。
2. 环境准备
1. spring-boot-starter-web
2. spring-boot-starter-test
3. mysql-connector-java
4. mybatis-spring-boot-starter
5. druid
(*注意:spring-boot 的依赖版本号需要对应)
3. yaml 配置多个数据源
spring:
datasource:
source1:
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jdbcUrl: jdbc:mysql://localhost:3306/order_system?useSSL=false&characterEncoding=UTF8
username: root
password: root
source2:
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jdbcUrl: jdbc:mysql://localhost:3306/order_system2?useSSL=false&characterEncoding=UTF8
username: root
password: root
3.两个数据源的自定义配置
source1的配置:
@Configuration
@MapperScan(basePackages = "com.test.power.mapper.source1", sqlSessionTemplateRef = "source1SqlSessionTemplate")
public class LdgDataSourceConfig {
private static String MAPPER_LOCATIONS = "classpath:com/test/power/mapper/source1/*.xml";
@Bean(name = "source1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.source1")
@Primary
public DataSource ldgDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "source1SqlSessionFactory")
public SqlSessionFactory ldgSqlSessionFactory(@Qualifier("source1DataSource")DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATIONS));
return bean.getObject();
}
@Bean(name = "source1TransactionManager")
public DataSourceTransactionManager ldgTransactionManager(@Qualifier("source1DataSource")DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "source1SqlSessionTemplate")
public SqlSessionTemplate ldgSqlSessionTemplate(@Qualifier("source1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
source2的配置:
@Configuration
@MapperScan(basePackages = "com.test.power.mapper.source2", sqlSessionTemplateRef = "source2SqlSessionTemplate")
public class QldDataSourceConfig {
@Bean(name = "source2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.source2")
@Primary
public DataSource source2DataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "source2SqlSessionFactory")
public SqlSessionFactory source2SqlSessionFactory(@Qualifier("source2DataSource")DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/power/mapper/source2/*.xml"));
return bean.getObject();
}
@Bean(name = "source2TransactionManager")
public DataSourceTransactionManager source2TransactionManager(@Qualifier("source2DataSource")DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
@Bean("source2SqlSessionTemplate")
public SqlSessionTemplate source2SqlSessionTemplate(@Qualifier("source2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.编写 DAO 层
根据数据源的配置类,MapperScan 扫描的包下编写接口,MAPPER_LOCATIONS 对应的包下编写“ *Mapper.xml” 。此处省略…
5. 编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyBatisApplication.class)
public class TestMybatisApplication {
@Autowired
private Source1CategoryMapper source1CategoryMapper;
private Source2CategoryMapper source2CategoryMapper;
/**
* 用于测试:多数据源查询数据库
*/
@Test
public void test() {
source1CategoryMapper.selectByPrimaryKey(5);
source2CategoryMapper.selectByPrimaryKey(5)
}
}
6. 结果
7. 引发提问
- 若不只是简单的查,在之前配置自定义数据源时,有配置事务管理器,该案例中有两个事务管理器,多数据源操作,事务该如何有效控制?
最后
以上就是害怕月饼为你收集整理的Spring Boot + Mybatis 多数据源整合(方式一)的全部内容,希望文章能够帮你解决Spring Boot + Mybatis 多数据源整合(方式一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复