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\" separator=\",\">\n" +
            "\t(#{appealId},#{item})\n" +
            "</foreach>" +
            "</script>")
//@Insert("insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values(#{appealId},#{appealPhotoPath})")
void addAppealPhoto(AppealPhoto appealPhoto);

foreach语句批量插入数据

本例技术:Spring+SpringMVC+MyBatis+Oracle

问题描述:

需要将程序里的一个集合保存到数据库里,集合的类型对应数据库的一个实体,若在程序里遍历集合再一条条保存到数据库表中有点麻烦,这里可以利用MyBatis 的 foreach语句实现批量插入数据。

核心代码清单:

Item(实体类):

public class Item {
    private String itemCode;//项目代码
    private String itemName;//项目名称
    private String itemValue;//项目值(多个值用逗号隔开)
    private String itemCategory;//项目所属类别

    public String getItemCode() {
        return itemCode;
    }

    public void setItemCode(String itemCode) {
        this.itemCode = itemCode;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemValue() {
        return itemValue;
    }

    public void setItemValue(String itemValue) {
        this.itemValue = itemValue;
    }

    public String getItemCategory() {
        return itemCategory;
    }

    public void setItemCategory(String itemCategory) {
        this.itemCategory = itemCategory;
    }
}

Service实现层方法:

    public Integer submitItem(List<Item> list ){
        return researchMapper.submitItem(list);
    }

MyBatis的mapper配置文件的语句

在Oracle数据中,多条数据之间用union all 连接,MySQL数据库用:

 <insert id="submitItem"  parameterType="java.util.List">
        insert into ITEM (
        ITEM_CODE,
        ITEM_NAME,
        ITEM_VALUE,
        ITEM_CATAGORY
        )
        select  item.* from
        (
        <foreach collection="list" item="item" index="index" separator="UNION ALL" >
            select
            #{item.itemCode,jdbcType=VARCHAR},
            #{item.itemName,jdbcType=VARCHAR},
            #{item.itemValue,jdbcType=VARCHAR},
            #{item.itemCategory,jdbcType=VARCHAR}
            from dual
        </foreach>
        ) item
    </insert>
<!--MySql写法-->
<insert id="submitItem"  parameterType="java.util.List">
    insert into ITEM (
    ITEM_CODE,
    ITEM_NAME,
    ITEM_VALUE,
    ITEM_CATAGORY
    )
    values
    <foreach collection="list" item="item" index="index" separator="," >
      (
        #{item.itemCode,jdbcType=VARCHAR},
        #{item.itemName,jdbcType=VARCHAR},
        #{item.itemValue,jdbcType=VARCHAR},
        #{item.itemCategory,jdbcType=VARCHAR}
     )
    </foreach>
</insert>

foreach元素解析:

foreach元素是一个遍历集合的循环语句,它支持遍历数组,List和Set接口的集合。

foreach元素中,collection是传进来的参数名称,可以是一个数组或者List、Set等集合;

item是循环中当前的元素(配置的item的名字随意取,类似于iterator);

index是当前元素在集合中的位置下标;

seperator是各个元素的间隔符;

()分别是open和close元素,表示用什么符号将这些集合元素包装起来。

注意:由于一些数据库的SQL对执行的SQL长度有限制,所以使用foreach元素的时候需要预估collection对象的长度;foreach除了用于本示例的循环插入,亦可用于构建in条件中(可自行尝试)。

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

(0)

相关推荐

  • Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    最近做一个批量导入的需求,将多条记录批量插入数据库中. 解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入.期间遇到了"SQL 命令未正确结束 "的错误,最终解决,记录下来供以后查阅和学习. 首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach

  • mybatis-plus  mapper中foreach循环操作代码详解(新增或修改)

    .循环添加 接口处: 分别是 void 无返回类型 :有的话是(resultType)返回类型,参数类型(parameterType) list , 如: 在mapper文件中分别对应ID,参数类型和返回类型. 循环处理,如下: <insert id="insertPack" parameterType="java.util.List"> insert into t_ev_bu_pack ( PACK_CODE, BIN, PACK_PROD_TIME,

  • 解决mybatis使用foreach批量insert异常的问题

    异常 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version fo

  • 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 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的xml Service类 测试类 测试结果 结论 前言 数据库使用的是SQLServer,JDK版本1.8,运行在SpringBoot环境下 对比3种可用的方式: 反复执行单条插入语句 xml拼接sql 批处理执行 先说结论:少量插入请使用反复插入单条数据,方便.数量较多请使用批处理方式.(可以考虑以有需求的插入数据量20条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要) 无论何时都不用xml拼接sql的方式. 代码 拼接SQL的xml newI

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

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

  • 利用Mybatis向PostgreSQL中插入并查询JSON字段

    目录 应用场景介绍 数据insert 数据select BATCH 批量插入 前言: 这里我使用的是TimescaleDB,加了一个时间戳字段,不过没差.关于PostgreSQL中Json数据类型的操作,可以参考官网. 应用场景介绍 将TCP发过来的数据包(通过消息队列发过来)解析出数据(一个数据包含有多帧,一帧中含有多条信息),并和本地规则表的格式对应起来.以JsonLineMsg实体类代表对应的一帧数据: package tsdb.entity; import lombok.AllArgsC

  • mybatis多个区间处理方式(双foreach循环)

    目录 mybatis多个区间处理 思路 多个foreach同时使用问题 应用场景 注意事项 解决方案 mybatis多个区间处理 如图:要实现车辆数不同区间查询条件 思路 a.前端传数组,数组里面放"1-5"String类型值             b.后端mybatis用双foreach循环解析     后端代码如下: <!--图例车辆数区间--> <if test="countCargoList != null and countCargoList.s

  • Mybatis三种批量插入数据的方式

    1. 循环插入 mapper.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.buhe.

  • Mybatis两种不同批量插入方式的区别

    目录 前言 测试 拼接 sql batch插入 数据对比 总结 前言 本文使用 Mybatis 进行批量插入,比较两种不同的插入方式的区别. 测试 批量插入注意事项: 1.连接数据库时添加参数 allowMultiQueries=true,支持多语句执行,批处理 2.数据库是否支持大量数据写入,设置 max_allowed_packet参数保证批次提交的数据量 拼接 sql public void batchDemo() { long start = System.currentTimeMill

  • 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

随机推荐