Springboot+MyBatis-Plus+druid多数据源配置实现数据库执行分表数据迁移

最近项目的数据库有单表数据已经超过2千w了,开始进行用mycat分表,就需要把之前的数据重新导入mycat逻辑表中,按着有分表规则依次分散到不同的分表当中。我的操作是部署一个mycat服务并配置好一系列的分表配置,写一个多数据源程序,从原始的数据库链接中读取数据再插入mycat的链接中

参考 mycat 多数据源官方文档

1.application.yml配置文件

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:8066/test
          username: root
          password: XXX
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/test
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver

server:
  port: 8888

2.pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.BUILD-SNAPSHOT</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>dynamic-datasource</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>dynamic-datasource</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<!--多数据源依赖-->
		<dependency>
			<groupId>cn.humingfeng</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			<version>1.3.4</version>
		</dependency>
		<!--mybatis-plus依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.3.2</version>
		</dependency>
		<!--druid连接池依赖 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.22</version>
		</dependency>
		<!--MySQL依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.15</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.11.0</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.10.0</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-jsr310</artifactId>
			<version>2.11.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<releases>
				<enabled>false</enabled>
			</releases>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
		<pluginRepository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<releases>
				<enabled>false</enabled>
			</releases>
		</pluginRepository>
	</pluginRepositories>

</project>

3.代码

先看一下整体结构
在这里插入图片描述
具体是实体类就不说了,主要看service

@Service
@DS("master")
public class MycatImageServiceIml extends ServiceImpl<DicomImageMapper, DicomImage> implements MycatImageService {

}

@Service
@DS("slave")
public class OldImageServiceIml  extends ServiceImpl<DicomImageMapper, DicomImage> implements oldImageService {

}

使用 @DS 切换数据源。
@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称

MycatImageServiceIml 链接的是mycat

OldImageServiceIml 链接的是原始的mysql

我们写一个test

@SpringBootTest
class DynamicDatasourceApplicationTests {

	@Autowired
	private MycatImageService mycatImageService;
	@Autowired
	private oldImageService oldImageService;

	@Test
	void test() {
		QueryWrapper<DicomImage> imagesWrapper = new QueryWrapper<>();
		imagesWrapper.between("create_time", "2020-05-01 00:00:00", "2020-12-31 23:59:59");
		List<DicomImage> imagesList = oldImageService.list(imagesWrapper);//从旧的链接中查出数据

		mycatImageService.saveBatch(imagesList);//插入到mycat链接中


	}

}

能力有限,欢迎留言指教!


版权声明:本文为u010101193原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。