在实际生产开发中,我们都知道,DB是影响响应速度的主要原因之一,因此都会选择尽可能减少操作DB的次数,所以在批量操作数据库时,都会选择一些方式去尽可能优化。
实体类为:
@Data
public class User {
private Long userId;
private String name;
private String gender;
private Date createTime;
}
UserMapper中的方法声明:
// 批量插入
int batchInsertUser(List users);
// 批量更新
int batchUpdateUser(List users);
批量插入对应的xml中SQL语句的拼接如下:
insert into tb_user (
user_id, name, gender, create_time
) values
(
#{user.userId},
#{user.name},
#{user.gender},
sysdate()
)
其中,
表示迭代的数据源从哪来,如果mapper接口的方法入参设置了变量别名,必须与其一致,否则,写list,Mybatis默认为list。
循环中迭代的变量,就是Java中增强for循环的变量定义类似。
循环的索引,表示第几次循环
分割器,拼接的SQL语句中需要用啥拼接就写啥,在插入中,value内,每组值用“,”分开,所以此处用“,”。
批量更新跟相对复杂,因为更新时,需要匹配到指定的数据记录,才能进行。
主要思想是使用case when关键字,最后拼接成一条SQL语句执行。
update tb_user
when user_id = #{user.userId} then #{user.name}
when user_id = #{user.userId} then #{user.gender}
update_time = sysdate()
where
user_id = #{user.userId}
前缀,通常就是需要修改字段对应数据库表中的字段名。
后缀,每次循环结束,添加“end,”关键字,并且每个case之间用逗号隔开。
进行list中每个对象的属性判断,先判断该属性对象是否为空,不为空时,若是整型,判断是否为0,若是字符串,判断是否为空。切记!!不能把字符串判断是否为0,否则报错。
更新操作比较繁琐,需要更新多少个字段,就要写多少个trim。
这种拼接成一条SQL语句执行的方式也存在不足,当List足够大时(大约拼接的SQL占用内存为10M左右时),会报错。最佳的方式是用mybatis-plus的批量操作,其底层设定了一次操作的最大记录为1000。当然,也可以参照mybatis-plus的思路对Mybatis进行定制化,需要自己写点Java代码处理。