基于回调方式的Spring+iBatis实现批量处理
基于回调方式的Spring+iBatis实现
如果观察过Spring的源代码,你一定知道,Spring为了保持事务统一控制,在实现ORM框架时通常都采用了回调模式,从而避免了事务代码入侵的可能!
修改后的代码如下:
@SuppressWarnings("unchecked")
public void create(final List<Reply> replyList) {
// 执行回调
sqlMapClientTemplate.execute(new SqlMapClientCallback() {
// 实现回调接口
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
// 开始批处理
executor.startBatch();
for (Reply reply : replyList) {
// 插入操作
executor.insert("Reply.create", reply);
}
// 执行批处理
executor.executeBatch();
return null;
}
});
}
注意,待遍历的参数replyList需要加入final标识!即,待遍历对象不能修改!
引用
public void create(final List<Reply> replyList)
public void updateMai(final List<MailContext> list) {
try
{
final HashMap<String, Object> map = new HashMap<String, Object>();
this.getSqlMapClientTemplate().execute(new SqlMapClientCallback()
{
public Object doInSqlMapClient( SqlMapExecutor executor) throws SQLException
{
executor.startBatch();
for(int i=0;i<list.size();i++)
{
map.put("id",list.get(i).getId());
map.put("title",list.get(i).getTitle());
executor.update("MailContext.UPDATE_MAILCONTEXTLIST", map);
}
executor.executeBatch();
return null;
}
});
}
catch (Exception ex){
ex.printStackTrace();
}
}
需在service增加回滚操作 @Transactional(rollbackFor = Exception.class)
这样做,就将事务处理的控制权完全交给了Spring!
简述:
- SqlMapClientCallback 回调接口
- doInSqlMapClient(SqlMapExecutor executor) 回调实现方法
- DataAccessException 最终可能抛出的异常
浙公网安备 33010602011771号