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

在项目的开发中,我们经常需要对数据进行批量的操作,如:批量新增、批量删除等。下面将介绍MyBatis如何实现数据的批量新增和删除操作。

创建UserMapper接口(用户信息Mapper动态代理接口),实现用户信息的批量新增、批量删除、批量查询。

package com.pjb.mapper;

import com.pjb.entity.UserInfo;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 用户信息Mapper动态代理接口
 * @author pan_junbiao
 **/
@Repository
public interface UserMapper
{
    /**
     * 批量新增用户
     */
    @Insert({"<script>",
            "INSERT INTO tb_user(user_name,remark) VALUES",
                "<foreach collection='userInfoList' item='item' index='index' separator=','>",
                    "(#{item.userName},#{item.remark})",
                "</foreach>",
            "</script>"})
    public int addUserBatch(@Param("userInfoList") List<UserInfo> userInfoList);

    /**
     * 批量删除用户
     */
    @Delete({"<script>",
            "DELETE FROM tb_user WHERE user_id IN",
                "<foreach item='id' index='index' collection='array' open='(' separator=',' close=')'>",
                    "#{id}",
                "</foreach>",
            "</script>"})
    public int deleteUserBatch(int[] userIds);

    /**
     * 批量获取用户
     */
    @Select({"<script>",
                "SELECT * FROM tb_user WHERE user_id IN",
                "<foreach item='id' index='index' collection='array' open='(' separator=',' close=')'>",
                    "#{id}",
                "</foreach>",
            "</script>"})
    public List<UserInfo> getUserBatch(int[] userIds);
}

 

1、批量新增

@Autowired
private UserMapper userMapper;

/**
 * 批量新增用户
 * @author pan_junbiao
 */
@Test
public void addUserBatch()
{
    //创建新用户列表
    List<UserInfo> userInfoList = new ArrayList<UserInfo>();
    userInfoList.add(new UserInfo("pan_junbiao的博客_01","您好,欢迎访问 pan_junbiao的博客"));
    userInfoList.add(new UserInfo("pan_junbiao的博客_02","https://blog.youkuaiyun.com/pan_junbiao"));
    userInfoList.add(new UserInfo("pan_junbiao的博客_03","您好,欢迎访问 pan_junbiao的博客"));
    userInfoList.add(new UserInfo("pan_junbiao的博客_04","https://blog.youkuaiyun.com/pan_junbiao"));
    userInfoList.add(new UserInfo("pan_junbiao的博客_05","您好,欢迎访问 pan_junbiao的博客"));

    //执行批量新增操作
    int count = userMapper.addUserBatch(userInfoList);

    //打印结果
    System.out.println("执行结果:成功新增" + count + "条数据!");
}

执行结果:

 

2、批量查询

@Autowired
private UserMapper userMapper;

/**
 * 批量获取用户
 * @author pan_junbiao
 */
@Test
public void getUserBatch()
{
    //用户编号数组
    int[] userIds = new int[]{1,2,3,4,5};

    //执行批量获取操作
    List<UserInfo> userInfoList = userMapper.getUserBatch(userIds);

    //打印结果
    userInfoList.stream().forEach(System.out::println);
}

执行结果:

 

3、批量删除

@Autowired
private UserMapper userMapper;

/**
 * 批量删除用户
 * @author pan_junbiao
 */
@Test
public void deleteUserBatch()
{
    //用户编号数组
    int[] userIds = new int[]{1,2,3,4,5};

    //执行批量删除操作
    int count = userMapper.deleteUserBatch(userIds);

    //打印结果
    System.out.println("执行结果:成功删除" + count + "条数据!");
}

执行结果:

 

### MyBatis实现批量更新删除的方法 #### 批量更新的实现方法 在 MyBatis 中,可以通过 `<foreach>` 标签来实现批量更新操作。以下是具体的实现方式: ```xml <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> UPDATE table_name SET column1 = #{item.column1}, column2 = #{item.column2} WHERE id = #{item.id} </foreach> </update> ``` 上述代码展示了如何通过 `foreach` 遍历传入的参数列表,并为每一条记录生成单独的 `UPDATE` SQL 语句[^5]。 为了优化性能并减少数据库连接开销,可以使用分号 (`;`) 将多条 `UPDATE` 语句分开,在支持批处理的 JDBC 数据库驱动下一次性提交所有更新请求[^4]。 --- #### 批量删除实现方法 对于批量删除操作,通常会基于某些条件(如主键集合)来进行删除。以下是一个典型的批量删除实现示例: ```xml <delete id="batchDelete" parameterType="java.util.List"> DELETE FROM table_name WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> ``` 此代码片段利用了 `IN` 子句配合 `foreach` 来动态构建符合条件的 ID 列表,从而完成批量删除操作[^3]。 需要注意的是,当数据量较大时,建议分批次进行删除以避免单次事务占用过多资源或超时风险。 --- #### 使用 Trim 标签增强灵活性 除了基本的 `foreach` 外,还可以结合 `trim` 标签进一步提升 SQL 构建能力。例如,在复杂条件下需要动态拼接字段名及其对应的值时可采用这种方式: ```xml <update id="dynamicBatchUpdate" parameterType="java.util.Map"> UPDATE table_name <set> <if test="map.containsKey('column1')"> column1 = #{map['column1']}, </if> <if test="map.containsKey('column2')"> column2 = #{map['column2']} </if> </set> WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </update> ``` 这里的 `trim` 被隐含于 `<set>` 标签内部自动移除多余逗号。 --- #### 注意事项 - **JDBC 支持**:确保所使用的数据库驱动程序支持批量操作功能。 - **SQL 注入防护**:尽量避免直接嵌套字符串变量到 SQL 文本中;推荐始终使用占位符 `${}` 或者预编译参数 `#{}` 的形式绑定实际值[^2]。 - **事务管理**:由于批量操作涉及多次 DML 操作,因此需合理配置事务边界以免部分失败影响整体一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值