zoukankan      html  css  js  c++  java
  • Mybatis批量insert 返回主键值和foreach标签详解

    Mybatis批量insert 返回主键

    Mybatis从3.3.1版本开始,支持批量插入后返回主键ID。首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不支持生成自增主键的数据库使用selectKey标签。类似《MyBatis 返回insert操作主键》中单条插入。

    使用批量插入,可以减少和数据库交互的次数,但是,数据量应该做一个控制,和for循环类似。首先定义Java Bean Instance:

    import java.io.Serializable;

    /**

     * 实例表实体类

     */

    public class Instance implements Serializable {

        private static final long serialVersionUID = 2288066394131442938L;

        private Long instanceId;

        private String infos;

        private String createTime;

        private String updateTime;

        // omit getter, setter and toString()

    }

    DAO层:

    int addInstances(List<Instance> instanceDtos);

    函数返回值是int类型,表示影响的行数。mapper中SQL写法类似于执行单条insert操作,只是使用了foreach标签:

    <insert id="addInstances" parameterType="list" useGeneratedKeys="true" keyProperty="instanceId">

       insert into instance (infos,create_time,update_time)

       values

        <foreach collection="list" item="myEg" index="index" separator=",">

             (#{myEg.infos},now(),now())

         </foreach>

     </insert>

    执行后,自增长的id都可以从instanceDtos中找到。由于myEg对应于Java对象,所以,读取其中的infos属性时,需要使用myEg.infos。

    MyBatis foreach标签详解

    下面梳理一下foreach标签。foreach主要用于构建in条件,它可以在SQL语句中迭代入参List或者Array。属性主要有 item,index,collection,open,separator,close,解释如下:

    item表示集合中每一个元素进行迭代时的别名,便于在foreach中使用;

    index指定一个名字,用于标志当前迭代位置;

    open表示该语句以什么开始,如拼凑in子语句的左括号“(”;

    separator分隔符,表示每次迭代之间以什么符号分隔;

    close表示以什么结束,如拼凑in子语句的右括号“)”。

    在所有属性中,最复杂非collection属性莫属,该属性在foreach标签中必须指定的。在不同情况下,该属性的值是不一样的,主要有以下3种情况:

    1.若传入的是单参数且参数类型是List,则collection属性值为list;

    2.若传入的是单参数且参数类型是Array数组,则collection的属性值为array;

    3.若传入的参数是多个,则把它们封装成Map,当然单参数也可以封装成Map,collection的属性值为Map中的key;

    上一节中,addInstances函数的入参只有一个,且是List,所以,collection属性值为list。如下函数

    List<Instance> getInstanceInfo(new Long[]{1L, 3L});

    请求的时候,SQL如下:

    <select id="getInstanceInfo" resultType="list">

        SELECT instance_id "instanceId", infos

          FROM instance

         WHERE instance_id IN

        <foreach item="oneId" index="index" collection="array"

            open="(" separator="," close=")" >

            #{oneId}

        </foreach>

    </select>

    oneId表示一个具体的元素,所以,用#{oneId}直接读取就行。

  • 相关阅读:
    Eclipse Alt + / 快捷键失效
    oracle nvl()函数
    搭建spring boot项目
    Maximum call stack size exceeded
    vue混入函数问题
    ASP.NET Core 2.0中的Azure Blob存储
    如何在ASP.NET Core 2.0中使用Razor页面
    将参数传递给ASP.NET Core 2.0中的中间件
    使用.net core在Ubuntu构建一个TCP服务器
    如何在ASP.NET Core Web API测试中使用Postman
  • 原文地址:https://www.cnblogs.com/east7/p/10260408.html
Copyright © 2011-2022 走看看