Mybayis配置多数据源
场景描述:子系统接入用户中心同步用户信息,需操作子系统数据库和用户中心数据库
Mybatis多数据源添加日志打印,开启驼峰
文章目录
技术框架及项目结构
涉及框架:Springboot、Mybatis
涉及数据库:Mysql、Oracle
文件目录:
一、appliaction.properties配置文件
多数据源,配置文件中需配置多个连接信息,注意spring.datasource.one.
jdbc-url
,此处是jdbc-url
非url
#数据源mysql
spring.datasource.one.jdbc-url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8
spring.datasource.one.username=username
spring.datasource.one.password=password
spring.datasource.one.driverClassName = com.mysql.jdbc.Driver
#用户中心数据源,用于同步用户数据
spring.datasource.two.jdbc-url=jdbc:oracle:thin:@ip:port:服务名
spring.datasource.two.username=username
spring.datasource.two.password=password
spring.datasource.two.driverClassName =oracle.jdbc.driver.OracleDriver
#开启日志打印
logging.level.cn.niter.forum.mapper=debug
二、SpringApplication.java
取消mybatis的自动配置,需手动配置数据源
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
MybatisAutoConfiguration.class
})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
二、数据源配置文件.java
1.主数据源
代码如下:
package cn.niter.forum.config;
import lombok.extern.slf4j.Slf4j;
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.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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.annotation.Resource;
import javax.sql.DataSource;
/**
* @author w
*/
@Configuration
@MapperScan(
basePackages = "cn.niter.forum.mapper.primary",
sqlSessionFactoryRef = "sqlSessionFactoryOne"
,
sqlSessionTemplateRef = "sqlSessionTemplateOne"
)
@Slf4j
public class DataSourceOneMapperConfig {
@Primary
@Bean(name = "dataSourceOne")
@ConfigurationProperties(prefix = "spring.datasource.one")
public DataSource dataSource1() {
log.info(">>>>>>>>>>>>>>> masterDataSource config init");
return DataSourceBuilder.create().build();
}
/**
* 此数据源扫描的mapper路径
*/
static final String MAPPER_LOCATION = "classpath:mapper/primary/*.xml";
/**
* 创建SqlSession对象
*
* @return
*/
@Bean(name = "sqlSessionFactoryOne")
public SqlSessionFactory sqlSessionFactoryOne(
@Qualifier("dataSourceOne") DataSource dataSourceOne) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceOne);
//设置mapper配置文件
sqlSessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)
);
//设置驼峰
sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 配置事务
*
* @param dataSourceOne
* @return
*/
@Bean
public DataSourceTransactionManager dataSourceTransactionManagerOne(
@Qualifier("dataSourceOne") DataSource dataSourceOne) {
return new DataSourceTransactionManager(dataSourceOne);
}
/**
* 通过SqlSessionFaction创建SqlSessionTemplate
*
* @return
*/
@Bean(name = "sqlSessionTemplateOne")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("dataSourceOne") DataSource dataSourceOne) {
return new SqlSessionTemplate(sqlSessionFactoryOne(dataSourceOne));
}
}
2.第二个数据源
代码如下:
package cn.niter.forum.config;
import lombok.extern.slf4j.Slf4j;
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.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* @author w
*/
@Configuration
@MapperScan(
basePackages = "cn.niter.forum.mapper.second",
sqlSessionFactoryRef = "sqlSessionFactoryTwo"
, sqlSessionTemplateRef = "sqlSessionTemplateTwo"
)
@Slf4j
public class DataSourceTwoMapperConfig {
@Bean(name = "dataSourceTwo")
@ConfigurationProperties(prefix = "spring.datasource.two")
public DataSource dataSource2() {
log.info(">>>>>>>>>>>>>>> masterDataSource config init");
return DataSourceBuilder.create().build();
}
/**
* 此数据源扫描的mapper路径
*/
static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";
/**
* 创建SqlSession对象
* @return
*/
@Bean(name = "sqlSessionFactoryTwo")
public SqlSessionFactory sqlSessionFactoryTwo(
@Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceTwo);
//设置mapper配置文件
sqlSessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)
);
sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 配置事务
* @param dataSourceTwo
* @return
*/
@Bean
public DataSourceTransactionManager dataSourceTransactionManagerTwo(
@Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
return new DataSourceTransactionManager(dataSourceTwo);
}
/**
* 通过SqlSessionFaction创建SqlSessionTemplate
* @return
*/
@Bean(name = "sqlSessionTemplateTwo")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
return new SqlSessionTemplate(sqlSessionFactoryTwo(dataSourceTwo));
}
}
结语
本文只写了如何配置多数据源。