个人收藏使用
文章来自Mybatis 中传入List实现 批量插入、批量更新、批量删除 – chelsey3tsf – 博客园 (cnblogs.com)
1. 批量插入:
Mapper层:
int insertList(List list);
对应的mapper.xml:
insert into users(id, name)values(#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR})
如果List数据量比较大,可以考虑将List分批次插入
2. 批量更新:
批量更新只提供更新单个字段的,因为更新多个字段无论哪种批量更新方案,我都用起来很不舒服,所以不做提供。
Mapper层:
int updateList(List list);
对应的mapper.xml:
update agent_applyset apply_time=when id=#{item.id} then #{item.applyTime}where id in#{item.id,jdbcType=INTEGER}
3. 批量删除:
PS:一般查询出来的List都是包含对象在里面的,那么怎么清理出单独包含ID的list呢?
可以参考下面方式,第一个listData是从数据库查询出来的list数据,每个元素都是一个对象;
然后单独把里面每个元素的id给取出来放入新的list(ids)。
List listData = agentRechargeOrderServiceImpl.getListByXXXX(XXXX);List ids = listData.stream().map(AgentRechargeOrder::getId).collect(Collectors.toList());
如果不想清除出单独的id的list,直接传整个List也是可以的, 这样mapper层传值就改成对应的包含对象的List即可。
Mapper层:
int deleteMany(List ids);
对应的mapper.xml:
deletefrom agent_recharge_order where id in#{item}
最后补充个提醒:
因为批量操作会拼接成很长很长的mysql语句,所以mysql server在接收数据包的时候,对这个数据包的大小是有设置项限制的。
如果超过设置的值,就会报错:
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large
那么就需要修改这个设置项,所以推荐提前先把对应的设置值稍微弄大一点