用代碼控制實現事物管理的另一種方式,就是通過使用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類里面,以內部類方式實現可能降低了代碼的可讀性。