Spring Boot + MyBatis + Mysql 实现多数据源
说明
- 通过不同的数据源扫描不同的mapper实现
依赖及配置
-
添加依赖 pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
-
application.yml
spring: application: name: test server: address: 127.0.0.1 port: 9090 # mybatis mybatis: mapper-locations: classpath:com/test/mapping/**/*Mapper.xml type-aliases-package: com.test.model.* # 数据源1 datasourceone: jdbc-url: jdbc:mysql://ip:3306/dataone?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false username: xxxx password: xxxx driver-class-name: com.mysql.jdbc.Driver # 数据源2 datasourcetwo: jdbc-url: jdbc:mysql://ip:3306/datatwo?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false username: xxxx password: xxxx driver-class-name: com.mysql.jdbc.Driver
多数据源配置
-
java
package com.test.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * @author xxx * @create 2018/08/06 11:16 * @description 多数据源配置 */ @Configuration public class DataSourceConfig { @Bean(name = "dbOneDataSource") @Primary @ConfigurationProperties(prefix = "datasourceone") public DataSource dbOneDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "dbTwoDataSource") @ConfigurationProperties(prefix = "datasourcetwo") public DataSource dbTwoDataSource() { return DataSourceBuilder.create().build(); } }
mybatis多数据源
-
java
package com.test.config; import lombok.extern.slf4j.Slf4j; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.annotation.Resource; import javax.sql.DataSource; /** * @author xxx * @create 2018/08/06 11:19 * @description mybatis多数据源 */ @Slf4j public class MyBatisConfig { /** * 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建 */ @Configuration @MapperScan(basePackages = {"com.test.mapper.one"}, sqlSessionFactoryRef = "sqlSessionFactoryOne", sqlSessionTemplateRef = "sqlSessionTemplateOne") public static class DBOne { @Resource DataSource dbOneDataSource; @Bean public SqlSessionFactory sqlSessionFactoryOne() throws Exception { log.info("sqlSessionFactoryOne 创建成功。"); SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dbOneDataSource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/mapping/one/*Mapper.xml")); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateOne() throws Exception { SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory return template; } } /** * 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建 */ @Configuration @MapperScan(basePackages = {"com.test.mapper.two"}, sqlSessionFactoryRef = "sqlSessionFactoryTwo", sqlSessionTemplateRef = "sqlSessionTemplateTwo") public static class DBTwo { @Resource DataSource dbTwoDataSource; @Bean public SqlSessionFactory sqlSessionFactoryTwo() throws Exception { log.info("sqlSessionFactoryTwo 创建成功。"); SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dbTwoDataSource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/mapping/two/*Mapper.xml")); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception { SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory return template; } } }
使用
-
java
@Autowired private OneUserMapper oneUserMapper; @Autowired private TwoUserMapper twoUserMapper; @GetMapping("user") public void user() { log.info("user数据迁移开始..."); Long begin = System.currentTimeMillis(); List<OneUser> oneUserList = oneUserMapper.selectAll(); if (oneUserList.size() > 0) { log.info("user源数据数量为:{}", oneUserList.size()); oneUserList.parallelStream() .forEach(oneUser -> { TwoUser twoUser = new TwoUser(); BeanUtils.copyProperties(oneUser, twoUser); int insertOk = twoUserMapper.insert(twoUser); if (insertOk > 0) { log.info("user新数据插入成功,ID:{}", twoUser.getId()); } }); } Long end = System.currentTimeMillis(); log.info("user数据迁移花费时间:{} ms", end - begin); log.info("user数据迁移结束..."); }