MyBatis实现批量插入数据,多重forEach循环

 更新时间:2022年02月08日 08:38:44   作者:m0_37837382  
这篇文章主要介绍了MyBatis实现批量插入数据,多重forEach循环方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

批量插入数据,多重forEach循环

在业务开发过程中,遇到批量插入时,需要进行多重forEach循环的情况。

下面是一个实际应用

public class SysRoleData extends DataEntity<SysRoleData> {
   private static final long serialVersionUID = 1L;
   private String kind;      //类别(1:按部门2:按角色)
   private String roleId;    // role_id
   private String roleName;  //角色名称
   private String officeId;   //office_id
   private String officeName;  //部门名称
   private String type;      // 1.品牌 2.品类 3.品牌&品类
   private String dataId;    // 数据ID品牌
   private String dataName;    //数据名称品牌
   private String dataIds;       // 数据ID品类
   private String dataNames;    //数据名称品类
   private String groupNo;  //分组标识
   private String useable; //是否可用(1:可用,0:不可用)
   private String remarks; //备注
   private List<String> officeIdList = Lists.newArrayList();
   private List<String> roleIdList = Lists.newArrayList();
   private List<BrandCategoryVO> dataList = Lists.newArrayList();
   public SysRoleData() {
      super();
   }
   public SysRoleData(String id){
      super(id);
   }
   public String getKind() {
      return kind;
   }
   public void setKind(String kind) {
      this.kind = kind;
   }
   @Length(min=0, max=45, message="role_id长度必须介于 0 和 45 之间")
   public String getRoleId() {
      return roleId;
   }
   public void setRoleId(String roleId) {
      this.roleId = roleId;
   }
   public String getRoleName() {
      return roleName;
   }
   public void setRoleName(String roleName) {
      this.roleName = roleName;
   }
   public String getOfficeName() {
      return officeName;
   }
   public void setOfficeName(String officeName) {
      this.officeName = officeName;
   }
   @Length(min=0, max=45, message="office_id长度必须介于 0 和 45 之间")
   public String getOfficeId() {
      return officeId;
   }
   public void setOfficeId(String officeId) {
      this.officeId = officeId;
   }
   @Length(min=0, max=4, message="品类长度必须介于 0 和 45 之间")
   public String getType() {
      return type;
   }
   public void setType(String type) {
      this.type = type;
   }
   @NotNull
   public String getDataId() {
      return dataId;
   }
   public void setDataId(String dataId) {
      this.dataId = dataId;
   }
   public String getDataName() {
      return dataName;
   }
   public void setDataName(String dataName) {
      this.dataName = dataName;
   }
   public String getDataIds() {
      return dataIds;
   }
   public void setDataIds(String dataIds) {
      this.dataIds = dataIds;
   }
   public String getDataNames() {
      return dataNames;
   }
   public void setDataNames(String dataNames) {
      this.dataNames = dataNames;
   }
   public String getUseable() {
      return useable;
   }
   public void setUseable(String useable) {
      this.useable = useable;
   }
   public String getRemarks() {
      return remarks;
   }
   public void setRemarks(String remarks) {
      this.remarks = remarks;
   }
   public List<BrandCategoryVO> getDataList() {
      return dataList;
   }
   public void setDataList(List<BrandCategoryVO> dataList) {
      this.dataList = dataList;
   }
   public List<String> getOfficeIdList() {
      return officeIdList;
   }
   public void setOfficeIdList(List<String> officeIdList) {
      this.officeIdList = officeIdList;
   }
   public List<String> getRoleIdList() {
      return roleIdList;
   }
   public void setRoleIdList(List<String> roleIdList) {
      this.roleIdList = roleIdList;
   }
   public String getGroupNo() {
      return groupNo;
   }
   public void setGroupNo(String groupNo) {
      this.groupNo = groupNo;
   }
}

如上所示为一个实体类,会有dataList和roleIdList或officeIdList,在批量插入时从而形成多重循环。 

上图为列表页面,

上图为添加页面。部门名称和品牌,品类名称支持多选,而在保存时,需要将其拆分保存。在查询时通过group_concat函数进行聚合展示在列表页面。

故在批量插入数据时:

<insert id="insert">
   INSERT INTO sys_role_data(
   kind,
   role_id,
   office_id,
   type,
   data_id,
   data_name,
   group_no,
   useable,
   remarks,
   create_date,
   create_by,
   update_date,
   update_by
   )VALUES
   <if test="kind != null and kind == 0">
      <foreach collection="officeIdList" item="officeId" separator=",">
         <foreach collection="dataList" item="data" separator=",">
         (
            #{kind},
            null,
            #{officeId},
            #{type},
            #{data.id},
            #{data.name},
            #{groupNo},
            #{useable},
            #{remarks},
            #{createDate},
            #{createBy.id},
            #{updateDate},
            #{updateBy.id}
         )
         </foreach>
      </foreach>
   </if>
   <if test="kind != null and kind == 1">
      <foreach collection="roleIdList" item="roleId" separator=",">
         <foreach collection="dataList" item="data" separator=",">
         (
            #{kind},
            #{roleId},
            null,
            #{type},
            #{data.id},
            #{data.name},
            #{groupNo},
            #{useable},
            #{remarks},
            #{createDate},
            #{createBy.id},
            #{updateDate},
            #{updateBy.id}
         )
         </foreach>
      </foreach>
   </if>
</insert>

由上面sql可以看出,根据kind不同,进行相应的双重forEach循环插入数据。

mybatis insert foreach

项目场景

报错 ,找不到参数

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘statusInfoId’ not found. Available parameters are [collection, list]

  @Mapper
public interface PatrolRecordMapper extends BaseMapper<PatrolRecord> {
    int insertList(@Param(value = "list") List<PatrolRecord> list);
}

mapper 换了很多种写法

    <insert id="insertList" parameterType="com.iricto.soft.patrol.entity.PatrolRecord">
        insert into patrol_record(status_info_id,route_id,place_name,patrol_time,
        patrol_user,patrol_class,`status`)
        VALUES
        <foreach collection="list" item="patrolRecord" separator=",">
            (patrolRecord.#{statusInfoId},
            patrolRecord.#{routeId},
            patrolRecord.#{placeName},
            patrolRecord.#{patrolTime},
            patrolRecord.#{patrolUser},
            patrolRecord.#{patrolClass},
            patrolRecord.#{status})
        </foreach>
    </insert>

mapper

    <insert id="insertList" parameterType="com.iricto.soft.patrol.entity.PatrolRecord">
        insert into patrol_record(status_info_id,route_id,place_name,patrol_time,
        patrol_user,patrol_class,`status`)
        VALUES
        <foreach collection="list" item="list"
                 open="(" separator="," close=")">
            list.#{statusInfoId},
            list.#{routeId},
            list.#{placeName},
            list.#{patrolTime},
            list.#{patrolUser},
            list.#{patrolClass},
            list.#{status}
        </foreach>
    </insert>

最后应该这么写才对 : mapper  

    <insert id="insertList" parameterType="com.iricto.soft.patrol.entity.PatrolRecord">
        insert into patrol_record(status_info_id,route_id,place_name,patrol_time,
        patrol_user,patrol_class,`status`)
        VALUES
        <foreach collection="list" item="patrolRecord" separator=",">
            (
            #{patrolRecord.statusInfoId},
            #{patrolRecord.routeId},
            #{patrolRecord.placeName},
            #{patrolRecord.patrolTime},
            #{patrolRecord.patrolUser},
            #{patrolRecord.patrolClass},
            #{patrolRecord.status})
        </foreach>
    </insert>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • dubbo服务整合zipkin详解

    dubbo服务整合zipkin详解

    这篇文章主要介绍了dubbo服务整合zipkin,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java使用poi导出Excel的方法

    java使用poi导出Excel的方法

    这篇文章主要为大家详细介绍了java使用poi导出Excel的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • spring+maven实现发送邮件功能

    spring+maven实现发送邮件功能

    这篇文章主要为大家详细介绍了spring+maven实现发送邮件功能,利用spring提供的邮件工具来发送邮件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • java实现双向链表的增删改

    java实现双向链表的增删改

    这篇文章主要为大家详细介绍了java实现双向链表的增删改,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • java算法实现预测双色球中奖号码

    java算法实现预测双色球中奖号码

    这篇文章主要介绍了java算法实现预测双色球中奖号码的相关资料,需要的朋友可以参考下
    2015-12-12
  • Java实现黄金分割法的示例代码

    Java实现黄金分割法的示例代码

    黄金分割法是一种区间收缩方法。所谓区间收缩方法,指的是将含有最优解的区间逐步缩小,直至区间长度为零的方法。本文将用Java实现这一算法,需要的可以参考一下
    2022-03-03
  • Java面试题之HashMap 的 hash 方法原理是什么

    Java面试题之HashMap 的 hash 方法原理是什么

    那天,小二去蔚来面试,面试官老王一上来就问他:HashMap 的 hash 方法的原理是什么?当时就把裸面的小二给蚌埠住了,这篇文章将详细解答该题目
    2021-11-11
  • Java Guava的使用技巧整理

    Java Guava的使用技巧整理

    Guava是Google发布的一个开源库,主要提供了一些在Java开发中非常有用的工具类和API,不管是工作还是学习都是非常值得我们去熟悉的,一起来看看吧
    2023-03-03
  • java结合WebSphere MQ实现接收队列文件功能

    java结合WebSphere MQ实现接收队列文件功能

    WebSphereMQ,也称MQSeries,以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过为重要的消息和事务提供可靠的、一次且仅一次的传递,MQ可以处理复杂的通信协议,并动态地将消息传递工作负载分配给可用的资源。
    2015-10-10
  • 详解Spring-Boot中如何使用多线程处理任务

    详解Spring-Boot中如何使用多线程处理任务

    本篇文章主要介绍了详解Spring-Boot中如何使用多线程处理任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03

最新评论