基于回调方式的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 最终可能抛出的异常