最近接触到springboot和mybatis搭配,
上线的时候遇到了双数据源到底怎么使用的问题,
个人选择了一种简答的实现方式,大家可以参考一下:
数据源1:
package com.nox.dsp.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = {"com.nox.dsp.dao1"}, sqlSessionTemplateRef = "sqlSessionTemplate1") public class MybatisDBConfigA { @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource.dsp") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "sqlSessionFactory1") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper1/*.xml")); return bean.getObject(); } @Bean(name = "transactionManager1") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource1") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplate1") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
数据源2:
package com.nox.dsp.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = {"com.nox.dsp.dao2"}, sqlSessionTemplateRef = "sqlSessionTemplate2") public class MybatisDBConfigB { @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.operation") public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "sqlSessionFactory2") public SqlSessionFactory testSqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper2/*.xml")); return bean.getObject(); } @Bean(name = "transactionManager2") public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource2") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplate2") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
分别对应两个dao的包目录和两个mybatis的配置文件的mapper即可
下面是springboot的核心的application的配置:
spring.datasource.dsp.url = jdbc:mysql://XXXX spring.datasource.dsp.username = XXX spring.datasource.dsp.password = XXX spring.datasource.dsp.driver-class-name = com.mysql.jdbc.Driver spring.datasource.operation.url = jdbc:mysql://XXX spring.datasource.operation.username = XXX spring.datasource.operation.password = XXX spring.datasource.operation.driver-class-name = com.mysql.jdbc.Driver
还有需要把springboot启动类中的
//@MapperScan("com.nox.dsp.dao") @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})注解改掉,原来为spring自动加载,这样的方式加载单个数据源没有问题,加载多个数据源无法处理
以上只是实现的比较简单的方式的一种~~~~~~~~~~~~~~~~~~