博客
关于我
Mybatis批量insert 返回主键值和foreach标签详解
阅读量:424 次
发布时间:2019-03-06

本文共 1894 字,大约阅读时间需要 6 分钟。

 

Mybatis批量insert 返回主键

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

使用批量插入,可以减少和数据库交互的次数,但是,数据量应该做一个控制,和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}直接读取就行。

转载地址:http://rfbuz.baihongyu.com/

你可能感兴趣的文章
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>
NO.23 ZenTaoPHP目录结构
查看>>
no1
查看>>
NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
查看>>
NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
查看>>
NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
查看>>
node exporter完整版
查看>>
node HelloWorld入门篇
查看>>
Node JS: < 一> 初识Node JS
查看>>
Node JS: < 二> Node JS例子解析
查看>>
Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
查看>>
Node 裁切图片的方法
查看>>
Node+Express连接mysql实现增删改查
查看>>
node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
查看>>
Node-RED中Button按钮组件和TextInput文字输入组件的使用
查看>>
vue3+Ts 项目打包时报错 ‘reactive‘is declared but its value is never read.及解决方法
查看>>
Node-RED中Switch开关和Dropdown选择组件的使用
查看>>
Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本
查看>>
Node-RED中使用JSON数据建立web网站
查看>>
Node-RED中使用json节点解析JSON数据
查看>>