解决SqlServer自增主键使用MybatisPlus批量插入报错问题

news2024/10/10 16:16:57

报错

SqlServer 表中主键设置为自增,会报以下错误。

org.springframework.jdbc.UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果

报错原因

原因:mybatis-plus 批量执行时 SQL server 自增主键没有回填造成的。

从 MyBatis3.3.1 版本开始,MyBatis 开始支持批量新增回写主键值的功能,这个功能首先要求数据库主键值为自增类型,同时还要求该数据库提供的 JDBC 驱动可以支持返回批量插入的主键值(JDBC提供了接口,但并不是所有数据库都完美实现了该接口),因此到目前为止,可以完美支持该功能的仅有 MySQL 数据库。由于 SQL Server 数据库官方提供的 JDBC 只能返回最后一个插入数据的主键值,所以不能支持该功能。

分析

查看调用栈,来到 BatchExecutor 的 doFlushStatements 方法,执行了 jdbc3KeyGenerator.processBatch(ms, stmt, parameterObjects)

进入方法,在如图位置抛出异常

解决

实现工具类,给 MappedStatement 设置 NoKeyGenerator,问题就解决了

public class SqlUtil {
    /**
     * 500条数据 提交一次
     * 必须是  BATCH_CNT_SQL_SIZE 整数倍
     */
    private final static int BATCH_SIZE = 500;
​
    /**
     * 批量保存,解决 mybatis-plus 在批量插入时由于主键自增报错问题
     * 如果主键不是自增,不要调用
     * @param list     数据集合
     * @param mClazz   mapper
     * @return 操作结果
     */
    public static <E, M extends BaseMapper<E>> boolean saveBatch(Class<M> mClazz, List<E> list) {
        SqlSessionFactory factory = SpringUtil.getBean(SqlSessionFactory.class);
        SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false);
        MappedStatement ms = sqlSession.getConfiguration().getMappedStatement(mClazz.getName() + ".insert");
        MetaObject metaObject = SystemMetaObject.forObject(ms);
        Object keyGenerator = metaObject.getValue("keyGenerator");
        metaObject.setValue("keyGenerator", NoKeyGenerator.INSTANCE);
        M mapper = sqlSession.getMapper(mClazz);
        try {
            // 用于跟踪自上次刷新以来已处理的元素数
            int processedCount = 0;
            for (E e : list) {
                mapper.insert(e);
                processedCount++;
                if (processedCount >= BATCH_SIZE) {
                    sqlSession.flushStatements();
                    processedCount = 0;
                }
            }
            // 如果还有剩余的元素未刷新,则刷新
            if (processedCount > 0) {
                sqlSession.flushStatements();
            }
            sqlSession.commit();
            return true;
        } catch (Throwable t) {
            sqlSession.rollback();
            throw new RuntimeException(t.getMessage());
        } finally {
            metaObject.setValue("keyGenerator", keyGenerator);
            SqlSessionUtils.closeSqlSession(sqlSession, factory);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解HTTP Cookie

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后&#xff0c;为什么下次访问B站就…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

KDTS 实现MySQL至KingbaseES迁移实践

此文章以linux环境实践&#xff0c;KingbaseES一下使用KES代替。 KDTS KDTS工具安装KES时会一起安装&#xff0c;一般存在目录为&#xff1a;ClientTools目录下guitools文件夹中 启动 进入KDTS-WEB下bin目录&#xff0c;执行sh文件 cd /opt/Kingbase/ES/V8/ClientTools/guit…

汽车胶黏剂市场研究:预计2030年全球市场规模将达到67.4亿美元

汽车胶黏剂是指专门用于汽车制造和维修过程中&#xff0c;用于粘接、密封和固定各种汽车部件的化学材料。它们在汽车行业中扮演着关键角色&#xff0c;广泛应用于车身、内饰、玻璃、电子元件和其他组件的粘接与密封。汽车胶黏剂旨在提高汽车的结构强度、耐用性、密封性以及舒适…

【JS】浏览器切换标签页导致计时器不准

现有一段计时器代码 function count() {let n 0const timer setInterval(() > {console.log(n);if (n > 200) {clearInterval(timer)}n}, 10) } count()效果如下&#xff0c;当计时过程中切换标签页&#xff0c;定时器的时间会放缓&#xff0c;再次切回标签页后&#…

MMDetection研究-1.入门及框架

记录MMDetection研究过程 0.前言 参考: 1.MMDetection框架入门教程(完全版) 2. 1.框架概述 MMDetection是商汤和港中文大学针对目标检测任务推出的一个开源项目,它基于Pytorch实现了大量的目标检测算法,把数据集构建、模型搭建、训练策略等过程都封装成了一个个模块,…

数据排列组合实现

示例 将以下几组数据 &#xff08;“01”, “02”&#xff09;&#xff0c;&#xff08;“A1”, “A2”, “A3”&#xff09;&#xff0c;&#xff08;“B1”, “B2”&#xff09;&#xff0c;&#xff08;“D1”, “D3”&#xff09;排列组合成&#xff0c;如&#xff1a;01:…

Isaac Sim软体仿真(以果实采摘场景为例)

如题,在做果蔬采摘的相关项目,背景是通过Isaac Sim做基于强化学习的果蔬采摘,因此简单搭建了一下场景。 效果如下图: 场景 物理环境(重力等):Create --> Physics --> Physics Scene   地面:Create --> Physics --> Ground Plane   灯光:新建文件自带…

基于SpringBoot+Vue的疫情居家办公系统(带1w+文档)

基于SpringBootVue的疫情居家办公系统(带1w文档) 基于SpringBootVue的疫情居家办公系统(带1w文档) 与传统疫情居家办公管理方案对比&#xff0c;应用疫情居家办公管理系统具备很多特点&#xff1a;最先&#xff0c;可以有效地提高疫情居家办公管理信息查找&#xff0c;仅需键入…

NL2SQL之DB-GPT-Hub详解篇:text2sql任务的微调框架和基准对比

NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比 随着生成式人工智能(Artificial Intelligence Generated Content&#xff0c;简写为 AIGC)时代的到来&#xff0c;使用大规模预训练语言模型(LLM)来进行 text2sql 任务的 sql 生成也越来越常见。基于 LLM 的…

小程序智能视频制作SDK解决方案,云端智能视频制作

无论是个人分享生活的点滴&#xff0c;还是企业展示品牌故事&#xff0c;一段精心制作的视频总能迅速抓住观众的眼球&#xff0c;传递无限价值。专业视频制作往往门槛较高&#xff0c;不仅需要专业的技能和设备&#xff0c;还耗费大量时间和精力。面对这一挑战&#xff0c;美摄…

软件项目开发流程与团队分工整体认知——基于《信息系统项目管理师教程》(需求分析、系统设计、开发、测试、部署与运维、开发工具与管理软件)

文章目录 1、信息系统项目管理师教程——精简说明2、软件工程开发流程与团队分工详解2.1 需求分析2.2 系统设计2.3 开发2.4 测试2.5 部署与运维 3、开发工具与管理软件4、总结 1、信息系统项目管理师教程——精简说明 在《信息系统项目管理师教程》中&#xff0c;有一些章节对…

【JAVA开源】基于Vue和SpringBoot的卫生健康系统

本文项目编号 T 076 &#xff0c;文末自助获取源码 \color{red}{T076&#xff0c;文末自助获取源码} T076&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

食堂订餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;攻略信息管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品&#xf…

vscode快速删除一行的快捷键不管用

vscode快速删除一行的快捷键 在vscode中&#xff0c;快速删除一行的快捷键是CtrlShiftk。 因为搜狗软键盘的快捷键和这个快捷键的按键是冲突了&#xff0c;所以快捷键被搜狗输入法给拦截了。把搜狗软键盘的快捷键关闭了或者修改成别的键就好了&#xff0c; 因为我不怎么用软键…

Meta推出的AI视频音频生成模型:Movie Gen

Meta Movie Gen&#xff0c;由 Meta 精心打造的 AI 视频和音频生成工具&#xff0c;能够让用户通过简洁的文本提示轻松创造出高清晰度的视频和音效&#xff0c;并实现精确的视频编辑。用户只需提供文本描述&#xff0c;即可生成高清视频&#xff1b;或者上传图片&#xff0c;便…

python22_replace替换

replace替换 a helloworlddef replace(s, old, new):return new.join(s.split(old))def replace_other(s, number):return s.replace(a[number], m)if __name__ "__main__":print(f"输出结果为{replace(a, hello, world)}")print(f"输出结果为{rep…

Window系统编程 - 文件操作

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天主要介绍使用windows系统编程操作读写文件 文件 CreateFile()函数讲解 介绍:该函数用于打开文件或者I/O流设备&#xff0c;文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和…

泰始明昌文旅:如何打造真正的文旅爆品体系

泰始明昌文旅&#xff1a;如何打造真正的文旅爆品体系 泰始明昌文旅&#xff1a;如何打造真正的爆品体系 关键词&#xff1a;泰始明昌文旅,文旅爆品,核心卖点,用户痛点,项目特点,对手弱点,爆品体系,爆品品类,结构化,品质,价值链接,生态体系,营销推广,持续创新 摘要&#xff…

Adobe Acrobat提示“3D数据解析错误”

原因&#xff1a;在使用Adobe Acrobat打开3D PDF时&#xff0c;因当前Adobe Acrobat的配置存在错误&#xff0c;所以无法打开 解决方法&#xff1a;重新生成配置 首先到达下面的路径C:\Users\你的用户名\AppData\Local\Adobe\Acrobat 下面为我的路径内容 若该路径下存在文件…