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