ibatis 做批量操作(含事務)
阿新 • • 發佈:2019-02-02
public class Test1 { /** * 使用iBatis進行批量操作 * @param args */ public static void main(String[] args) throws Exception{ // iBatis處理 Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); // 生成物件 List<User> list = new ArrayList<User>(); for (int i = 1; i <= 100; i++) { User u = new User(); u.setName("user" + i); u.setAge(10 + i); u.setSex("m"); list.add(u); } // 批量操作,每次儲存20條記錄,並使用事務 long t1 = System.currentTimeMillis(); for (int i = 1; i <= list.size(); i++) { if (i % 20 == 0) { updateBatch(sqlMapClient, list.subList(i - 20, i), i / 20); } } long t2 = System.currentTimeMillis(); // 計算操作用時,可以將事務去掉進行比較 System.out.println(t2 - t1); } /** * @Description: 使用iBatis進行批量操作,並且使用事務 * 此方法前兩個事務操作正常結束;第三個事務操作到一半時會丟擲異常,檢測事務是否回滾 * * @param sqlMapClient * @param users 要儲存到資料庫的使用者集合 * @param count 方法的執行次數 * @throws Exception 異常,讓方法第三次執行且操作第十條資料時丟擲異常 */ private static void updateBatch(SqlMapClient sqlMapClient, List<User> users, int count) throws Exception { try{ // 事務開始 sqlMapClient.startTransaction(); // 批量操作開始 sqlMapClient.startBatch(); for (int i = 0; i < users.size(); i++) { // 丟擲異常 if (count == 3 && i == 10) throw new RuntimeException(); // 儲存資料 sqlMapClient.insert("saveUser", users.get(i)); } // 批量操作執行 sqlMapClient.executeBatch(); // 事務提交 sqlMapClient.commitTransaction(); } catch (Exception e) { throw e; } finally { try { // 事務結束 sqlMapClient.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } }