Mybatis批量操作sql写法示例(批量新增、更新)

在使用foreach时,collection属性值的三种情况:

如果传入的参数类型为List时,collection的默认属性值为list,同样可以使用@Param注解自定义keyName;

如果传入的参数类型为array时,collection的默认属性值为array,同样可以使用@Param注解自定义keyName;

如果传入的参数类型为Map时,collection的属性值可为三种情况:

1.遍历map.keys;
2.遍历map.values;
3.遍历map.entrySet()

批量Insert,参数为List<Object>

mysql的批量新增sql的写法示例,先看一下mapper的写法;

    void batchSaveUser(List<SysUser> userList);

接下来看sql如何写:

   <insert id="batchSaveUser">
       insert into sys_user (ding_user_id, username, nickname, password, email,
       mobile, avatar, creator_id, create_time, updator_id, update_time, is_delete)
       values
       <foreach collection="list" item="user" separator=",">
           (
           #{user.dingUserId}, #{user.username}, #{user.nickname}, #{user.password}, #{user.email},
           #{user.mobile}, #{user.avatar}, #{user.creatorId}, now(), #{user.updatorId}, now(), 0
           )
       </foreach>
   </insert>

批量Insert,参数为Map<Long, List<Long>>

void batchSaveGroupAndUser(@Param("map") Map<Long, List<Long>> groupUserMap);

接下来看sql如何写:

 <insert id="batchSaveGroupAndUser" parameterType="java.util.Map">
        insert into sys_group_member (group_id, user_id, creator_id, create_time)
        values
        <foreach collection="map.keys" item="groupId" separator=",">
            <foreach collection="map[groupId]" item="userId" separator=",">
                (
                #{groupId}, #{userId}, 'admin', now()
                )
            </foreach>
        </foreach>
    </insert>

批量Insert,参数为Map<String, String>

 void batchInsert(@Param("map") Map<String, String> map);
 <insert id="batchInsert" parameterType="java.util.Map">
        insert into brand_info (code, `name`, is_delete, create_time)
        values
        <foreach collection="map.entrySet()" index="key" item="value" open="(" close=")" separator=",">
            #{key}, #{value}, 0, now()
        </foreach>
    </insert>

如果是只需要遍历key,写法则是collection=“map.keys”

 <insert id="batchSave" parameterType="java.util.Map">
        insert into brand_info (code, is_delete, create_time)
        values
        <foreach collection="map.keys" item="key" open="(" close=")" separator=",">
            #{key}, 0, now()
        </foreach>
    </insert>

同理,如果是只需要遍历value,写法则是collection=“map.values”

 <insert id="batchSave" parameterType="java.util.Map">
        insert into brand_info (code, is_delete, create_time)
        values
        <foreach collection="map.values" item="value" open="(" close=")" separator=",">
            #{value}, 0, now()
        </foreach>
    </insert>

批量Update,参数为List<Object>

**注意:**在执行批量Update的时候,数据库的url配置需要添加一项参数:&allowMultiQueries=true

如果没有这个配置参数的话,执行下面的更新语句会报错:

正确的sql写法如下:

 <update id="batchUpdateCorporation" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" separator=";">
            update sys_corporation set
            <if test="item.name != null and item.name !=''">
                `name` = #{item.name},
            </if>
            <if test="item.code != null and item.code !=''">
                code = #{item.code},
            </if>
            <if test="item.parentCode != null and item.parentCode !=''">
                parent_code = #{item.parentCode},
            </if>
            updater = 'system',
            update_time = now()
            where id = #{item.id}
        </foreach>
    </update>

总结

到此这篇关于Mybatis批量操作sql写法的文章就介绍到这了,更多相关Mybatis批量操作sql内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • Mybatis 中的sql批量修改方法实现

    在项目中遇到需要批量更新的功能,原本想的是在Java中用循环访问数据库去更新,但是心里总觉得这样做会不会太频繁了,太耗费资源了,效率也很低,查了下mybatis的批量操作,原来确实有<foreach>标签可以做到. dao  层接口: public class Demo{ private int id; private String name; private String sex; } <pre name="code" class="html"&

  • MyBatis批量插入/修改/删除MySql数据

    前言 由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应该要比循环插入的效果更好,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来.供以后查阅和学习. java代码: 注意:这里循环的时候需new 出来新的对象,而不能通过循环改变属性的值就认为这是一个新的对象了,通俗的说就是new ReddemCode()要放在for循环的

  • mybatis postgresql 批量删除操作方法

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务完整性.多版本并发控制等.同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型.函数.操作符.聚集函数.索引方法.过程

  • 详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

  • mybatis学习之路mysql批量新增数据的方法

    接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. mysql新增语句 insert into 表名(字段,字段...) values ( 值,值 ...):此种适合单条插入. 批量插入,一种可以在代码中循环着执行上面的语句,但是这种效率太差,下面会有对比,看看它有多差. 另一种,可以用mysql支持的批量插入语句, insert into 表名(字段,字段...) values ( 值,值 ...),( 值,值 ...),( 值,值 ...).... 这种方式相比起来,

  • 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批量操作sql写法示例(批量新增、更新)

    在使用foreach时,collection属性值的三种情况: 如果传入的参数类型为List时,collection的默认属性值为list,同样可以使用@Param注解自定义keyName; 如果传入的参数类型为array时,collection的默认属性值为array,同样可以使用@Param注解自定义keyName; 如果传入的参数类型为Map时,collection的属性值可为三种情况: 1.遍历map.keys; 2.遍历map.values; 3.遍历map.entrySet() 批量

  • 史上最简单的MyBatis动态SQL入门示例代码

    假如有如下的关于书籍基本信息的表: DROP DATABASE IF EXISTS `books`; CREATE DATABASE `books`; USE books; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `author` varchar(64) DEFAULT NULL, `pres

  • Mybatis动态SQL的示例代码

    目录 基本流程 IF,Where Set Choose(when,otherwise) SQL片段 总结 什么是动态SQL:动态SQL就是根据不同的条件生成不同的SQL语句 基本流程 1,数据库准备一张表 2,导包 3,编写核心配置文件 4,编写实体类 5,编写实体类对应的Mapper和Mapper.xml文件 6,在核心配置文件中注册Mapper.xml 7,测试 开启自动驼峰命名规则映射 <!--开启驼峰命名映射--> <setting name="mapUnderscor

  • Oracle数仓中判断时间连续性的几种SQL写法示例

    零.需求介绍 现有一张表数据如下: 此表是一张镜像表,policyno列代表一个保单号,state列代表这个保单号在snapdate当天的最后一次状态(state每天可能会变很多次,镜像表只保留snapdate时间点凌晨的最后一次状态),snapdate代表当天做镜像的时间,现在有个需求,我们想取出来这个保单号连续保持某个状态的起止时间,例如: 保单号sm1保持状态1的起止时间为2021020120210202,然后在20210203时候变成了状态2,又在20210204时候变成了状态3,最终又

  • MyBatis 实现数据的批量新增和删除的操作

    在项目的开发中,我们经常需要对数据进行批量的操作,如:批量新增.批量删除等.下面将介绍MyBatis如何实现数据的批量新增和删除操作. 创建UserMapper接口(用户信息Mapper动态代理接口),实现用户信息的批量新增.批量删除.批量查询. package com.pjb.mapper; import com.pjb.entity.UserInfo; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.

  • 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

  • MySQL和Oracle批量插入SQL的通用写法示例

    目录 举个例子: 通用写法: 总结 举个例子: 现在要批量新增User对象到数据库USER表中 public class User{ //姓名 private String name; //年龄 private Integer age; //性别 private Integer sex } 大部分人对MySQL比较熟悉,可能觉得批量新增的SQL都是这样写,其实并不然.该写法在MySQL中没问题,而在Oracle中,这样写就会报错. MySQL写法: INSERT INTO USER (NAME,

  • Mybatis动态SQL的实现示例

    场景 在实际应用开发过程中,我们往往需要写复杂的 SQL 语句,需要拼接,而拼接SQL语句又稍微不注意,由于引号,空格等缺失可能都会导致错误. Mybatis提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容. 动态SQL标签 if 和 where 标签 <!--动态Sql : where / if--> <select id="dynamicSql" resultType="com.lks.domain.Use

  • Mybatis中使用updateBatch进行批量更新

    背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新.(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的就是一次性更新所有数据).两种方式各有利弊,下面将会对两种方式的利弊做简要分析,主要介绍第二种方式在mybatis中的实现. 逐条更新 这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控,更新失败或成功,从什么内容更新到什么内容,都可以在逻辑代码

随机推荐