SpringBoot整合Mybatis连接SQL Server (4) 跨库批量插入

将一个库的某张表的数据插入另一个库中的某张表

假设要实现如下sql语句

use pcshop
insert into My_user select * from Test..My_user

以上一节内容为基础
https://blog.csdn.net/Oceansssss/article/details/122692556
下面介绍两种方法

1.for循环实现(效率低)

  1. 修改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一样
其他相关的方法参数也要跟着一起修改

  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());

        }
    }
  1. 在MyUserController中添加方法
    @RequestMapping("/export")
    public String exportData(){
        myUserService.exportData();
        return "export data successfully";
    }
  1. 运行结果

Test库中的My_user

在这里插入图片描述

pcshop库中的My_user
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.foreach实现(效率较高)

  1. MyUserRepository_2中添加如下
public void insertBatch(List<MyUser_1> list);
  1. MyUserService中添加
    public void insertBatch(List<MyUser_1> list);
  1. MyUserServiceImpl中添加
    @Override
    public void insertBatch(List<MyUser_1> list){
        myUserRepository2.insertBatch(list);
    }
  1. 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>
  1. MyUserController中添加
    @RequestMapping("/insertBatch")
    public String Batch(){
        myUserService.insertBatch(myUserService.findData_1());
        return "insert successfully";
    }
  1. 运行结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    使用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.csdn.net/qq_22194659/article/details/82256602
在这里插入图片描述
若出现这种错误可能是因为Mybatis无法对null进行类型转换导致的
解决办法:
给实体类属性中数据类型为Double的指定jdbcType,xml中#{field1, jdbcType=DOUBLE})
参考 https://blog.csdn.net/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.csdn.net/download/Oceansssss/78125268

无数据源实现可参考
https://blog.csdn.net/weixin_42440011/article/details/118611825

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身都是月儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值