Mybatis批量插入或更新的正确姿势
大家好,又见面了,我是你们的朋友全栈君。
一、背景
最近业务中用到批量插入或更新,查了一下资料。
另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042
二、搜索
2.1 第一种写法
其中stackoverflow中这个回答给了我很大启发。
https://stackoverflow.com/questions/23486547/mybatis-batch-insert-update-for-oracle
就是在映射的方法中拼接多条插入或者更新语句
1 批量更新
<foreach collection="attendingUsrList" item="model" separator=";">
UPDATE parties SET attending_user_count = #{model.attending_count}
WHERE fb_party_id = #{model.eid}
</foreach>
2 批量插入
<insert id="insertAccountabilityUsers" parameterType="AccountabilityUsersModel" useGeneratedKeys="false">
INSERT INTO accountability_users
(
accountability_user_id, accountability_id, to_username,
record_status, created_by, created_at, updated_by, updated_at
)
VALUES
<foreach collection="usersList" item="model" separator=",">
(
#{model.accountabilityUserId}, #{model.accountabilityId}, #{model.toUsername},
'A', #{model.createdBy}, #{model.createdAt}, #{model.updatedBy}, #{model.updatedAt}
)
</foreach>
</insert>
参考
https://www.cnblogs.com/yangy608/p/3912580.html
所述的MySQL和Oracle的批量插入区别可以看出可能有兼容性问题(使用Oracle 的同学重点参考下)
而且jdbc链接Url要加上 allowMultiQueries=true参数。
2.2 第二种写法
还可以采用下面的写法:
mybatis官方示例所示的方式来批量插入或者更新应该是最正确的用法。
@Test
public void testInsertWithMapper() {
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
Mapper userMapper = sqlSession.getMapper(Mapper.class);
User user1 = new User(null, "Pocoyo");
userMapper.insert(user1);
User user2 = new User(null, "Valentina");
userMapper.insert(user2);
sqlSession.flushStatements();
assertEquals(new Integer(50), user1.getId());
assertEquals(new Integer(50), user2.getId());
sqlSession.commit();
}
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<User> users = sqlSession.selectList("select");
Assert.assertTrue(users.size() == 2);
}
}
另外openSession方法第二个参数是设置是否自动提交,可以设置为flase。
这里提到拿到批量更新结果的方式支持拿到批量结果。
另外这里提供批量执行的结果的打印函数
public void printBatchResults(List<BatchResult> results) {
if (results.size() > 0) {
StringBuilder sb = new StringBuilder();
sb.append("Batch summary:\n");
for (int i = 0; i < results.size(); i++) {
BatchResult result = results.get(i);
sb.append("Result ").append(i).append(":\t");
sb.append(result.getSql().replaceAll("\n", "").replaceAll("\\s+", " ")).append("\t");
sb.append("Update counts: ").append(Arrays.toString(result.getUpdateCounts())).append("\n");
}
logDebug("082", sb.toString());
}
}
3、结论
如果你使用的是 MySQL 直接使用第二部分 2.1部分的写法,给出的通过 在 XML 定义批量语句的方式即可。
如果想获得更好的兼容性,可以采用 2.2 部分的写法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207179.html原文链接:https://javaforall.cn
相关文章
- elasticsearch批量插入数据的时候出现java.net.SocketTimeoutException: 30,000 milliseconds timeout on connection「建
- 求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
- 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项
- 如何每日自动更新快递状态?如何批量查快递?
- mybatis-plus批量插入你用对了吗
- MyBatis框架:第二章:传统mybatis的hello world 示例
- MyBatis框架:第十一章:mybatis 逆向工程
- MyBatis框架:第十章:mybatis缓存
- MyBatis框架:第六章:mybatis的核心配置
- mybatis做批量删除时写SQL语句时遇到的问题
- MyBatis框架:第二章:传统mybatis的hello world 示例
- maven项目使用mybatis插件Free Mybatis plugin「建议收藏」
- Python批量修改文件名,文件再多也只要一秒,省时又不闹心
- mybatis批量update的时候失败,解决办法
- mybatis使用in语句,拼接逗号的使用、拼接sql语句实现批量插入、批量更新的案例处理
- Excel中批量填充公式有5个方法
- LinkedIn领英批量撤回未通过好友邀请
- MyBatis批量插入返回主键详解编程语言
- MyBatis配置文件(mybatis-config.xml)
- Linux 批量操作:从零开始。(linux批量操作)
- Linux下的批量重命名(批量重命名linux)
- 批量管理Linux服务器:一种更高效的解决方案(linux批量管理)
- MySQL批量修改,轻松搞定数据库管理(mysql批量修改数据库)
- Redis集群极速处理大批量数据(redis集群批量处理)
- 用asp实现的代码批量修改程序,fso相关
- ecshop批量上传(加入自定义属性)
- python使用循环实现批量创建文件夹示例