写在开篇
Spring boot 最大的特点就是简化开发(去xml配置)。故这篇所实现的也是配置些注解,并无大量的xml配置。
外甥打灯笼--照旧上代码
依赖:其他依赖省去。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
数据源配置:多数据源配置要求必须有一个主配置,多个辅配置
/**
* Created by echo on 2017/3/21.
*/
@Configuration
@ComponentScan(basePackageClasses = DalModule.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.one", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class DalModule {
@Value("${demo-one.db-driver}")
private String driver;
@Value("${demo-one.db-url}")
private String jdbcUrl;
@Value("${demo-one.db-username}")
private String dbUser;
@Value("${demo-one.db-password}")
private String dbPassword;
@Bean(name = "oneDataSource")
@Primary
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(driver);
hikariConfig.setJdbcUrl(jdbcUrl);
hikariConfig.setUsername(dbUser);
hikariConfig.setPassword(dbPassword);
hikariConfig.setPoolName("springHikariCP");
hikariConfig.setAutoCommit(false);
hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");
hikariConfig.setMinimumIdle(1);
hikariConfig.setMaximumPoolSize(20);
hikariConfig.setConnectionInitSql("SELECT 1");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
@Bean
@Primary
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean("demo-one")
@Primary
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
@Bean(name = "oneSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource) throws Exception {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(oneDataSource);
sessionFactory.setFailFast(true);
sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/one/*Mapper.xml"));
return sessionFactory.getObject();
}
说明:
@Configuration:自动配置。等同于spring的xml配置文件。
@Value:注入 springBoot的application.properties配置的属性值
@MapperScan:指定要扫描的Mapper类的包路径。
@Primary:注解的实例 优先其他实例被注入。
副配置
@Configuration
@ComponentScan(basePackageClasses = DalModuleTwo.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.two", sqlSessionFactoryRef = "twoSqlSessionFactory")
public class DalModuleTwo {
@Value("${demo-two.db-driver}")
private String driver;
@Value("${demo-two.db-url}")
private String jdbcUrl;
@Value("${demo-two.db-username}")
private String dbUser;
@Value("${demo-two.db-password}")
private String dbPassword;
@Bean(name = "twoDataSource")
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(driver);
hikariConfig.setJdbcUrl(jdbcUrl);
hikariConfig.setUsername(dbUser);
hikariConfig.setPassword(dbPassword);
hikariConfig.setPoolName("springHikariCP");
hikariConfig.setAutoCommit(false);
hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");
hikariConfig.setMinimumIdle(1);
hikariConfig.setMaximumPoolSize(20);
hikariConfig.setConnectionInitSql("SELECT 1");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean("demo-two")
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
@Bean(name = "twoSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("twoDataSource") DataSource twoDataSource) throws Exception {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(twoDataSource);
sessionFactory.setFailFast(true);
sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/two/*Mapper.xml"));
return sessionFactory.getObject();
}
和主配置的区别:
1、少了@Primary这个注解
2、sqlSessionFactory的名称区别开
3、mapper.xml的路径 区别开
4、mapperScan 扫描包地址 区别开
数据源配置
demo-one:
db-driver: com.mysql.jdbc.Driver
db-url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8
db-username: root
db-password: root
demo-two:
db-driver: com.mysql.jdbc.Driver
db-url: jdbc:mysql://127.0.0.1:3306/demoTwo?useUnicode=true&characterEncoding=utf8
db-username: root
db-password: root
项目结构图:
总结说明:
1、配置简单:
a、application.properties配置多个数据源
b、配置多个数据库连接池(必须有一主@Primary)
c、注意不同数据库的表mapper、dao、xml对象存放不同路径
2、不影响开发流程:
a、不用在调用mapper处指定数据源。
b、业务开发流程不变。controller->service->serviceImpl->repository->repositoryImpl->mapper->xml