springboot mybatis-plus 对接 sqlserver 数据库 批处理的问题

277 阅读1分钟

问题

在对接 sqlserver数据库的时候 主子表 保存的时候

子表批量保存 使用的 mybatis-plus提供的saveOrUpdateBatch 这个方法

但是 报错

报错内容为 :

com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果。

框架版本

sprin boot 2.0 +

mybatis-plus 3.3.1

mybatis-plus 代码生成器 mybatis-plus-generator: 3.3.2

SQL Server JDBC: mssql-jdbc 版本 :8.4.1.jre8

经过排查后

猜测 应该是 mssql-jdbc 和 mybatis-plus 不兼容

mssql-jdbc 和 mybatis-plus 都调整的了版本 还是不行

最后我的结论 应该是 mybatis-plus在处理 sqlserver 批处理的时候

没有考虑这种情况

最后也没找到合适的解决方案

最后实现了两种解决方案 仅供参考

方案一

在使用这个 批处理方法的时候 捕获异常

       // 对于sqlserver    批处理的问题
       // mybatis-plus 提供的 saveOrUpdateBatch saveBatch 这两个方法啊 经过测试 会报错
        //   如果非要用 mybatis-plus 的这个 saveOrUpdateBatch 方法
        // 必须要捕获异常  但是不知道会不会对事务有影响
        // 稳妥点的方案 批处理 写 xml文件 原生sql 执行 但是写起来麻烦
        //  xml 文件 放的位置 已经application.yml 配置文件中定义好了
        try {
            saveOrUpdateBatch(etMaintain.getEtMaintainsubList());
        }catch (UncategorizedSQLException e){
            e.printStackTrace();
        }

方案二 使用 xml 文件 生成sql 语句 来执行 批量处理

第一步 配置 xml 的存放位置

mybatis-plus:

mapper-locations: classpath:/mapper/*.xml

第二步编写 相对应的xml文件

举例说明

useGeneratedKeys=“true” 这个key 注意一下 网上有说 这个key 也会导致这个问题的出现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yurui.pda.mapper.TransSubMapper">

    <insert id="saveTransSubs" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="sid">
        INSERT INTO Pr_TransSub ( SPMCNO, SPMCRoutID, SItemName, SProcedureID, SEmplID_Product, SQtys_Plan, SDate)
        VALUES
        <foreach collection="transSubs" item="transSub" separator=",">
            (#{transSub.spmcno}, #{transSub.spmCRoutID}, #{transSub.sitemName}, #{transSub.sprocedureID},
            #{transSub.semplidProduct}, #{transSub.sqtysPlan}, #{transSub.sdate})
        </foreach>
    </insert>
</mapper>