日期:2014-05-16  浏览次数:20468 次

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

}