Mybatis批量更新,批量删除

简介: Mybatis批量更新,批量删除



Mybatis批量更新

1、单个字段批量更新

<!--批量更新用户预约状态-->
    <update id="batchUpdateReserveStatus" parameterType="java.util.List">
        update dm_simulator_reserve_user
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="reserve_status =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.reserveStatus !=null and item.reserveStatus != -1">
                        when id=#{item.id} then #{item.reserveStatus}
                    </if>
                </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
    </update>

image.gif

代码转化成sql如下:

update dm_simulator_reserve_user 
set reserve_status =
case when id=? then ? when id=? then ? end 
where id in ( ? , ? )

image.gif

2、多个字段批量更新

<update id="updateBatch" parameterType="java.util.List">
    update t_user
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="STATUS =case" suffix="end,">
            <foreach collection="list" item="i" index="index">
                <if test="i.status!=null">
                    when USER_ID=#{i.userId} then #{i.status}
                </if>
            </foreach>
        </trim>
        <trim prefix=" OPERATE_TIME =case" suffix="end,">
            <foreach collection="list" item="i" index="index">
                <if test="i.operateTime!=null">
                    when USER_ID=#{i.userId} then #{i.operateTime}
                </if>
            </foreach>
        </trim>
        <trim prefix="OPERATOR =case" suffix="end," >
            <foreach collection="list" item="i" index="index">
                <if test="i.operator!=null">
                    when USER_ID=#{i.userId} then #{i.operator}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" separator="or" item="i" index="index" >
        USER_ID=#{i.userId}
    </foreach>
</update>

image.gif

trim标签的使用

MyBatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

属性 描述
prefix

给sql语句拼接的前缀

表示在trim包裹的SQL前添加指定内容

suffix

给sql语句拼接的后缀

表示在trim包裹的SQL末尾添加指定内容

prefixOverrides

表示去掉(覆盖)trim包裹的SQL的指定首部内容

去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"

suffixOverrides

表示去掉(覆盖)trim包裹的SQL的指定尾部内容

去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

Mybatis批量删除

1、传数组

int deleteByBatch(String[] array);
    <delete id="deleteByBatch" parameterType="java.lang.String">
        delete from t_enterprise_output_value
        where OUTPUT_ID IN
        <foreach collection="array" item="outputId" open="(" separator="," close=")">
            #{outputId}
        </foreach>
    </delete>

image.gif

2、传map

<delete id="deleteByRole" parameterType="java.util.Map">
        DELETE
        FROM
        t_user_role
        <where>
            <if test="userIdList != null">
                USER_ID IN (#{userIdList,jdbcType=VARCHAR})
            </if>
            <if test="roleId != null">
                AND ROLE_ID=#{roleId,jdbcType=VARCHAR}
            </if>
            <if test="sysCode != null">
                AND SYSCODE=#{sysCode}
            </if>
        </where>
    </delete>

image.gif

3、多参数批量删除示例

如果删除不是以主键为条件,而是多个条件同时成立才可以删除

<delete id="deleteByUserIdSysRoleBatch">
    delete from t_user_role
    where SYSCODE = #{sysCode,jdbcType=VARCHAR} AND ROLE_ID = #{roleId,jdbcType=VARCHAR} AND USER_ID IN
    <foreach collection="userIds" item="item" index="index" open="(" separator="," close=")">
        #{item}
    </foreach>
</delete>
<delete id="deleteUserJob" parameterType="java.util.List">
    delete from sys_user_job where
    <foreach collection="list" item="item" separator=" or " index="index">
        (user_id = #{item.userId} and job_id= #{item.jobId})
    </foreach>
</delete>

image.gif

备注

Mybatis:通过on duplicate key update实现批量插入或更新

https://blog.csdn.net/fly910905/article/details/104004165

参考链接: https://www.cnblogs.com/javalanger/p/10899088.html


目录
相关文章
|
SQL Java 数据库连接
Mybatis实战练习六【批量删除&Mybatis参数传递】(下)
Mybatis实战练习六【批量删除&Mybatis参数传递】
|
SQL XML 安全
mybatis批量更新数据三种方法效率对比【Mysql】
mybatis批量更新数据三种方法效率对比【Mysql】
3444 0
mybatis批量更新数据三种方法效率对比【Mysql】
|
Oracle Java 关系型数据库
mybatis批量删除Batch delete
mybatis批量删除Batch delete
mybatis批量删除Batch delete
|
6月前
|
SQL Java 数据库连接
MyBatis SQL 批量更新(代码➕案例)
MyBatis SQL 批量更新(代码➕案例)
948 0
|
SQL 存储 Java
Mybatis实战练习六【批量删除&Mybatis参数传递】(上)
Mybatis实战练习六【批量删除&Mybatis参数传递】
|
7月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
88 0
|
SQL Java 数据库连接
MyBatis查询接收数据 批量删除
MyBatis查询接收数据 批量删除
217 0
|
Oracle 关系型数据库 MySQL
mybatis执行批量更新batch update 的方法(oracle,mysql)
mybatis执行批量更新batch update 的方法(oracle,mysql)
1281 0
|
SQL Java 数据库连接
【Mybatis】Mybatis中特殊SQL的执行,模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
【Mybatis】Mybatis中特殊SQL的执行,模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
105 0
|
SQL Java 数据库连接
八、MyBatis使用in进行列表中数据的批量删除
以删除age in (20,43,99)的数据项为例。很明显此时不可以使用#{},因为这样的话执行的sql语句就变成了这样
260 0
八、MyBatis使用in进行列表中数据的批量删除