Mybatis批量插入或更新的正確姿勢
阿新 • • 發佈:2019-02-01
最近業務中用到批量插入或更新,查了一下資料。
其中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()); } }