mybatis-SqlServer批量新增返回id

  • 遇到的问题
  • 解决思路
  • 代码

遇到的问题

公司最近接到项目需要使用SqlServer,在做SQL兼容的时候遇到问题.批量新增数据时只返回的第一条记录的id

解决思路

  1. 参考mysql
<insert id="batchInsert" userGeneratedKeys="true" keyProperty="id">insert into public_user (name,password)values<foreach collection="list" separator="," item="item">(#{item.name}, #{itme.password})</foreach>
</insert>

具体mybatis封装id的地方在org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator
主要逻辑是通过Statement.getGeneratedKeys()获取id结果集.
SqlServer只能获取第一个

  1. 发现上述步骤的Jdbc3KeyGenerator是有接口的KeyGenerator,查看后发现有3个实现类了解到SelectKeyGenerator通过selectKeyt标签可以返回id;
  2. 查看SelectKeyGenerator源码了解到只支持返回单个id;
  3. 通过百度了解到SqlServer通过output inserted.id可以输出id;
  4. 是否可以自己实现KeyGenerator来解决批量返回id的方法呢?
  5. 最后我没找到配置自定义的实现类的方式,决定通过mybatis的拦截器解决

代码

mybatis拦截器

@Component
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}))
public class SqlServerKeyGeneratorInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 正常执行代码 获取返回结构集List<Object> values = (List)invocation.proceed();MappedStatement ms = (MappedStatement) invocation.getArgs()[0];// 判断是否selectKey查询语句if (ms.getId().endsWith(SelectKeyGenerator.SELECT_KEY_SUFFIX)) {Configuration configuration = ms.getConfiguration();// 处理入参对象Collection<Object> parameters = getParameters(invocation.getArgs()[1]);// 封装idfor (int i = 0; i < parameters.size(); i++) {MetaObject metaObject = configuration.newMetaObject(parameters.toArray()[i]);metaObject.setValue("id", Long.valueOf((Integer)(((Map)values.get(i)).get("id"))));}// 返回假数据防止异常List<Long> ids = new ArrayList<>();ids.add(1L);return ids;}return values;}@Overridepublic Object plugin(Object target) {return null;}@Overridepublic void setProperties(Properties properties) {}/** 来源 Jdbc3KeyGenerator */private Collection<Object> getParameters(Object parameter) {Collection<Object> parameters = null;if (parameter instanceof Collection) {parameters = (Collection) parameter;} else if (parameter instanceof Map) {Map parameterMap = (Map) parameter;if (parameterMap.containsKey("collection")) {parameters = (Collection) parameterMap.get("collection");} else if (parameterMap.containsKey("list")) {parameters = (List) parameterMap.get("list");} else if (parameterMap.containsKey("array")) {parameters = Arrays.asList((Object[]) parameterMap.get("array"));}}if (parameters == null) {parameters = new ArrayList<Object>();parameters.add(parameter);}return parameters;}
}

mapper

<insert id="batchInsert"><selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="java.util.Map">insert into public_user (name,password)output inserted.idvalues<foreach collection="list" separator="," item="item">(#{item.name}, #{itme.password})</foreach><selectKey>
</insert>

PS:需要注意的是id对象参数必须放在第一位,拦截器的代码写的比较粗糙,给各位提供思路.有更好方案的可以留言.

mybatis-sqlserver批量新增返回id相关推荐

  1. Mybatis Mysql 批量插入返回id

    1. 目标: 使用Mybatis 批量插入数据返回自增的id 2. 具体实现 注意: MyBatis版本3.3.1或者以上 <insert id="save" useGene ...

  2. Mybatis执行批量插入返回数据库主键列表

    原文地址 [推荐阅读]微服务还能火多久?>>> 我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateK ...

  3. orcal 批量新增,批量更新多条件

    批量新增 <insert id="savePatientEmr" parameterType="java.util.List" useGeneratedK ...

  4. Mybatis新增返回主键ID

    在做项目的过程中有时候难免会运用到新增一条数据并获取到新增的这条数据的主键ID,这样的一个功能,新增一条订单数据,并返回新增订单的ID.这样做的前提是数据的ID必须为自增. 我是用ssm框架做的项目, ...

  5. mybatis插入数据后返回自增主键ID详解

    1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...

  6. mybatis多表新增如何获取主键ID

    记录一下碰到的问题,就当做是笔记吧,防止忘记.在做ssm多表新增的时候,碰到了一个小问题,就是在新增成功一个表的时候我要获取它的ID,然后用它的ID新增下一个表. 但是,我要怎么做呢?新增成功,再查询 ...

  7. mybatis高级查询,批量新增

    review sql脚本 实体类 sql watch out mapper mapper test 之前的比较分散,自己用... sql脚本 -- auto-generated definition ...

  8. mybatis批量新增和批量更新的效率对比

    今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验. 实验结果,让人意 ...

  9. 基于ruoyi+vue+elementUI实现列表,新增,附件上传,tab+springBoot+mybatis+oracle序列+批量新增

    基于ruoyi+vue+elementUI实现列表,新增,附件上传,tab+springBoot+mybatis+oracle序列+批量新增 页面效果 列表页面 新增页面 详情页面 代码实现 列表+新 ...

最新文章

  1. qt获取当前系统音量值_Qt编写自定义控件50-迷你仪表盘
  2. “产教融合新范式,校企聚力新实践”——2018杭州云栖大会大学合作专场论坛成功举办...
  3. Jsoncpp Compiler、Programming
  4. 我用段子讲.NET之依赖注入(一)
  5. 牛客网选择题之linux
  6. linux kvm查看线程状态,kvm线程-005-线程状态-THREAD_JUST_BORN
  7. Python PyCrypto,Paramiko模块安装和使用
  8. UVA10125 POJ2549 Sumsets【暴力+二分】
  9. git如何撤销已经push到远程仓库的代码提交
  10. C# 修改Config文件,增删查改
  11. 2021年最完整的人工智能入门指南
  12. Echarts实现“暂无数据”的几种方案
  13. 【每日一题】一起冲击蓝桥杯吧——Day2【蓝桥真题】
  14. python 取数组最后一个_在numpy数组中查找最后一个值
  15. 计算机单招考试零基础,单招英语零基础怎么学
  16. java-小学期小小项目-通讯录管理系统
  17. Python学习之---杨辉三角的五种解法
  18. java 打印jpg、pdf、word
  19. 3D人脸查看器和匹配器
  20. 杂记---Mongo的Invalid BSON field name $gte

热门文章

  1. 消费者心声:我手机的镜头已经够好了,什么时候给我防防水?
  2. C++学习笔记——非静态成员函数的非法调用错误
  3. MapReduce经典案例总结
  4. APP“自动续费”,挖坑式赚钱有违商业伦理
  5. tensorflow-tf基础
  6. jdk8的ConcurrentHashMap实现
  7. 关于echarts自定义合并中国地图分区展示的问题
  8. neko vm 数据包装翻译
  9. 用Python去京东抢90-40话费券,看到结果我惊呆了!
  10. Substrate Tutorials:Start a Private Network (multi-node)