在项目实际开发中会使用到不通的数据来源,项目实践总结如下:
第一步:在resources目录下构建application.yml
配置文件,配置两个数据源分别为druid
和show
(具体连接根据自己项目而定)。
server:
port: 8080
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/data?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false
username: root
password: root
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
show:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false
username: root
password: root
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
mapper:
mappers:
- tk.mybatis.mapper.common.Mapper
not-empty: true
identity: MYSQL
#mybatis:
# mapper-locations: classpath:mapper/*.xml
# type-aliases-package: com.xzl.model.entity
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
logging:
level:
com.xzl.mapper: debug
第二步:构建配置文件DruidDataSourceConfig
和ShowDataSourceConfig
,加载两个配置数据源。
1.DruidDataSourceConfig
文件内容
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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = DruidDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "druidSqlSessionFactory")
public class DruidDataSourceConfig {
// 精确到 druid 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.xzl.mapper.druid";
static final String MAPPER_LOCATION = "classpath:mapper/druid/*.xml";
@Value("${spring.datasource.druid.url}")
private String url;
@Value("${spring.datasource.druid.username}")
private String user;
@Value("${spring.datasource.druid.password}")
private String password;
@Value("${spring.datasource.druid.driver-class-name}")
private String driverClass;
@Bean(name = "druidDataSource")
@Primary
public DataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "druidTransactionManager")
@Primary
public DataSourceTransactionManager druidTransactionManager() {
return new DataSourceTransactionManager(druidDataSource());
}
@Bean(name = "druidSqlSessionFactory")
@Primary
public SqlSessionFactory druidSqlSessionFactory(@Qualifier("druidDataSource") DataSource druidDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(druidDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(DruidDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
2.ShowDataSourceConfig
文件内容
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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = ShowDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "showSqlSessionFactory")
public class ShowDataSourceConfig {
// 精确到 show 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.xzl.mapper.show";
static final String MAPPER_LOCATION = "classpath:mapper/show/*.xml";
@Value("${spring.datasource.show.url}")
private String url;
@Value("${spring.datasource.show.username}")
private String user;
@Value("${spring.datasource.show.password}")
private String password;
@Value("${spring.datasource.show.driver-class-name}")
private String driverClass;
@Bean(name = "showDataSource")
@Primary
public DataSource showDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "showTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(showDataSource());
}
@Bean(name = "showSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("showDataSource") DataSource showDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(showDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(ShowDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
第三步:创建上面步骤中配置的数据隔离包和文件夹(MAPPER_LOCATION
和PACKAGE
指定地址文件),项目整体结构如下图:
最后一步:需要注意SpringBoot默认会去开启数据源配置,我们需要在启动类上面加上关闭自动开启的配置。
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
MybatisAutoConfiguration.class})
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
到此结束。