文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-29 02:15

关注

今天小编给大家分享一下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,在批量插入时从而形成多重循环。 

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

上图为列表页面,

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

上图为添加页面。部门名称和品牌,品类名称支持多选,而在保存时,需要将其拆分保存。在查询时通过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 &lsquo;statusInfoId&rsquo; not found. Available parameters are [collection, list]

  @Mapperpublic 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>

以上就是“MyBatis怎么实现批量插入数据,多重forEach循环”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯