springboot整合mybatis+mysql+druid 多个数据源
springboot+mybatis+druid 多数据源
1. 创建maven项目,引入依赖
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.5
mysql
mysql-connector-java
runtime
com.alibaba
druid-spring-boot-starter
1.1.22
2. 配置多数据源
- 配置数据库连接
application.yml
spring:
datasource:
# 数据源1
url: jdbc:mysql://****:3306/dataSourceManagement?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
#数据源2
icp:
url: jdbc:mysql://****:3306/icp_rule?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
-
数据源配置类(druid配置,mybatis配置),通过
@MapperScan(basePackages = "com.example.datasource.mapper",sqlSessionTemplateRef = "primarySqlSessionTemplate")
注解将数据源与mapper文件对应- 数据源1配置类
@Configuration @MapperScan(basePackages = "com.example.datasource.mapper",sqlSessionTemplateRef = "primarySqlSessionTemplate") public class PrimaryDataSourceConfig { /** * 数据源配置 * * @return */ @Bean @ConfigurationProperties(prefix = "spring.datasource") DataSource primaryDs() { // 如果使用 druid 作为连接池,则需要使用DruidDataSourceBuilder return DruidDataSourceBuilder.create().build(); } /** * mybatis配置SqlSessionFactory和SqlSessionTemplate * * @return */ @Bean SqlSessionFactory primarySqlSessionFactory() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(primaryDs()); SqlSessionFactory sqlSessionFactory = null; try { sqlSessionFactory = sqlSessionFactoryBean.getObject(); } catch (Exception e) { e.printStackTrace(); } return sqlSessionFactory; } /** * 创建事务管理器,自定义的数据源,如果不指定事务管理器,@Transitional注解不生效 * * @param * @return */ @Bean(name = "primaryTransactionManager") public DataSourceTransactionManager primaryTransactionManager() { return new DataSourceTransactionManager(primaryDs()); } @Bean SqlSessionTemplate primarySqlSessionTemplate() { return new SqlSessionTemplate(primarySqlSessionFactory()); } }
- 数据源2配置类
@Configuration @MapperScan(basePackages = "com.example.datasource.icpMapper", sqlSessionTemplateRef = "icpSqlSessionTemplate") public class IcpDataSourceConfig { /** * 数据源配置 * * @return */ @Bean @ConfigurationProperties(prefix = "spring.datasource.icp") DataSource icpDs() { // 如果使用 druid 作为连接池,则需要使用DruidDataSourceBuilder return DruidDataSourceBuilder.create().build(); } /** * mybatis配置SqlSessionFactory和SqlSessionTemplate * * @return */ @Bean SqlSessionFactory icpSqlSessionFactory() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(icpDs()); SqlSessionFactory sqlSessionFactory = null; try { sqlSessionFactory = sqlSessionFactoryBean.getObject(); } catch (Exception e) { e.printStackTrace(); } return sqlSessionFactory; } /** * 创建事务管理器,自定义的数据源,如果不指定事务管理器,@Transitional注解不生效 * * @param * @return */ @Bean(name = "icpTransactionManager") public DataSourceTransactionManager icpTransactionManager(@Qualifier("icpDs") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean SqlSessionTemplate icpSqlSessionTemplate() { return new SqlSessionTemplate(icpSqlSessionFactory()); } }
-
完成,接下来编写mapper,数据源1的mapper写在
mapper
目录下,数据源2的mapper写在icpMapper
目录下,再service层注入即可使用@Transactional(rollbackFor = Exception.class, transactionManager = "icpTransactionManager") @Service public class AServiceImpl implements AService { //todo 业务服务类 }