现象

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

原因

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

跟踪代码,flushStatements()方法应该是需要把数据库返回的默认主键值给插入的对象,但SQL Server数据库官方提供驱动只能返回一个插入数据主键值。

解决方案

1、数据表主键,使用idworker。

参考以前同事的代码,发现使用sqlserver数据库使用savaBatch也没有问题,最后对比发现问题的所在是在主键上;一个自增,一个idworker;idworker批量新增没有问题,应该是idworker自动生成主键,能够会填主键;而自增不行;

2、自定义批量新增语句;

// 设置useGeneratedKeys为true,返回数据库自动生成的记录主键id
<insert id="batchInsert"  useGeneratedKeys="true" keyProperty="id">
    insert into browse_log ( userId, browseTime,category,proId,productType)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (
        #{item.userId},
        #{item.browseTime},
        #{item.category},
        #{item.proId},
        #{item.productType},
        )
    </foreach>
</insert>

参考链接:https://blog.csdn.net/weixin_42952711/article/details/113379876

更多推荐