使用Springboot+MyBatis实现配置多个数据源
一.前言
工作中可能在一个项目中使用多个数据库中的数据,那么如何在一个项目中配置多个数据源,实现在多个数据库中动态切换呢?
二.正文
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
需要引入jdbc,mybatis和mysql的依赖。
2.配置文件
spring:
datasource:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/dcp1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
username: root
password: 123123
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/dcp2?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
username: root
password: 123456
将两个数据库连接地址,账号,密码等信息配置。(注:高版本的springboot2.6.1版本之后的连接属性由url变成jdbc—url)
@Component
@MapperScan(basePackages = "com.xxx.xxx.mapper.dispatchDB", sqlSessionFactoryRef = "factoryOne")
public class DataBaseOneConfig {
/**
@Primary 表示主数据源,未指定使用哪个数据源时默认使用
@ConfigurationProperties 表示从配置文件中获取值, prefix 表示前缀匹配
*/
/**
* 注入 数据源1
*/
@Bean(name = "DataSourceOne")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource getDateSourceOne() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration globalConfiguration() {
return new org.apache.ibatis.session.Configuration();
}
/**
* 注入 mybatis 的 sqlSessionFactory
* 设置 数据源 与 xml 路径
*/
@Bean(name = "factoryOne")
@Primary
public SqlSessionFactory sqlSessionFactoryOne(@Qualifier("DataSourceOne") DataSource datasource,
org.apache.ibatis.session.Configuration configuration) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
// 设置数据源
bean.setDataSource(datasource);
bean.setConfiguration(configuration);
// 设置 mybatis 的 xml 所在位置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/dispatchDB/*.xml"));
return bean.getObject();
}
}
数据源配置1(DataSourceOne)
@Component
@MapperScan(basePackages = "com.xxx.xxx.mapper.gridDB", sqlSessionFactoryRef = "factoryTwo")
public class DataBaseTwoConfig {
/**
@Primary 表示主数据源,未指定使用哪个数据源时默认使用
@ConfigurationProperties 表示从配置文件中获取值, prefix 表示前缀匹配
*/
/**
* 注入 数据源2
*/
@Bean(name = "DataSourceTwo")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource getDateSourceTwo() {
return DataSourceBuilder.create().build();
}
/**
* 注入 mybatis 的 sqlSessionFactory
* 设置 数据源 与 xml 路径
*/
@Bean(name = "factoryTwo")
public SqlSessionFactory sqlSessionFactoryOne(@Qualifier("DataSourceTwo") DataSource datasource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
// 设置数据源
bean.setDataSource(datasource);
// 设置 mybatis 的 xml 所在位置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/gridDB/*.xml"));
return bean.getObject();
}
}
数据源配置1(DataSourceTwo)
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(HomewifiAuthDatasenderApplication.class, args);
}
}
需要在启动类上添加注解@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})取消数据源默认加载。