我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Mybatis的Batch Insert Support实现批量插入

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Mybatis的Batch Insert Support实现批量插入

这篇文章主要介绍了如何使用Mybatis的Batch Insert Support实现批量插入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Mybatis的Batch Insert Support实现批量插入文章都会有所收获,下面我们一起来看看吧。

Batch Insert Support 批量插入

在开发中如果遇到需要批量insert的需求,可以使用Mybatis 的 Batch Insert Support 提高插入效率。

代码实例(开发的项目中截取的片段)

@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public int insertFolder(List<IpsCatalogFolderDetail> ips) {        //获取sql会话        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);        //通过新的session获取mapper,而不是常规的spring管理注入        IipsCatalogFolderDetailDao folderDetailDao = session.getMapper(IipsCatalogFolderDetailDao.class);        int size = ips.size();        //如果有父类子类两层都需要批量插入也可        try {        //外层循环            for (int i = 0; i < size; i++) {                    ips.get(i).setType("folder");                    //用上面在session中获取的mapper进行插入操作                    folderDetailDao.insertFolder(ips.get(i));                //内层循环                String cs = ips.get(i).getContentIds();                if (StringUtils.isNotBlank(cs)){                        List<String> con = JSON.parseArray(cs,String.class);                    if (cs != null && con.size() > 0) {                        for (int j = 0; j < con.size(); j++) {                                IpsCatalogFolderDetail ifd = new IpsCatalogFolderDetail();                                ifd.setParentCode(ips.get(i).getCode());                                ifd.setContentId(con.get(j));                                ifd.setType("contents");                                 //同样用上面在session中获取的mapper进行插入操作                                folderDetailDao.insertFolder(ifd);                        }                    }                }                //最后批量提交                    if (i % 200 == 0 || i == size - 1) {                        session.commit();//200个提交一次,手动提交,提交后无法回滚                        session.clearCache(); //清理缓存,防止溢出                    }            }        }catch (Exception e) {            System.out.println(e.toString());           session.rollback(); //没有提交的数据可以回滚        } finally {            session.close();        }        return 0;    }

另外有时我们在插入的时候需要先查询数据是否已存在,如果也需要批量操作可将insert和update语句合并,然后就可以继续使用Batch Insert了

ORACLE数据库sql示例

@Insert("merge into ips_catalog_folder_detail fd " +            "using(select #{code,jdbcType=VARCHAR} c from dual)t " +            "on(fd.FOLDERID = t.c)" +                        "when matched then"+            "update set "+            ...(省略)...            "where ..."+            "when not matched then insert(" +            "fd.PROD_LINE," +            "fd.TYPE," +            "fd.PARENTFOLDERCODE," +            "fd.FOLDERID," +            "fd.FOLDERCODE," +            "fd.FOLDERNAME," +            "fd.COLUMN_SORTINDEX," +            "fd.DESCRIPTION," +            "fd.CONTENTID," +            "fd.CREATETIME" +            ")" +            "VALUES" +            "(" +            "#{prod_line}," +            "#{type,jdbcType=VARCHAR}," +            "#{parentCode,jdbcType=VARCHAR}," +            "#{code,jdbcType=VARCHAR}," +            "#{aliasCode,jdbcType=VARCHAR}," +            "#{name,jdbcType=VARCHAR}," +            "#{sortIndex,jdbcType=VARCHAR}," +            "#{desc,jdbcType=VARCHAR}," +            "#{contentId,jdbcType=VARCHAR}," +            "#{createTime,jdbcType=VARCHAR}" +            ")")            int insertFolder(IpsCatalogFolderDetail fd);

MYSQL示例:

REPLACE INTO users (id,name,age) VALUES(1, '张雨绮', 32);

批量插入几千条数据优化(foreach)

项目中有一个耗时较长的Job存在CPU占用过高的问题

经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。

<insert id="batchInsert" parameterType="java.util.List">    insert into USER (id, name) values    <foreach collection="list" item="model" index="index" separator=",">         (#{model.id}, #{model.name})    </foreach></insert>

优化代码

可以看 http://www.mybatis.org/mybatis-dynamic-sql/docs/insert.html 中 Batch Insert Support 标题里的内容)

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);try {    SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class);    List<SimpleTableRecord> records = getRecordsToInsert(); // not shown     BatchInsert<SimpleTableRecord> batchInsert = insert(records)            .into(simpleTable)            .map(id).toProperty("id")            .map(firstName).toProperty("firstName")            .map(lastName).toProperty("lastName")            .map(birthDate).toProperty("birthDate")            .map(employed).toProperty("employed")            .map(occupation).toProperty("occupation")            .build()            .render(RenderingStrategy.MYBATIS3);     batchInsert.insertStatements().stream().forEach(mapper::insert);    session.commit();} finally {    session.close();}

总结一下,如果MyBatis需要进行批量插入,推荐使用 ExecutorType.BATCH 的插入方式,如果非要使用 <foreach>的插入的话,需要将每次插入的记录控制在 20~50 左右

关于“如何使用Mybatis的Batch Insert Support实现批量插入”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何使用Mybatis的Batch Insert Support实现批量插入”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Mybatis的Batch Insert Support实现批量插入

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Mybatis的Batch Insert Support实现批量插入

这篇文章主要介绍了如何使用Mybatis的Batch Insert Support实现批量插入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Mybatis的Batch Insert Support实现批
2023-07-02

MyBatis如何实现批量插入数据

本文小编为大家详细介绍“MyBatis如何实现批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis如何实现批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、SQL实现示例假设我们
2023-07-04

MyBatis批量查询、插入、更新、删除如何实现

今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。1.批量查询提供两种方式。方式一,返回值: List
2023-07-06

如何利用MySqlBulkLoader实现批量插入数据

这篇文章主要介绍“如何利用MySqlBulkLoader实现批量插入数据”,在日常操作中,相信很多人在如何利用MySqlBulkLoader实现批量插入数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利
2023-07-02

python数据库批量插入数据的实现(executemany的使用)

正常情况下往数据库多张表中批量插入1000条数据,若一条一条insert插入,则调用sql语句查询插入需要执行几千次,花费时间长现使用cursor.executemany(sql,args) ,可对数据进行批量插入, 其中args是一个包含
2022-06-02

在MyBatis中使用MySQL如何实现返回插入的主键ID

这篇文章给大家介绍在MyBatis中使用MySQL如何实现返回插入的主键ID,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值。方法:
2023-05-31

利用Mybatis如何实现返回插入的主键id

利用Mybatis如何实现返回插入的主键id?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在mapper的xml文件中配置 useGeneratedKeys以及 keyPro
2023-05-31

如何使用MongoDB实现数据的批量导入、导出功能

如何使用MongoDB实现数据的批量导入、导出功能MongoDB是一种NoSQL数据库,作为一种非关系型数据库,其在数据存储和查询上有着很大的灵活性和性能优势。对于需要批量导入和导出数据的应用场景,MongoDB也提供了相应的工具和接口。本
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录