老系统数据迁移到新系统
业务分析:在最近的工作日常当中接到了一个需求,要求将老系统数据迁移到新开发的系统,一看老系统采用的技术SSH,和现在新系统的技术断层,还有表结构和业务逻辑之间的处理都是需要从头解析,减少对新系统的影响,所以就写了一篇记录日志。
数据库系统
Mysql,但是新系统采用了多个数据库存储;
采用技术
采用Java编写程序实行搬迁效果,因为相对于判断来说,用程序执行会比自己操作要好得多;
框架
SpringBoot
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 很不错的一款工具插件 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- JSON 解析框架 FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
采用easyCode生成基本代码,具体可以看这篇博客
https://blog.csdn.net/qq_39074952/article/details/115370409
保存数据到JSON
效果
编写程序
@Override
public String addMemberType() throws IOException {
long startTime = System.currentTimeMillis();
// 创建线程池读取文件
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
InputStream memberTypeInput = contextClassLoader.getResourceAsStream("medical_member_type.json");
// 文件转换
String memberTypeString = IOUtils.toString(Objects.requireNonNull(memberTypeInput), StandardCharsets.UTF_8);
// 转换为集合
List<MemberType> memberTypes = JSONArray.parseArray(memberTypeString, MemberType.class);
// 新数据集合
List<com.example.transfer.entity.entity.MemberType> memberTypeList = new ArrayList<>();
// 封装到新数据库集合
memberTypes.stream().forEach(
memberType -> {
// 创建会员类型
com.example.transfer.entity.entity.MemberType memberType1 = newMemberType(memberType.getId().toString(), memberType.getName(), memberType.getCreateTime());
memberTypeList.add(memberType1);
}
);
// 批插入语句
int i = memberTypeService.insertBatch(memberTypeList);
long endTime = System.currentTimeMillis();
float excTime=(float)(endTime-startTime)/1000;
log.info("总耗时:{}秒",excTime);
// 关闭
Objects.requireNonNull(memberTypeInput).close();
return "总耗时"+excTime+"秒,插入数据:"+i+"条";
}
public com.example.transfer.entity.entity.MemberType newMemberType(String typeId,String name,String createTime){
Date date = null;
// 支付时间判断
if(StrUtil.isEmpty(createTime)){
date = new Date();
}else{
// hutools组件方法
date = DateUtil.parse(createTime);
}
com.example.transfer.entity.entity.MemberType memberType =
com.example.transfer.entity.entity.MemberType.
builder()
.memberTypeId(typeId)
.memberTypeName(name)
.isDeleted(0)
.memberGrade(1)
.createTime(date)
.updateTime(new Date())
.build();
return memberType;
}
执行批插入之后数据就到了新数据表里面的,注意业务逻辑的处理判断,我这个是最简单的一个表封装,如果是多个表之间关键,注意io流的关闭和stream流之间的管理处理。