MySql 及MyBatis数据的批量操作

2023-11-04

1、Mybatis操作

1、批量更新

  <update id="updateCtcc" parameterType="java.util.List">
        update ctcc set scan=1 where id in
        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
            ${item.id}
        </foreach>
    </update>

以上是批量更新的正确方式,测试下来80000条数据只需要不到一分钟
而使用case when方式就卡住不动了,如下:

 <update id="updateCtccCase" parameterType="java.util.List">
        update ctcc
        set scan =
        <foreach collection="list" item="item" index="index"
                 separator=" " open="case ID" close="end">
            when id=#{item.id} then 1
        </foreach>
    </update>

还有一种方式,单条更新,如下:

    <update id="updateCtcc" parameterType="java.util.Map">
             separator=";" 代表着每次循环完,在sql后面放一个分号
             item="xml" 循环List的每条的结果集
             collection="list" list 即为 map传过来的参数key -->
        <foreach collection="list" separator=";" item="cus">
            update ctcc set
            scan = 1
            where id = #{xml.id}
        </foreach>
    </update>

这种方式操作下来会报错,不知道为啥,至于报的什么错误,已经记不得了

2、批量处理

1、批量插入两种方式

<insert id="insertBatch">
    INSERT INTO persons
            (id, name, sex)
    VALUES
    <foreach collection ="list" item="user" separator =",">
         (#{user.id}, #{user.name}, #{user.sex})
    </foreach >
</insert>

mybatis三种批量插入方式对比

文件导入
jdbc批处理

绝对干货,教你4分钟插入1000万条数据到mysql数据库表

JAVA向Mysql插入亿级别数据—测评

关于批量插入数据之我见(100万级别的数据,mysql)

MySQL大数据量分页查询方法及其优化

字符串截取
MySQL字符串函数substring:字符串截取

Incorrect string value: ‘\xE5\x8C\x97\xE4\xBA\xAC’ for column

通过把输入值赋予一个用户变量,同时不把变量赋予表中的列,来丢弃此输入值:

LOAD DATA INFILE 'file.txt'  
  INTO TABLE t1  
  (column1, @dummy, column2, @dummy, column3); 

这样file.txt中的第二列和第四列不被导入到t1表中
https://blog.csdn.net/etimechen/article/details/50521636

  String esquel = " LOAD DATA LOCAL INFILE '" + path +
                "' INTO TABLE rp_cre_data_mobile_track_ctcc_copy " +
                " FIELDS TERMINATED BY ',' ENCLOSED BY \'\"'" +
                " LINES TERMINATED BY \'\\n\' (mobile_id,secret_mobile,create_time,mark,test)";
        jdbcTemplate.update(esquel);
public void loadDataFromJava(final List<TrackTest> urlList) {
        String sql = "insert into rp_cre_data_mobile_track_ctcc_copy(mobile_id,secret_mobile,create_time,mark,test) values(?,?,?,?,?)";
        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                long mobileId = urlList.get(i).getMobileId();
                String secret_mobile = urlList.get(i).getMmd5();
                long createTime = urlList.get(i).getCreateTime();
                int mark = urlList.get(i).getMark();
                int test = urlList.get(i).getTest();
                ps.setLong(1, mobileId);
                ps.setString(2, secret_mobile);
                ps.setLong(3, createTime);
                ps.setInt(4, mark);
                ps.setInt(5, test);
            }

            public int getBatchSize() {
                return urlList.size();
            }
        });
    }
   
public static void insert() {
        Connection conn = null;
        PreparedStatement pstm = null;
        // 开时时间
        Long begin = new Date().getTime();
        try {
            //加载jdbc驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接mysql
            conn = DriverManager.getConnection(url, user, password);
            // sql前缀
            String prefix = "INSERT INTO rp_cre_data_mobile_track_ctcc(mobile_id,mmd5,create_time,mark,test) VALUES";

            // 保存sql后缀
            StringBuffer suffix = new StringBuffer();
            // 设置事务为非自动提交
            conn.setAutoCommit(false);
            // Statement st = conn.createStatement();
            // 比起st,pst会更好些
            PreparedStatement pst = conn.prepareStatement("");
            // 外层循环,总提交事务次数
            long unixTime = System.currentTimeMillis() / 1000L;

            for (int i = 1; i <= 100; i++) {
                // 第次提交步长   SYSDATE(),
                long bTime = System.currentTimeMillis();
                for (int j = 1; j <= 100000; j++) {
                    // 构建sql后缀
                    String result = "(" + j * i + ", '"+Utils.MD5(j * i + "#6s3k")+"', "+unixTime + ",0,1),";
                    suffix.append(result);
                }
                // 构建完整sql
                String sql = prefix + suffix.substring(0, suffix.length() - 1);

                // 添加执行sql
                pst.addBatch(sql);
                // 执行操作
                pst.executeBatch();
                // 提交事务
                conn.commit();
                long aTime = System.currentTimeMillis();
                System.out.println("成功插入第" + i * 10 + "W条数据耗时:" + (aTime - bTime));

                // 清空上一次添加的数据
                suffix = new StringBuffer();
            }
            // 头等连接
            pst.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        // 结束时间
        Long end = new Date().getTime();
        // 耗时
        System.out.println("cast : " + (end - begin) / 1000 + " s");
    }

以上也可以改成这样

 String sql = "insert into rp_cre_data_mobile_track_ctcc(mobile_id,mmd5,create_time,mark,test) values(?,?,?,?,?)";
            //预编译sql
            pstm = conn.prepareStatement(sql);
            //开始总计时
            long bTime1 = System.currentTimeMillis();

            //循环500次,每次十万数据,一共5000万
            for (int i = 0; i < 500; i++) {

                //开启分段计时,计1W数据耗时
                long bTime = System.currentTimeMillis()/ 1000L;
                //开始循环
                while (begin < end) {
                    //赋值
                    pstm.setLong(1, (i+1)*begin);
                    pstm.setString(2, Utils.MD5((i+1)*begin + "#6s3k"));
                    pstm.setLong(3, bTime);
                    pstm.setInt(4, 0);
                    pstm.setInt(5, 1);
                    //添加到同一个批处理中
                    pstm.addBatch();
                    begin++;
                }
                //执行批处理
                pstm.executeBatch();
//                //提交事务
                conn.commit();
                //边界值自增10W
                end += 100000;
                //关闭分段计时
                long eTime = System.currentTimeMillis()/ 1000L;
                //输出
                System.out.println("成功插入第" + (i + 1) * 10 + "W条数据耗时:" + (eTime - bTime));
            }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySql 及MyBatis数据的批量操作 的相关文章

随机推荐

  • Java Excel导出复杂excel表格样式之ExcelUtil工具类

    Java Excel导出包括普通导出及复杂表格样式 主要是对于需要进行行列合并的列进行特殊处理 计算清楚起始行 结束行 起始列 结束列 普通导出可以是所有列 也可以是包含某些列 或者排除某些列 1 效果图 2 原理 如对于上图中的覆盖能力
  • java 文件拷贝的四种方式

    1 java 移动文件的方式有几种 在 Java 中 可以使用多种方法来移动文件 使用 java nio file Files 类的 move 方法 import java nio file Files import java nio fi
  • 1. AJAX: 2. JSON

    内容 1 AJAX 2 JSON AJAX 1 概念 ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1 异步和同步 客户端和服务器端相互通信的基础上 客户端必须等待服务器端的响应 在
  • Android RecyclerView实现树形列表

    前段时间公司有个项目 需要展示客户关系的树形列表 当时网上找了一些资料 有些觉得挺复杂的 有些测试下来有bug 最终决定自己解决 最底下有demo 需要源码的同学可以下载 效果图 带节点的展开与收缩 并且可以实现项的单选 选中项字体为蓝色
  • Mac office 字体和字号显示问题

    Sierra英文的操作系统 word的没有常见的 宋体 等字体选项 而且字号的单位只有磅数 这时可以通过修改word默认的编辑语言解决 打开word的偏好设置 点击 East Asian Language 选择下拉菜单中的中文选项 重启之后
  • UPF learning4: supply power network 相关

    Supply network包含了下面3种元素 supply nets 电线 supply ports 插座 和power switch 开关 create supply port 创建一根电源 create supply net 创建一根
  • android 启动过程中如何清理cache,android 开发过程中涉及到的清除缓存操作

    标签 android 开发过程中会遇到很多缓存 常常使人摸不清楚 这里总结一下 希望下次遇到缓存相关问题能有所帮助 Clean Project 在这里插入图片描述 其中执行 clean 时会找到根项目和所有子项目的 clean task 所
  • 通过Maven命令创建Web项目

    1 创建Web项目 mvn archetype create DgroupId com demo 项目组标识 DartifactId omss 项目名称 DarchetypeArtifactId maven archetype webapp
  • 火爆全网的chat GPT 在煤矿智能问答方面的应用

    测试了19个煤矿智能化 综采方面的问题 甚至会自己写代码 看看chatGPT表现如何 什么是智能化煤矿 什么是记忆割煤 目前记忆割煤都存在哪些问题 煤矿数字孪生技术可以用哪些开源的应用来实现 智能化煤矿未来可以发展到什么程度 提供煤矿智能化
  • git仓库规范

    多人协作 项目名称 demo 我的名字 kk 1 前置概念 主目录 develop 开发目录 dev 主分支 develop demo 开发分支 dev demo kk 2 主目录 develop 该目录下可以有很多项目的分支 dev目录下
  • AI三大主义:符号主义、联结主义、行为主义

    一 符号主义 symbolicism 符号主义 symbolicism 逻辑主义 Logicism 心理学派 Psychlogism 计算机学派 Computerism 其原理主要为物理符号系统 即符号操作系统 假设和有限合理性原理 早期的
  • 【C#基础详解】(十四)面向对象 继承

    面向过程 优点 性能比面向对象高 因为类调用时需要实例化 开销比较大 比较消耗资源 比如单片机 嵌入式开发 Linux Unix等一般采用面向过程开发 性能是最重要的因素 缺点 没有面向对象易维护 易复用 易扩展 面向对象 面向对象的三个核
  • Zabbix安装时出现缺少PHP模块,解决过程

    我在安装时PHP缺少gettext模块和bcmath模块 一下为解决步骤 1 进入到PHP源码包目录下的ext目录 cd soft php 5 3 13 ext 2 会看到ext目录下有gettext目录和bcmath目录 3 进入gett
  • 对称二叉树

    这是蒟蒻认真写的第一篇题解 如有欠缺 请理解 题目描述 一棵有点权的有根树如果满足以下条件 则被轩轩称为对称二叉树 1 二叉树 2 将这棵树所有节点的左右子树交换 新树和原树对应位置的结构相同且点权相等 下图中节点内的数字为权值 节点外的
  • 下载google code中源码的几个工具

    Google code 一般以三种命令行方式提供源代码 格式如下 plain view plain copy hg clone https code google com p xxx git clone https code google
  • redis中批量删除key

    1 删除所有的key 可以使用redis自身的命令 flushdb 删除当前数据库中的所有Key flushall 删除所有数据库中的key 2 使用linux中的xargs来删除所有的key redis cli keys xargs re
  • 【R】【线性回归分析实验】

    文章目录 实验思维导图 1 收集 探索和准备数据 1 1 收集数据 1 2 探索和准备数据 2 基于数据训练模型 2 1 使用线性回归函数 2 2 建立模型 3 评估模型的性能 4 提高模型的性能 4 1 将年龄非线性化 4 2 数值转换二
  • 愉快地使用你的 Git Bash 工具

    在windows下使用git时自然会用到Git Bash 下面我分享一些Git Bash的使用技巧 欢迎补充 官方下载地址 http msysgit github io 设置初始路径 默认的 Git Bash 初始路径为安装目录 每次打开都
  • mvc三层架构

    三层架构是指 视图层View 业务逻辑层Service 持久层DAO View层 用于接收用户提交请求的代码 Service层 系统的业务逻辑主要在这里完成 DAO层 直接操作数据库的代码 主要是做数据持久层的工作 扩展 MVC指MVC模式
  • MySql 及MyBatis数据的批量操作

    1 Mybatis操作 1 批量更新