操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL。在SpringBoot中,配置多数据源的方式十分便捷。
文章目录
- 一、pom依赖配置
- 二、application.yml 配置
- 三、Java config配置
一、pom依赖配置
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- MySQL 连接驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
二、application.yml 配置
spring:
datasource:
user:
jdbc-url: jdbc:mysql://111.222.213.88:3306/house1?useUnicode=true&characterEncoding=utf-8
username: root
password: pass
data-cloud:
jdbc-url: jdbc:mysql://111.222.213.99:3306/house2?useUnicode=true&characterEncoding=utf-8
username: root
password: pass
mybatis:
mapper-locations: classpath:/mapper/*.xml
三、Java config配置
1、配置数据源一:
UserDBProperties 读取配置
@Component
@ConfigurationProperties(prefix = "spring.datasource.user")
@Data
public class UserDBProperties {
private String jdbcUrl;
private String username;
private String password;
}
UserDBConfig:
import com.ytx.data.initialization.properties.UserDBProperties;
import com.zaxxer.hikari.HikariDataSource;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import .support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.ytx.data.dao.user", sqlSessionTemplateRef = "userSqlSessionTemplate")
public class UserDBConfig {
@Autowired
private UserDBProperties properties;
@Bean("userDataSource")
@Primary
public HikariDataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(properties.getJdbcUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
dataSource.setConnectionInitSql("SET NAMES utf8mb4");
return dataSource;
}
@Bean("userSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/user/*Mapper.xml"));
return sessionFactory.getObject();
}
@Bean("userTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("userDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean("userSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
2、配置数据源二:
DataCloudDBProperties读取配置
@Component
@ConfigurationProperties(prefix = "spring.datasource.data-cloud")
@Data
public class DataCloudDBProperties {
private String jdbcUrl;
private String username;
private String password;
}
DataCloudDBConfig:
import com.ytx.data.initialization.properties.DataCloudDBProperties;
import com.zaxxer.hikari.HikariDataSource;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import .support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.ytx.data.dao.dataCloud", sqlSessionTemplateRef = "dataCloudSqlSessionTemplate")
public class DataCloudDBConfig {
@Autowired
private DataCloudDBProperties properties;
@Bean("dataCloudDataSource")
public HikariDataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(properties.getJdbcUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
dataSource.setConnectionInitSql("SET NAMES utf8mb4");
return dataSource;
}
@Bean("dataCloudSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataCloudDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/dataCloud/*Mapper.xml"));
return sessionFactory.getObject();
}
@Bean("dataCloudTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("dataCloudDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean("dataCloudSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dataCloudSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
其中将@MapperScan(basePackages = “com.ytx.data.dao.dataCloud”, sqlSessionTemplateRef = “dataCloudSqlSessionTemplate”)的值换成操作数据源相对应mapper的包位置。
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(“classpath:mapper/dataCloud/*Mapper.xml”));修改成数据源对于的mapper.xml文件对应的位置即可。