前言
Spring Boot项目使用Mybatis,既要从上游系统同步数据,又要操作本系统的数据库,所以需要引入双数据源,配置Mybatis
步骤
一、配置双数据源,连接数据库
1、禁用Spring Boot数据源的自动装配,在启动类@SpringBootApplication注解添加exclude = {DataSourceAutoConfiguration.class}
@SpringBootApplication(scanBasePackages = {"com.linkus"}, exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
2、application.properties配置文件添加两个数据源配置
ora.datasource.driverClassName=oracle.jdbc.OracleDriver
ora.datasource.url=jdbc:oracle:thin:@ip:port:db
ora.datasource.username=xxx
ora.datasource.password=xxx
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://ip:port/db
spring.datasource.username=xxx
spring.datasource.password=xxx
3、添加oracle数据源配置类PrimaryDataSourceConfig,下面的pg数据源配置类DmpDataSourceConfig,添加对应数据源的bean
PrimaryDataSourceConfig
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "ora.datasource")
public DataSource oraDataSource() {
return DruidDataSourceBuilder.create().build();
}
DmpDataSourceConfig
@Bean(name = "dmpDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
两个数据源添加完成
二、配置两个Mybatis
1、禁用Myabtis自动装配,启动类@SpringBootApplication注解添加exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class}
2、在application.properties配置文件添加两个Mybatis的配置和对应的配置类
主数据源的mybatis配置
# mybatis mapper.xml路径
ora.datasource.extend.mybatisMapperLocations=classpath*:mapper/crm/*.xml
主数据源的配置类
@Configuration
@ConfigurationProperties(prefix = "ora.datasource.extend")
public class PrimaryMybatisProperties {
private String mybatisMapperLocations;
public String getMybatisMapperLocations() {
return mybatisMapperLocations;
}
public void setMybatisMapperLocations(String mybatisMapperLocations) {
this.mybatisMapperLocations = mybatisMapperLocations;
}
}
数据源2的配置
# mybatis mapper.xml路径
spring.datasource.extend.mybatisMapperLocations=classpath*:mapper/dmp/*.xml
数据源2的配置类
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.extend")
public class DmpMybatisProperties {
private String mybatisMapperLocations;
public String getMybatisMapperLocations() {
return mybatisMapperLocations;
}
public void setMybatisMapperLocations(String mybatisMapperLocations) {
this.mybatisMapperLocations = mybatisMapperLocations;
}
}
3、配置两个Mybatis的SqlSessionFactory
@Configuration
@MapperScan(basePackages = {“com.linkus.abp.mapper.crm”}, sqlSessionFactoryRef = “primarySqlSessionFactory”)
@Slf4j
public class PrimaryDataSourceConfig {
@Autowired
private PrimaryMybatisProperties properties;
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "ora.datasource")
public DataSource oraDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(this.properties.getMybatisMapperLocations()));
log.info("config primarySqlSessionFactory success.");
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
log.error("config primarySqlSessionFactory failed.", e);
e.printStackTrace();
}
return null;
}
@Bean(name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Configuration
@MapperScan(basePackages = {"com.linkus.abp.mapper.crm"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
@Slf4j
public class PrimaryDataSourceConfig {
@Autowired
private PrimaryMybatisProperties properties;
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "ora.datasource")
public DataSource oraDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(this.properties.getMybatisMapperLocations()));
log.info("config primarySqlSessionFactory success.");
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
log.error("config primarySqlSessionFactory failed.", e);
e.printStackTrace();
}
return null;
}
@Bean(name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Configuration
@MapperScan(basePackages = {"com.linkus.abp.mapper.dmp"}, sqlSessionFactoryRef = "dmpSqlSessionFactory")
@Slf4j
public class DmpDataSourceConfig {
@Autowired
private DmpMybatisProperties property;
@Bean(name = "dmpDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dmpSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dmpDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(this.property.getMybatisMapperLocations()));
log.info("config dmpSqlSessionFactory success.");
return sessionFactory.getObject();
} catch (Exception e) {
log.error("config dmpSqlSessionFactory failed.", e);
e.printStackTrace();
}
return null;
}
@Bean(name = "dmpSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dmpSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "dmpTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("dmpDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}@Configuration
@MapperScan(basePackages = {"com.linkus.abp.mapper.dmp"}, sqlSessionFactoryRef = "dmpSqlSessionFactory")
@Slf4j
public class DmpDataSourceConfig {
@Autowired
private DmpMybatisProperties property;
@Bean(name = "dmpDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dmpSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dmpDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(this.property.getMybatisMapperLocations()));
log.info("config dmpSqlSessionFactory success.");
return sessionFactory.getObject();
} catch (Exception e) {
log.error("config dmpSqlSessionFactory failed.", e);
e.printStackTrace();
}
return null;
}
@Bean(name = "dmpSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dmpSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "dmpTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("dmpDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}@Configuration
@MapperScan(basePackages = {"com.linkus.abp.mapper.dmp"}, sqlSessionFactoryRef = "dmpSqlSessionFactory")
@Slf4j
public class DmpDataSourceConfig {
@Autowired
private DmpMybatisProperties property;
@Bean(name = "dmpDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dmpSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dmpDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(this.property.getMybatisMapperLocations()));
log.info("config dmpSqlSessionFactory success.");
return sessionFactory.getObject();
} catch (Exception e) {
log.error("config dmpSqlSessionFactory failed.", e);
e.printStackTrace();
}
return null;
}
@Bean(name = "dmpSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dmpSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "dmpTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("dmpDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
两个Mybatis配置完可以工作了,如果需要分页还要配置两个Mybatis的分页