将一个库的某张表的数据插入另一个库中的某张表
假设要实现如下sql语句
use pcshop
insert into My_user select * from Test..My_user
以上一节内容为基础
https://blog.youkuaiyun.com/Oceansssss/article/details/122692556
下面介绍两种方法
1.for循环实现(效率低)
- 修改entity包中的MyUser_2类
package com.example.demo.entity.two;
import lombok.Data;
@Data
public class MyUser_2 {
private Integer uid;
private String uname;
private String usex;
}
为方便介绍改成了与MyUser_1一样
其他相关的方法参数也要跟着一起修改
- 在MyUserService中添加接口,MyUserServiceImpl中添加实现方法
public void exportData();
@Override
public void exportData(){
List<MyUser_1> myUser_1 = myUserRepository1.findData_1();
for (int i = 1; i <= myUser_1.size(); i++) {
myUserRepository2.insertData_2(myUser_1.get(i-1).getUid(),myUser_1.get(i-1).getUname(),myUser_1.get(i-1).getUsex());
}
}
- 在MyUserController中添加方法
@RequestMapping("/export")
public String exportData(){
myUserService.exportData();
return "export data successfully";
}
- 运行结果
Test库中的My_user
pcshop库中的My_user
2.foreach实现(效率较高)
- MyUserRepository_2中添加如下
public void insertBatch(List<MyUser_1> list);
- MyUserService中添加
public void insertBatch(List<MyUser_1> list);
- MyUserServiceImpl中添加
@Override
public void insertBatch(List<MyUser_1> list){
myUserRepository2.insertBatch(list);
}
- MyUserMapper_2中添加
<insert id="insertBatch" parameterType="java.util.List">
insert into My_user (uid,uname,usex)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.uid}, #{item.uname},#{item.usex})
</foreach>
</insert>
- MyUserController中添加
@RequestMapping("/insertBatch")
public String Batch(){
myUserService.insertBatch(myUserService.findData_1());
return "insert successfully";
}
- 运行结果
使用foreach虽然效率较高,但是一次传输的数据量有限制
如SQL Server对语句的条数和参数的数量都有限制,分别是 1000 和 2100。所以当数据量过大时需要分批进行插入
作如下修改即可
@Override
public void insertBatch(List<MyUser_1> list){
myUserRepository2.deleteData_2();
int totalNumber=90;
int totalNumberIndex = totalNumber;
for (int index=0;index<list.size();){
if(totalNumberIndex>=list.size()){
totalNumberIndex=list.size();
myUserRepository2.insertBatch(list.subList(index,totalNumberIndex));
break;
}
else {
myUserRepository2.insertBatch(list.subList(index,totalNumberIndex));
index=totalNumberIndex;
totalNumberIndex=index+(totalNumber-1);
}
}
}
对于分批插入可以参考
https://blog.youkuaiyun.com/qq_22194659/article/details/82256602
若出现这种错误可能是因为Mybatis无法对null进行类型转换导致的
解决办法:
给实体类属性中数据类型为Double的指定jdbcType,xml中#{field1, jdbcType=DOUBLE})
参考 https://blog.youkuaiyun.com/qq_24505485/article/details/103573657
3.批处理(效率较高)
public void processBatch(List<MyUser_1> list){
myUserRepository2.deleteData_2();
long start = System.currentTimeMillis();
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
MyUserRepository_2 myNewUserRepository2 = sqlSession.getMapper(MyUserRepository_2.class);
list.stream().forEach(myUser_1 -> myNewUserRepository2.insertData_2(myUser_1));
sqlSession.commit();
sqlSession.clearCache();
System.out.println(System.currentTimeMillis() - start);
}
https://m.jb51.net/article/210089.htm
完整源码
https://download.youkuaiyun.com/download/Oceansssss/78125268
无数据源实现可参考
https://blog.youkuaiyun.com/weixin_42440011/article/details/118611825