用代码控制实现事物管理的另一种方式,就是通过使用TransactionTemplate模板类,TransactionTemplate封装了事务管理的功能,包括异常时的事务回滚,以及操作成功后的事务提交。和JdbcTemplate一样,它使得我们无需在琐碎的try/catch/finally代码中徘徊---也就是为我们省去了部分事务提交、回滚代码。
将上面的用户信息插入方法修改成下面这样:
TransactionTemplate类的构造器需要一个TransactionCallback接口类型的参数,而抽象类TransactionCallbackWithoutResult实现了TransactionCallback接口,抽象类TransactionCallbackWithoutResult中有一个TransactionCallbackWithoutResult()方法,该方法以TransactionStatus 为参数。所以就有了下面的用内部类的实现方式。
public boolean doUpdateUserInfo(UserInfoVO oneUserInfo)
{
//定义两个sql插入语句
String sql = "update userinfo set userPassword=? where userName=?";
String sql2 = "update userinfo1 set userPassword=? where userName=?";
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult()
{
public void doInTransactionWithoutResult(TransactionStatus status)
{
this.jdbcTemplate.update(sql, new Object[]
{oneUserInfo.getUserName(),
oneUserInfo.getUserPassword()});
this.jdbcTemplate.update(sql2, new Object[]
{oneUserInfo.getUserName(),
oneUserInfo.getUserPassword()});
}
});
return true;
}
这种方式,代码量少,少了try/catch/finally语句,全部被封装在了TransactionTemplate类里面,以内部类方式实现可能降低了代码的可读性。