个人博客地址
包扫描方式
上文写到的第一种方法aop没有切到父类方法,解决方法也有多种;可以百度搜下;
这篇文章的方案是: 不同的包对应不同的数据源 ;
这种访问的重点就是配置.配置只要对了; 就很简单
step1:配置datasource/mapperscanner/sqlsessionfactory
<font color='red'>注意将原先的@MapperScan注解干掉,下面会自定义</font>
@Bean("sqlServerDS")
@Primary
@ConfigurationProperties(prefix = "sqlserver.datasource")
public DataSource sqlServerDS() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean("mysqlDS")
@ConfigurationProperties(prefix = "mysql.datasource")
public DataSource mysqlDS() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Primary
@Bean
public SqlSessionFactory sqlServerSqlSessionFactory(@Qualifier("sqlServerDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
@Bean
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
@Bean
public MapperScannerConfigurer sqlServerMapperScanner() {
MapperScannerConfigurer sqlServerMapperScanner = new MapperScannerConfigurer();
sqlServerMapperScanner.setSqlSessionFactoryBeanName("sqlServerSqlSessionFactory");
sqlServerMapperScanner.setBasePackage("com.freemud.order.dao.sqlserver");
Properties properties = new Properties();
properties.setProperty("mappers", Mapper.class.getName());
properties.setProperty("notEmpty", "false");
properties.setProperty("IDENTITY", "SqlServer");
sqlServerMapperScanner.setProperties(properties);
return sqlServerMapperScanner;
}
@Bean
public MapperScannerConfigurer mysqlMapperScanner() {
MapperScannerConfigurer sqlServerMapperScanner = new MapperScannerConfigurer();
sqlServerMapperScanner.setSqlSessionFactoryBeanName("mysqlSqlSessionFactory");
sqlServerMapperScanner.setBasePackage("com.freemud.order.dao.mysql");
Properties properties = new Properties();
properties.setProperty("mappers", Mapper.class.getName());
properties.setProperty("notEmpty", "false");
properties.setProperty("IDENTITY", "MySQL");
sqlServerMapperScanner.setProperties(properties);
return sqlServerMapperScanner;
}
step2: 整理自己的代码分层
比如将原先的dao 分为dao.mysql; 和dao.sqlserver; 不同的数据源对应不同的包这样子
step3: 代码使用
本次使用的场景是数据库逐步迁移; 因此做了黑白名单,默认sqlserver; 上了名单走mysql
public BaseResponse queryOrderListByTime(OrderVo vo) {
List<? extends OrderDto> orderDtos ;
if (vo.getDsTypeEnum() == DSTypeEnum.SQLSERVER) {
orderDtos = orderDao.selectByOrderVo(vo);
}else{
orderDtos = mySqlOrderDao.selectByOrderVo(vo);
}
return ResponseUtil.success(orderDtos);
}
注意事项
- 不同的datasource的配置略有不同,比如durid的是url; 而HikariDataSource是jdbc-url
- 项目中原先的@MapperScan要干掉;
- MapperScannerConfigurer这个要注意; 因为代码有一定演示意义在内,实际中如果你继承的不是Mapper;而是自定义的需要加到这里面; 多个就用逗号隔开
网友评论