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

目录
  • 批量插入数据,多重forEach循环
    • 下面是一个实际应用
  • mybatis insert 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>

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

(0)

相关推荐

  • mybatis insert foreach循环插入方式

    mybatis insert foreach循环插入 @Insert("<script>" + "insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values\n" + "<foreach collection=\"photoList\" item=\"item\" index=\"index\&q

  • MyBatis动态SQL foreach标签实现批量插入的方法示例

    需求:查出给定id的记录: <select id="getEmpsByConditionForeach" resultType="comtestbeansEmployee"> SELECT * FROM tb1_emplyee WHERE id IN <foreach collection="list" item="item_id" separator="," open="(&q

  • MyBatis 实现批量插入和删除中双层循环的写法案例

    本博客主要用两个例子来说明一下批量删除和批量插入双层循环的用法,顺便自己记录一下,方便以后使用. 1.批量删除 (1):dao中的写法: public int batchDelPrice(@Param("deleteList")List<Map<String, Object>> deleteList); 其中deleteList是一个Map的集合,Map中的Object是一个list集合,deleteList拼接如下: List<String> de

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

    目录 批量插入数据,多重forEach循环 下面是一个实际应用 mybatis insert foreach 项目场景 批量插入数据,多重forEach循环 在业务开发过程中,遇到批量插入时,需要进行多重forEach循环的情况. 下面是一个实际应用 public class SysRoleData extends DataEntity<SysRoleData> {    private static final long serialVersionUID = 1L;    private S

  • mybatis foreach批量插入数据:Oracle与MySQL区别介绍

    下面给大家介绍mybatis foreach批量插入数据:Oracle与MySQL不同点: •主要不同点在于foreach标签内separator属性的设置问题: •separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... •separator设置为"union all"分割时,最终拼接的代码形式为:insert into table

  • MyBatis批量插入数据的三种方法实例

    目录 前言 准备工作 1.循环单次插入 2.MP 批量插入 ① 控制器实现 ② 业务逻辑层实现 ③ 数据持久层实现 MP 性能测试 MP 源码分析 3.原生批量插入 ① 业务逻辑层扩展 ② 数据持久层扩展 ③ 添加 UserMapper.xml 原生批量插入性能测试 缺点分析 解决方案 总结 前言 批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 MyBat

  • Java实现mybatis批量插入数据到Oracle

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &q

  • MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    一.mybatis批量插入数据到Oracle中的两种方式: 第一种: <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item" index="index" collection="list"> INTO

  • 如何在mybatis中向BLOB字段批量插入数据

    最近接手一个需求,需要用xxl-job定时任务同步三方库中新增的数据,粗略一看挺得意,以为一两小时就搞定了,但事与愿违,编码两小时却被一个BLOB字段玩了一下午. 每次获取50条数据过来,每条数据中有一个字段是BLOB类型的图片,需求也要将图片放入数据库(个人不建议这么玩,生产上千万的数据会造成数据库很臃肿,建议放到ftp或者minio上比较好),字段中的图片过来时已经被转换成了base64的格式,在往数据库批量插入时,数据库BLOB字段对应的实体使用byte[],程序执行时报了如下错误: or

  • 浅谈MyBatis原生批量插入的坑与解决方案

    目录 原生批量插入的"坑" 解决方案 分片 Demo 实战 原生批量插入分片实现 总结 前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法!> 但之前的文章也有不完美之处,原因在于:使用 「循环单次插入」的性能太低,使用「MyBatis Plus 批量插入」性能还行,但要额外的引入 MyBatis Plus 框架,使用「MyBati

  • Springboot 手动分页查询分批批量插入数据的实现流程

    目录 前言 业务场景是什么? 正文 前言 业务场景是什么? 就是数据库的一批数据,量不少,需要执行同步插入到别的地方. 简单点肯定是一次性查出来,然后循环一个个插入,完事. 考虑点: ① 数据量大,一次性查出来操作,很爆炸. ② 循环里面一次一次地去插入,如果非业务场景必要,基本是不会在循环里面使用sql操作的. 所以该篇作为抛砖引玉(还有很多需要考虑的点),给出一种解决上面场景的代码编写方案, 手动分页,查询后批量插入. 正文 实现的流程简图: 看看最终实现的效果,通过代码日志记录了这个实现后

  • MyBatis实现批量插入方法实例

    目录 一.SQL实现示例 二.Mybatis通过Mapper.xml文件实现 三.在Mapper接口上使用注解 四.限制一次批量插入数据的数量 总结 一.SQL实现示例 假设我们只插入一条数据的时候,SQL如下 insert into table ([列名],[列名]) values ([列值],[列值])); # 或者 insert into table values ([列值],[列值])) 当插入多条数据的时候,也就是需要批量插入的时候,SQL如下 insert into table ([

  • mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

随机推荐