MyBatis实现批量修改的三种办法

本文介绍了三种方法来批量修改MySQL数据库中用户表中学生的班级信息。第一种是在服务层循环处理,但效率低下;第二种尝试在MyBatis中使用批量更新,需要特殊配置;第三种采用SQL的CASE函数,通过一次性执行更新解决了问题。实体类包含id、name和classroom字段,Mapper层的方法接收学生列表和班级信息,Mapper.xml文件中利用FOR-EACH标签构建更新语句。通过这种方法,可以高效地更新大量数据。

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

需求:
前端传入List集合对象,实现批量修改。

现实例子:

在用户表中,有字段id,name,classroom,录数据的时候,classroom是空的,只录了id和name信息,现在通过导入id和classroom的excel表格,批量修改学生的classroom值。

思路:

方法一:在service层对List集合进行for循环,每一条记录调用一次MySQL数据库。但是这样对于数据量大的情况下会大大消耗连接数据库的性能。

方法二:在MyBatis的xml文件中使用循环,每条语句用" ;"号隔开,使用事务监控语句执行的情况。但这样会直接报错,因为MyBatis默认不支持批量update语句的,要在连接JDBC的连接信息中加入一下字段:&allowMultiQueries=true。

方法三:使用case函数,将数据同时执行可以解决1的问题,本案例使用这种方法。

case函数语法
1.修改一个参数:

update tab_student set
	classroom = case id
		when 1 then "one"
		when 2 then "tow"
		when 3 then "three"
	end
where id in (1,2,3)

2.修改多个参数:

update tab_student set
	classroom = case id
		when 1 then "classroom1"
		when 2 then "classroom2"
		when 3 then "classroom3"
	end,
	name = case id
		when 1 then "name1"
		when 2 then "name2"
		when 3 then "name3"
	end
where id in (1,2,3)

解释:

通过id值修改classroom值,
当id=1时classroom=one;
当id=2时classroom=tow;
当id=3时classroom=three;

通常id和classroom都是用循环得出具体值

实体类:

public class Student{
    @ApiModelProperty(name="id",value="id")
    private Long id;
    @ApiModelProperty(name="name",value="名称")
    private String name;
    @ApiModelProperty(name="classroom",value="班级")
    private String classroom;

Mapper层:

Integer importInfo(@Param("students")List<Student> students,@Param("classroom")String classroom);

Mapper.xml文件:

<update id="importInfo">
        update tab_student set
        <foreach collection="students" item="student" open="classroom= case id" close="end">
            when #{student.id} then #{student.classroom}
        </foreach>
        where id in
        <foreach collection="students" item="student" open="(" close=")" separator=",">
            #{student.id}
        </foreach>
    </update>

用过MyBatis.log查看语句执行情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值