阅读 224

MyBatis中使用foreach批量插入并且返回自增id | MyBatis系列(小技巧一)

  • 业务场景:

    • 签到表是个流程,等到审核完成后,需要将其从表数据自动添加至台账表中,方便台账表的导出功能的开发。所以我们得获取到批量插入的从表id,来维护主从表的关联关系。

  • 具体实现:

    • 建立实体类:因为返回的id会自动注入进去,所以得选实体类来接收自增的id。

@Data public class SignIn implements Serializable {     private long id;//注意id为long类型     private String owner;     private String modifier;     private String last_modified;     private String created_at;     private String modified_method;     private String app_key;     private String app_extend_key;     private String canjiayixiangxin;     private String canjiashijian;     private String canjiaren;     private String yanlianliushuihao; } 复制代码

  • mapper的编写:

    • 注意点:正常的插入只需要parameterType=“”即可。

    • 我们需要返回id的话得多加以下三个:

    • useGeneratedKeys="true" :允许JDBC支持自动生成主键,需要驱动兼容(如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作)

    • keyProperty="id" :取id的key值

    • keyColumn="id":设值id的值

<!--插入数据至台账从表-->     <insert id="insertParameter"  useGeneratedKeys="true" keyProperty="id" keyColumn="id" >         insert into          ${tableId}(          owner,modifier,last_modified,created_at,modified_method,app_key,app_extend_key, canjiayixiangxin,canjiashijian,canjiaren,yanlianliushuihao)         values         <foreach collection="list" index="index" item="ids" separator=",">             (             #{ids.owner},#{ids.modifier},#{ids.last_modified},#{ids.created_at},# {ids.modified_method},#{ids.app_key},#{ids.app_extend_key}, #{ids.canjiayixiangxin},#{ids.canjiashijian},#{ids.canjiaren},#{ids.yanlianliushuihao}             )         </foreach>     </insert> 复制代码

  • service层:

  • 前提是已拿到所需要插入的数据集合了。

  • 注意点:网上大把博客都忽略了一个点,大家也会经常遇到一个问题就是,返回的id在集合中会重复,下面会说下为什么出现这样的原因。

  • 原因 本质上我们批量插入时,是将一个实体类组成的集合执行插入语句,用foreach进行批量插入。

  • 我们将List<Map<String,Object>> 类型转成List<实体类>。使用mapToBean方法来转换。

  • 因为我们是循环转换的,所以每次都得在重新new一个对象,不然id就会被覆盖。

//如果数据为空,结束,不需要再执行下去 if (CollectionUtils.isEmpty(resultList)){      return;   }  //格式化时间                         SimpleDateFormat sdfDay = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");  List<SignIn> signInList = new ArrayList<>();  for (Map map : resultList){   map.put("created_at",sdfDay.format(map.get("created_at")));   map.put("canjiashijian",sdfDay.format(map.get("canjiashijian")));   map.put("last_modified",sdfDay.format(map.get("last_modified")));   map.remove("id");   //转为实体类,这里每次需要重新new一个对象,不然id会被覆盖成最后一个的id   SignIn signIn = new SignIn();   signInList.add(BeanUtils.mapToBean(map,signIn));   } 复制代码

  • 这样即可拿到所有插入的自增id。

  • 下面提供下Map转实体的方法给大家:

public class BeanUtils {     private BeanUtils() {throw new IllegalStateException();     }     /**      * map转bean      *      * @param map      * @param bean      * @param <T>      * @return      */     public static <T> T mapToBean(Map<String, Object> map, T bean) {         BeanMap beanMap = BeanMap.create(bean);         beanMap.putAll(map);         return bean;     } } 复制代码


路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah


作者:大鱼丶
链接:https://juejin.cn/post/7030358822153617439


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐