mybatis-plus解决 sqlserver批量插入list报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus解决 sqlserver批量插入list报错相关的知识,希望对你有一定的参考价值。

参考技术A

解决版本:3.0.6
原因分析:mybatis-plus默认使用Jdbc3KeyGenerator进行添加,但是sqlserver不支持批量返回id,所以会抛出如下异常

解决方案: 重写默认saveBatch和saveOrUpdateBatch(缺点是批量添加不能返回id,对于不需要返回id的场景适用)将Jdbc3KeyGenerator替换为NoKeyGenerator

第一步: 建立NoahSqlMethod(也可以不写,但是项目尽量不出现魔法值)

第二步: 建立InsertBatch对象

第三步: 建立NoahSqlInjector对象

第四步: 重写ServiceImpl超类为AbstractNoahServiceImpl

第五步: 将业务service继承类改为AbstractNoahServiceImpl

第六步: 将SqlInjector注入系统中

T-SQL:批GO使用实例(十四)

批是由客户端应用程序作为一个单元发送给SQL Server 执行的一条或多条语句  如果批中出现错误就整个批都不会交给SQL SERVER 执行

PRINT 第一批;GO
-- Invalid batch
PRINT 第二批;
SELECT custid FROM Sales.Customers;
SELECT orderid FOM Sales.Orders;
GO
-- Valid batch
PRINT 第三批;
SELECT empid FROM HR.Employees;

技术分享图片 

一起执行会发现第二批出现错误就没有提交执行

批由GO命令 隔断 

  

DECLARE @i AS INT = 10;
-- Succeeds
PRINT @i;
GO

-- Fails
PRINT @i;
GO

技术分享图片Go 隔断了 @i 变量 就会报错  

例如还有一种情况

IF OBJECT_ID(Sales.MyView, V) IS NOT NULL DROP VIEW Sales.MyView;

CREATE VIEW Sales.MyView
AS

SELECT YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY YEAR(orderdate);
GO
CREATE VIEW Sales.MyView
AS 

 技术分享图片 

技术分享图片

 

create view  必须是批中第一个语句  所以 在create view 前面 加 go命令 进行截断 

技术分享图片

 还有 在同一批中更改架构 会出现错误  需要放到两个批中

CREATE TABLE dbo.T1(col1 INT);
GO

-- Following fails
ALTER TABLE dbo.T1 ADD col2 INT;
SELECT col1, col2 FROM dbo.T1;
GO

技术分享图片

 

也可以用GO 循环运行批如:

 

print 1123
GO 5

技术分享图片

可以用来批量新增语句

 

以上是关于mybatis-plus解决 sqlserver批量插入list报错的主要内容,如果未能解决你的问题,请参考以下文章

springboot mybatis-plus 调用 sqlserver 的 存储过程 返回值问题

springboot+mybatisplus+sqlserver(2008SR)整合分页问题

Spring boot + mybatis-plus 遇到 数据库字段 创建不规范 大驼峰 下划线 导致前端传参数 后端收不到参数 解决方案

Mybatis增强工具——MyBatis-Plus

T-SQL:批GO使用实例(十四)

MyBatis和Mybatis-plus以及mybatis-spring的冲突解决