前段时间,与别的厂家进行接口联调时,接口地址的URL、参数、调用方式等信息存放在SQLite数据库里,通过接口地址获取的数据需要保存在 mysql 数据库中,因此需要多数据源的支持。
特此,记录一下[做鬼脸]
美好的一天,从敲代码开始…
首先:
对数据库进行配置,仅涉及重要设置,其余配置不再赘述
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
master: # 主数据源
url: jdbc:sqlite:E:XXXConfigrationMachine.db
username:
password:
driver-class-name: org.sqlite.JDBC
slave: # 从数据源
url: jdbc: MySQL ://ip:port/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
本次主数据源为SQLite,从数据源为MySQL,大家根据具体的场景而定。
然后:
主数据源Java配置类
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.Sql sessionFactory ;
import org. mybatis .spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotat io n.Value;
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;
/**
* @日期: 2020/12/31
* @作者: dd
* @描述: 主数据源
*/@Configuration
@MapperScan(basePackages = MasterSourceConfig.PACKAGE,sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterSourceConfig {
// 精确到 mapper 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.xxx. dao .master";
static final String MAPPER_LOCATION = "classpath:mybatis/*.xml";
@Value("${spring.datasource.master.url}")
private String url;
@Value("${spring.datasource.master.username}")
private String user;
@Value("${spring.datasource.master.password}")
private String password;
@Value("${spring.datasource.master.driver-class-name}")
private String driverClass;
/**
* Primary 注解必须加,表明这是一个主数据源
*/
@Bean(name = "masterDataSource")
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MasterSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
从数据源:java配置类
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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.sql.DataSource;
/**
* @日期: 2020/12/31
* @作者: dd
* @描述: 从数据源
*/@Configuration
@MapperScan(basePackages = SlaveSourceConfig.PACKAGE,sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSourceConfig {
// 精确到 mapper 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.xxx.dao.slave";
static final String MAPPER_LOCATION = "classpath:mybatis/*.xml";
@Value("${spring.datasource.slave.url}")
private String url;
@Value("${spring.datasource.slave.username}")
private String user;
@Value("${spring.datasource.slave.password}")
private String password;
@Value("${spring.datasource.slave.driver-class-name}")
private String driverClass;
@Bean(name = "slaveDataSource")
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SlaveSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
最后:在dao层文件夹下建立master目录和slave目录,主数据源相关接口放置在master中,从数据源接口放置在slave中。
需要特别注意的一点:java配置类里的
static final String PACKAGE = “com.xxx.dao.slave”;
static final String PACKAGE = “com.xxx.dao.master”;
这些包,一定要对应起来,否则会扫描不到。
这样,从service注入不同数据源的mapper时,就可以分别使用不同的数据源啦!
今天的分享就到这里啦,喜欢小编的给个关注[比心]
【公众号】:Java点滴