Mybatis批量插入或更新的正确姿势

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

最近业务中用到批量插入或更新,查了一下资料。

另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042

其中stackoverflow中这个回答给了我很大启发。

https://stackoverflow.com/questions/23486547/mybatis-batch-insert-update-for-oracle

就是在映射的方法中拼接多条插入或者更新语句

但是根据后面几位的回答结合官方文档

http://www.mybatis.org/mybatis-3/java-api.html

并结合a statement的定义https://stackoverflow.com/questions/4735856/difference-between-a-statement-and-a-query-in-sql

可以看出拼接方式应该仍然是一个大的sql语句,最终可能被映射为多个PreparedStatement(我的猜测),和for循环分别执行单个插入或更新语句区别不大。

而且参考https://www.cnblogs.com/yangy608/p/3912580.html所述的MySQL和Oracle的批量插入区别可以看出可能有兼容性问题。

而且jdbc链接Url要加上 allowMultiQueries=true参数。

因此应该采用如下

https://github.com/mybatis/mybatis-3/blob/master/src/test/java/org/apache/ibatis/submitted/batch_keys/BatchKeysTest.java

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()); }}

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。

https://t.zsxq.com/Z3bAiea  申请时标注来自CSDN。

点这里可以跳转到人工智能网站