1. 程式人生 > >ibatis 做批量操作(含事務)

ibatis 做批量操作(含事務)

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

}