1. 程式人生 > >Mybatis批量插入或更新的正確姿勢

Mybatis批量插入或更新的正確姿勢

最近業務中用到批量插入或更新,查了一下資料。

其中stackoverflow中這個回答給了我很大啟發。

就是在對映的方法中拼接多條插入或者更新語句

但是根據後面幾位的回答結合官方文件

可以看出拼接方式應該仍然是一個大的sql語句,最終可能被對映為多個PreparedStatement(我的猜測),和for迴圈分別執行單個插入或更新語句區別不大。

而且jdbc連結Url要加上 allowMultiQueries=true引數。

因此應該採用如下

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