前言
基于mybatis实现的批量插入和更新
由于直接执行批量所有数据可能会出现长度超出报错问题,使用如下方式即可解决
实现
原理还是分配执行,这里的100就是设定每次执行最大数
java
/**
* 封装使用批量添加或修改数据库操作
*
* @param list 集合
* @param insertFunc 需要执行的任务 (Consumer lambda表达式方法引用的任务目标)
* @param <T> 自定义类型
*/
public static <T> void insertBatch(List<T> list, Consumer<List<T>> consumer, boolean asyn) {
int max = 100; // 每次批量限制数
if (list.size() > max) {
List<List<T>> allList = new ArrayList<>();
List<T> tempList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
tempList.add(list.get(i));
if ((i % max) == 0) {
allList.add(tempList);
tempList = new ArrayList<>();
}
}
if (tempList.size() > 0) {
allList.add(tempList);
}
if(asyn) {
// 多线程遍历(异步)-这里直接遍历无需accept(接口式方法简化)
allList.parallelStream().forEach(consumer);
}else {
// 多线程遍历(同步)-这里直接遍历无需accept(接口式方法简化)
allList.forEach(consumer);
}
} else {
// 执行泛型集合数据
consumer.accept(list);
}
}
使用
xml
这里使用插入作为例子,也可以使用批量更新
xml
<insert id="insertBatchUser">
insert into sys_user(
name,
sex
)values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name}, #{item.sex})
</foreach>
</insert>
更新的写法
xml
<update id="updateBatchUser">
<foreach collection="list" item="item" index="index" separator=";">
update sys_user
<set>
<if test="item.name != null and item.name != ''">
name = #{item.name},
</if>
update_date = #{item.updateDate}
<where>
id = #{item.id}
</where>
</set>
</foreach>
</update>
批量数据
java
List<UserBean> list = new ArrayList<>();
UserBean user1 = new UserBean();
user1.setName("张三");
user1.setSex("男");
UserBean user2 = new UserBean();
user2.setName("李四");
user2.setSex("男");
list.add(user1);
list.add(user2);
调用
java
// 执行批量插入或修改
Consumer<List<UserBean>> consumer = v -> dao.insertBatchUser(v);
insertBatch(list, consumer, true)