MyBatis批量插入和删除

本文详细介绍使用MyBatis进行批量插入和批量更新的具体方法,包括XML映射文件中的元素配置,如foreach、if和trim标签的使用,适用于需要高效处理大量数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.批量插入:

<insert id="insertRecord">
        INSERT INTO tb_record(
        detail,
        status
        ) VALUES
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.detail},
            #{item.status}
            )
        </foreach>
</insert>
复制代码

2.批量更新:

<update `id`="updateInfo">
        UPDATE tb_info
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="detail =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.detail!=null">
                        when id=#{item.id} then #{item.detail}
                    </if>
                </foreach>
            </trim>
            <trim prefix="city =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.city!=null">
                        when id=#{item.id} then #{item.city}
                    </if>
                </foreach>
            </trim>
        </trim>
        WHERE
        <foreach collection="list" separator="or" item="item" index="index" >
            id=#{item.id}
        </foreach>
</update>
复制代码

转载于:https://juejin.im/post/5cff0debf265da1bc5525975

<think>根据用户的问题,用户希望了解MyBatis批量插入批量删除的实现方法。结合提供的引用内容,我将整理出具体的实现方式,包括XML配置接口方法的定义。同时,我会注意使用正确的LaTeX格式,并生成相关问题。 ### 批量插入的实现 在MyBatis中,批量插入通常使用`<foreach>`标签来遍历集合,生成多条插入语句。具体实现方式如下: 1. **接口方法定义**: 在Mapper接口中定义一个方法,参数为需要插入的实体列表。 ```java int batchInsert(@Param("list") List<User> list); ``` 2. **XML映射配置**: 在映射文件中,使用`<insert>`标签,并在其中使用`<foreach>`标签来遍历列表,生成插入语句。根据不同的数据库语法,有两种常见的写法: **方式一:使用`VALUES`后跟多个元组(适用于大多数数据库,如MySQL)**: ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (id, user_name, user_password, user_address) VALUES <foreach collection="list" item="item" index="index" separator=","> (#{item.id}, #{item.userName}, #{item.userPassword}, #{item.userAddress}) </foreach> </insert> ``` **方式二:使用`UNION ALL`(适用于Oracle等数据库)**: ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (id, user_name, user_password, user_address) <foreach collection="list" item="item" index="index" separator="union all"> SELECT #{item.id}, #{item.userName}, #{item.userPassword}, #{item.userAddress} FROM DUAL </foreach> </insert> ``` 注意:方式二中的`FROM DUAL`是Oracle的伪表,其他数据库可能需要调整。 ### 批量删除的实现 批量删除通常使用`IN`语句,结合`<foreach>`标签生成条件。 1. **接口方法定义**: ```java int batchDelete(@Param("list") List<String> idList); ``` 2. **XML映射配置**: ```xml <delete id="batchDelete" parameterType="java.util.List"> DELETE FROM user WHERE id IN <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </delete> ``` ### 注意事项 1. **性能考虑**:批量操作时,如果数据量非常大(例如上万条),建议分批进行,避免SQL语句过长导致数据库性能下降或报错。 2. **事务管理**:确保批量操作在一个事务中执行,这样可以在出错时回滚。 3. **数据库支持**:不同的数据库对批量插入的语法支持不同,需根据实际使用的数据库调整SQL语句。 ### 示例代码 以下是一个完整的示例,包括批量插入批量删除: **Mapper接口**: ```java public interface UserMapper { int batchInsert(@Param("list") List<User> userList); int batchDelete(@Param("list") List<String> idList); } ``` **映射文件(XML)**: ```xml <!-- 批量插入(MySQL语法) --> <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (id, user_name, user_password, user_address) VALUES <foreach collection="list" item="item" index="index" separator=","> (#{item.id}, #{item.userName}, #{item.userPassword}, #{item.userAddress}) </foreach> </insert> <!-- 批量删除 --> <delete id="batchDelete" parameterType="java.util.List"> DELETE FROM user WHERE id IN <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </delete> ``` ### 引用说明 在实现批量操作时,MyBatis的`<foreach>`标签是关键,它能够动态生成SQL语句。具体用法参考了引用[1]、[2][4]中的示例[^1][^2][^4]。对于Oracle数据库的批量插入,引用[1]提供了使用`UNION ALL``FROM DUAL`的方式[^1]。批量删除则参考了引用[1][4]中的`IN`语句结合`<foreach>`的方式[^1][^4]。 §§相关问题§§ 1. MyBatis批量插入时如何避免SQL语句过长? 2. 在MyBatis中,如何实现批量更新操作? 3. MyBatis批量操作时如何管理事务?</think>### MyBatis 批量插入批量删除实现方法 #### 一、批量插入实现 1. **接口方法定义** 在Mapper接口中声明方法: ```java int batchInsert(@Param("list") List<User> userList); ``` 2. **XML映射配置** **方式一:VALUES多值语法(推荐用于MySQL等)** ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user(id, user_name, user_password) VALUES <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.userName}, #{item.userPassword}) </foreach> </insert> ``` *说明*:适用于支持`VALUES (..), (..), (..)`语法的数据库,单次执行插入所有数据[^2][^4]。 **方式二:UNION ALL语法(Oracle适用)** ```xml <insert id="batchInsert"> INSERT INTO custinfo(serialid, custid, invnm) <foreach collection="list" item="item" separator="union all"> SELECT #{item.serialid}, #{item.custid}, #{item.invnm} FROM DUAL </foreach> </insert> ``` *说明*:Oracle不支持多值`VALUES`语法,需用`SELECT ... FROM DUAL`模拟[^1]。 #### 二、批量删除实现 1. **接口方法定义** ```java int batchDelete(@Param("ids") List<String> idList); ``` 2. **XML映射配置** ```xml <delete id="batchDelete"> DELETE FROM user WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> ``` *说明*:通过`IN`语句实现批量删除,`<foreach>`生成`(id1, id2, ...)`格式[^1][^4]。 #### 三、关键注意事项 1. **性能优化** - 批量操作单次提交数据量建议控制在500-1000条 - 特大批量数据需分批次提交(避免SQL过长) - 添加`rewriteBatchedStatements=true`参数(MySQL可提升10倍性能) 2. **事务控制** 在Service层添加事务注解,确保操作原子性: ```java @Transactional public void batchProcess(List<User> users) { userMapper.batchInsert(users); // 其他操作... } ``` 3. **特殊语法处理** - Oracle批量插入需用`UNION ALL`[^1] - 日期字段需显式转换: `TO_TIMESTAMP(#{item.time}, 'syyyy-mm-dd hh24:mi:ss.ff')` - PostgreSQL需使用`unnest()`函数处理数组 #### 四、完整示例 ```java // Mapper接口 public interface UserMapper { int insertUsers(@Param("list") List<User> users); int deleteUsers(@Param("ids") List<Long> ids); } ``` ```xml <!-- 批量插入 --> <insert id="insertUsers"> INSERT INTO t_user(name, age) VALUES <foreach collection="list" item="u" separator=","> (#{u.name}, #{u.age}) </foreach> </insert> <!-- 批量删除 --> <delete id="deleteUsers"> DELETE FROM t_user WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> ``` > **重要提示**:不同数据库的批量操作语法差异较大,需根据实际数据库类型调整实现方式[^1][^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值