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注入系统中

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

问题: 在使用 mybatis-plus 调用sqlserver 存储过程 没有返回值

经过资料查找

注意点
此处使用Map传参,原因在于存储过程的返回值,通常在参数定义中实现,如In 入参、out 出参。

这样当执行后有结果返回时,则可以将结果映射入传入的 Map对象中。

Mybatis的statementType取值:

获取返回值
在调用对应的存储过程sql后,返回值的获取如下:

bigScreenJobMapper.proHbjtFund(map);
String result = map.get("result");

Mybatis 使用@select注解调用带输出参数的存储过程

//@Options 必须使用 这个注解

@Options(statementType = StatementType.CALLABLE)
@Select(“Call procdure_name(” +
“#map.name,mode=OUT,jdbcType=INTEGER,” +
“#map.password,mode=OUT,jdbcType=INTEGER,” +
“#map.total,mode=OUT,jdbcType=INTEGER)”)
void getXXXXX(Map<String,Object> map);

//调用
Map<String, Object> map=new HashMap<>();
XXXXMapper.getXXXXX(map);
Map<String, Integer> totalMap = (Map<String, Integer>) map.get(“map”);//map获取
Integer total = totalMap.get(“total”);//key值与传参时一致
Integer name= totalMap.get(“name”);
Integer password= totalMap.get(“password”);

注意点:

1、@options:statementType.CallAble 必须声明,告诉程序这是要执行存储过程,否则会报,main找不到

2、有两种方式带参:“$””#”

主要区别就是#带双引号,$不带

例如:#id代表’id’,$id代表id

第二种因为传一个参数是可以省略@Param(“”)的,但是这种情况下不能使用$,

传两个参数以上时,必须要写@Param(“”)

3、 存储过程的output参数,只能通过传入的map获取参数,使用map.XXX ;

输出参数 设置mode=OUT ,jdbcType与SQL中存储过程类型一致。

4、存储过程对应的数据类型为枚举类型,需要使用大写,如VARCHAR

5、存储过程返回的结果集可直接用返回的map接收

以下是示例:
调用

    Map<String,Object> map=new HashMap<>();
        map.put("SID",data.getSid());
        map.put("SType",-1);
        map.put("SFlag",1);
        map.put("SUserAccount",RequestUtils.getUsername());

     baseMapper.Pr_Trans_Approve_PrBar(map);
    if (StringUtils.isEmpty(map.get("result"))) 
            throw new ErpRuntimeException("存储过程操作异常!");
        else if(!StringUtils.isEmpty(map.get("result")) && map.get("result").toString().indexOf("NNNN") > -1)
            throw new ErpRuntimeException("失败:" + map.get("result").toString().replaceAll("N", ""));
          

Mapper 文件

    @Options(statementType = StatementType.CALLABLE)
    @Select("exec [dbo].Pr_Trans_Approve_PrBar "+"#SID,mode=IN,"+"#SType,mode=IN,"+"#SFlag,mode=IN,"+"#SUserAccount,mode=IN,"+"#result,mode=OUT,jdbcType=VARCHAR")
    void Pr_Trans_Approve_PrBar(Map<String,Object> request);

以上是关于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的冲突解决