application.yml 里面多数据源的配置
spring:
datasource:
db1:
username: XXX
password: XXXX
driver-class-name: com.mysql.jdbc.Driver
url: "jdbc:mysql://XXXX:3306/db1?characterEncoding=utf8"
db2:
username: XXXX
password: XXX
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: "jdbc:sqlserver://XXXX:1433;DatabaseName=db2"
db3:
username: XX
password: XXX
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: "jdbc:sqlserver://XXXXX:1433;DatabaseName=db3"
首先读取数据源配置 然后生成 各自的datasource对象
@Configuration
@Slf4j //lombok
public class MyDataSourceConfigration {
@Primary
@Bean("db1Properties")
@ConfigurationProperties(prefix="spring.datasource.db1")
public DataSourceProperties getDb1DataSourceProperties(){
log.info("------------读取db1的properties----------");
return new DataSourceProperties();
}
@Bean("db1DataSource")
@Primary
public DataSource getDb1DataSource(@Qualifier("db1Properties") DataSourceProperties properties){
log.info("------------生成db1的DataSource----------");
return properties.initializeDataSourceBuilder().build();
}
@Bean("db2Properties")
@ConfigurationProperties(prefix="spring.datasource.db2")
public DataSourceProperties getDb2DataSourceProperties(){
log.info("------------读取db2的properties----------");
return new DataSourceProperties();
}
@Bean("db2DataSource")
public DataSource getDb2DataSource(@Qualifier("db2Properties") DataSourceProperties properties){
log.info("------------生成db2的DataSource----------");
return properties.initializeDataSourceBuilder().build();
}
}
;
标记扫描的mapper位置 并且制定解析的sqlsessiontemplate
注意 :以下写法中是getResources not getResource
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));*
@Configuration
@Slf4j
@MapperScan(basePackages = "com.iebt.myspringboottest.mapper.db1",sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class MybatisDataSourceConfigration {
/**
*
* 生成 sqlsessionfactory
*
*/
@Primary
@Bean("db1SqlSessionFactory")
public SqlSessionFactory getDb1SqlSessionFactory(@Qualifier("db1DataSource") DataSource source) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(source);
sqlSessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
return sqlSessionFactoryBean.getObject();
}
/**
* 生成 sqlsessiontemplate
*/
@Primary
@Bean("db1SqlSessionTemplate")
public SqlSessionTemplate getDb1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory")SqlSessionFactory factory){
return new SqlSessionTemplate(factory);
}
/**
*
* db1 生成事务管理器
*
*/
@Primary
@Bean("db1TransactionMannager")
public DataSourceTransactionManager getDataSourceTransactionMannager(@Qualifier("db1DataSource")DataSource source){
return new DataSourceTransactionManager(source);
}
}
@Configuration
@Slf4j
@MapperScan(basePackages = "com.iebt.myspringboottest.mapper.db2",sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class MybatisDataSourceConfigration2 {
/**
*
* 生成 sqlsessionfactory
*
*/
@Bean("db2SqlSessionFactory")
public SqlSessionFactory getdb2SqlSessionFactory(@Qualifier("db2DataSource") DataSource source) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(source);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
return sqlSessionFactoryBean.getObject();
}
/**
* 生成 sqlsessiontemplate
*/
@Bean("db2SqlSessionTemplate")
public SqlSessionTemplate getdb2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory")SqlSessionFactory factory){
return new SqlSessionTemplate(factory);
}
/**
*
* db2 生成事务管理器
*
*/
@Bean("db2TransactionMannager")
public DataSourceTransactionManager getDataSourceTransactionMannager(@Qualifier("db2DataSource")DataSource source){
return new DataSourceTransactionManager(source);
}
}
后续数据源也是如上的配置即可
需要注意的是 只有一个数据源是primary的
配置好后,启动项目
若出现以下问题可以看下解决方案:
1、
class path resource [classpath*:mapper/db1/.xml] cannot be opened because it does not exist
这个的原因是因为我前边写错了 应该是 new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/.xml"));
not
new PathMatchingResourcePatternResolver().getResource("classpath:mapper/db1/*.xml"));
2、javax.xml.bind.DatatypeConverter
maven导入如下的包即可
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
3、spring boot 启动的时候 有大量的 CONDITIONS EVALUATION REPORT
在你的 application.yml 中或者application.properties 配置
logging:
level:
org:
springframework:
boot:
autoconfigure: ERROR
如果以上都配置好了,那就可以了,启动项目试一下吧。
如果你的springboot 没有配置lombok 可以使用 普通的log属性
或者添加lombok依赖注入
若添加lombok 依赖注入后 启动失败
或者找不到lombok 那可能是idea的bug
需要在如下位置改成以下设置
设置—编译器—共享vm:-Djps.track.ap.dependencies=false
以上配置存在多次重复代码,存在大量冗余,后期有时间再升级一下,今天先记录到这里。