您的位置:首页 > 娱乐 > 明星 > Mybatis批量操作

Mybatis批量操作

2024/10/5 16:28:33 来源:https://blog.csdn.net/xujinwei_gingko/article/details/142204839  浏览:    关键词:Mybatis批量操作

示例:批量insert多条语句

1、mapper文件中定义sql,your_table 要插入数据的表名,column1, column2, ... 是表中的列名,field1, field2, ... 是对应表的Entity中的属性名,执行的后生成的sql如下:

INSERT INTO your_table (column1, column2, ...) VALUES(column1, column2, ...),(...)

<insert id="batchInsert">INSERT INTO your_table (column1, column2, ...)VALUES<foreach collection="list" item="item" index="index" separator=",">(#{item.field1}, #{item.field2}, ...)</foreach>
</insert>

2、程序调用

List<YourEntity> entities = new ArrayList<>();
// 填充entities列表
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
mapper.batchInsert(entities);
sqlSession.commit();

上述程序执行后,后台只会发送1条sql语句:INSERT INTO your_table (column1, column2, ...) VALUES(column1, column2, ...),(...)

当1次插入的数据量过大,如100万,受限于网络包大小限制或者有些数据库有最大接受包的限制(如mysql 中max_allowed_packet 参数限制,默认值为4M),会出现如下sql异常:com.mysql.jdbc.PacketTooBigException

解决1次插入数据量过大问题:

解决办法,分批插入,比如每次插入200条

public void insertLargeNumberOfRecords(List<YourEntity> entities) {int batchSize = 200;int numberOfBatches = (entities.size() + batchSize - 1) / batchSize;for (int i = 0; i < numberOfBatches; ++i) {int start = i * batchSize;int end = Math.min(start + batchSize, entities.size());List<YourEntity> batchEntities = entities.subList(start, end);yourMapper.insertBatch(batchEntities);}
}

示例:批量删除

mapp文件如下:

<!-- 在Mapper XML中定义批量删除的操作 -->
<delete id="batchDelete" parameterType="list">DELETE FROM your_table WHERE id IN<foreach item="item" collection="list" open="(" separator="," close=")">#{item}</foreach>
</delete>

1次删除数据量过大问题解决办法参考【解决1次插入数据量过大问题】

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com