首页 > 其他分享 >Mybatis批量插入——踩坑点

Mybatis批量插入——踩坑点

时间:2024-03-21 11:58:56浏览次数:15  
标签:批量 坑点 rule records BIGINT jdbcType Mybatis INTEGER id

最近在进行批量插入,并且返回id的时候,遇到了几个比较抽象的点,首先,是mybatis版本不对,3.3.1之后才支持批量插入返回主键,所以在主键为null的时候,先检查mybatis版本。
之后就是检查数据库中的id是否是自增的,如果不是,是否是雪花算法,当然雪花算法就不在本文中详述了。
其次,在insert返回主键的时候,使用
useGeneratedKeys="true" keyProperty="id
而不是
<insert id="batchInsert" useGeneratedKeys="true" keyColumn="id">
然后就是在批量插入的时候,进行sql语句动态拼接的时候,尽量不要使用

 insert into xxx (id,permission_id, type, expression, is_del)
        values
        <foreach collection="list" item="rule" index="index" separator="," open="(" close=")">
            #{rule.id,jdbcType=BIGINT}, #{rule.permissionId,jdbcType=BIGINT}, #{rule.type,jdbcType=INTEGER},
            #{rule.expression,jdbcType=INTEGER},#{rule.isDel,jdbcType=INTEGER}
        </foreach>
    </insert>

这样会导致sql语句异常,当数据量大于1的时候,3个属性会不断拼接,从而早场colum doesn‘t match的异常描述
相反,这样做:

<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
       insert into xxx (id,permission_id, type, expression, is_del)
       values
       <foreach collection="list" item="rule" index="index" separator=",">
           (#{rule.id,jdbcType=BIGINT}, #{rule.permissionId,jdbcType=BIGINT}, #{rule.type,jdbcType=INTEGER},
           #{rule.expression,jdbcType=INTEGER},#{rule.isDel,jdbcType=INTEGER})
       </foreach>
   </insert>

就可以避免该异常了。
接下来就是最容易被忽略的点,在mapper中,这样定义 变量别名,必须用list
int batchInsert(@Param("list") List<xxx> records);
xml同上
而不是把变量别名改为其他的非“list”的名字
int batchInsert(@Param("records") List<xxx> records); 然后foreach中的collection也当作records

标签:批量,坑点,rule,records,BIGINT,jdbcType,Mybatis,INTEGER,id
From: https://www.cnblogs.com/blog4cloudboy/p/18087035

相关文章

  • vim 批量注释与解除注释
    方法一:视图模式(ctrl+v)注:插入操作仅vim可用删除(当删除内容为行首的#时,即可批量解除注释):光标移动(上,下,左,右键/k,j,l,h)选中块然后del删除块(del/dd)插入(当行首块批量插入内容为#时,即可完成批量注释)光标移动(上,下,左,右键/k,j,l,h)选中块然后按插入符(I:光标前插入;A:光......
  • SpringBoot整合Mybatis(SpringBoot3)
    依赖pom.xml:pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://......
  • 自己动手做一个批量doc转换为docx文件的小工具
    前言最近遇到了一个需求,就是要把大量的doc格式文件转换为docx文件,因此就动手做了一个批量转换的小工具。背景doc文件是什么?"doc"文件是一种常见的文件格式,通常用于存储文本文档。它是MicrosoftWord文档的文件扩展名。"doc"是"document"的缩写,表示这是一个文档文件。这......
  • mybatis一二级缓存简介
    一、前言1,代码和准备工作见:mybatis工作原理简介-seeAll-博客园(cnblogs.com); 二、一级缓存1,效果展示1.1,测试代码代码中,使用SqlSession查询过一次数据;本例在此之后,继续添加一段代码,使用同样的SqlSession再次查询,观察结果数据来自于缓存还是数据库。 1.2,观察第一次......
  • 博客园博客批量备份/转移到个人网站
    鉴于有些小伙伴在寻找博客园迁移到个人博客的方案,本人针对博客园实现了一个自动备份脚本,可以快速将博客园中自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直接放入到hexo博客中,快速生成自己的站点,而不需要自己逐篇文章迁移,提高了备份文章的效率。首先第一步将博......
  • Elasticsearch-批量操作(bulk)
    bulk的基础概念bulk是es提供的一种批量增删改的操作API。bulk的语法bulk对JSON串的有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是\n;Window下是\r\n)。bulk的每个操作必须要一对JSON串(delete语法除外)。PUT/_bulk{"action":......
  • Mybatis设置默认值
    在MyBatis中,可以通过在<resultMap>中使用<result>标签的column属性来设置默认值。但是,MyBatis本身不直接支持在<select>查询中设置默认值。如果需要为查询结果中的某个字段设置默认值,可以在结果映射中处理,或者在应用层面进行处理。以下是一个使用<resultMap>设置默认值的例......
  • SpringBoot整合Mybatis-Plus(SpringBoot3)
    依赖pom.xml:pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://......
  • 批量在多个文件夹里作成新的子文件夹
    在多个文件夹里作成新的子文件夹使用mkdir命令。例如:在3个目录下作成202403文件夹。mkdirD:\temp\test0319\00133088\202403mkdirD:\temp\test0319\00133033\202403mkdirD:\temp\test0319\00133066\202403同样,也可批量删除目录。或者用explorer检索出目录,直接删掉即可......
  • 【Python】使用selenium对Poe批量模拟注册脚本
    配置好接码api即可实现自动化注册登录试用一体。运行后会注册账号并绑定邮箱与手机号进行登录试用。测试结果30秒一个号importreimporttimeimportrequestsfrombs4importBeautifulSoupfromseleniumimportwebdriverfromselenium.webdriver.chrome.option......