在Dorado提供默認(rèn)的提交操作中,用戶可能會(huì)有其他自定義的數(shù)據(jù)更新操作,如何使他們都處于一個(gè)事務(wù)中呢?
方法一: 使用標(biāo)準(zhǔn)的JDBC對(duì)象完成數(shù)據(jù)操作.
Dorado提供了一個(gè)工具類,com.bstek.dorado.common.TransactionManager,該類提供一個(gè)靜態(tài)方法:
Transaction getTransaction(DoradoContext context) throws java.lang.Exception
獲取與指定的上下文(DoradoContext)相關(guān)的事務(wù)對(duì)象.
這樣我們得到一個(gè)默認(rèn)的處理事務(wù)對(duì)象,通過(guò)該事務(wù)對(duì)象提供的方法:
Connection getConnection(java.lang.String dataSource) throws java.lang.Exception
獲取一個(gè)與本事務(wù)相關(guān)的Connection,自定義的更新就通過(guò)這個(gè)Connection對(duì)象處理,最后系統(tǒng)會(huì)自動(dòng)管理整個(gè)事務(wù)。
代碼示例:
Transaction transaction = TransactionManager.getTransaction(context);
Connection connection = transaction.getConnection(null);

try
{
// 利用connection對(duì)象進(jìn)行數(shù)據(jù)操作.
}

finally
{
connection.close();
}

注意 |
該Connection 對(duì)象,你可以執(zhí)行close操作,但是不允許執(zhí)行commit或rollback操作。因?yàn)?/SPAN>commit或rollback操作將在系統(tǒng)所有更新完成之后才允許進(jìn)行, commit或rollback操作是由Transaction對(duì)象管理的。
即使您在Transaction執(zhí)行commit之前對(duì)Connection執(zhí)行了close操作也不會(huì)影響到你在該Connection上所作得數(shù)據(jù)修改. 您不必?fù)?dān)心由于提前關(guān)閉了Connection而導(dǎo)致所作的數(shù)據(jù)修改脫離了事務(wù). |
方法二: 使用標(biāo)準(zhǔn)的dorado的Dataset和DBStatement對(duì)象完成數(shù)據(jù)操作.
除了使用上面的方法之外, 我們還可以使用dorado中提供的Dataset和DBStatement對(duì)象完成數(shù)據(jù)操作. 這種做法優(yōu)點(diǎn)在于:
1. 可直接集成Context中的當(dāng)前事務(wù), 代碼量小.
2. 支持命名參數(shù), 使用方便.
使用SqlDataset添加記錄的代碼示例:
AutoSqlDataset dataset = new AutoSqlDataset();
dataset.setOriginTable("employee"); //設(shè)置要操作的數(shù)據(jù)庫(kù)表名
dataset.setKeyFields("employee_id"); //設(shè)置該表的主鍵(在更新或刪除記錄時(shí)必須設(shè)置)

dataset.insertRecord(); //插入一條空記錄
// 以下代碼設(shè)置新記錄的值
dataset.setString("employee_id", "GUOLIWEI");
dataset.setString("employee_name", "國(guó)蒞偉");
dataset.setBoolean("sex", false);

dataset.insertRecord(); //插入另一條空記錄
// 以下代碼設(shè)置新記錄的值
dataset.setString("employee_id", "PANLONG");
dataset.setString("employee_name", "盤龍");
dataset.setBoolean("sex", true);

dataset.update(context); //將所做的修改更新到數(shù)據(jù)庫(kù)中

使用DBStatement對(duì)象的代碼示例:
DBStatement statement = new DBStatement(
null, "INSERT INTO LOG (MSG_TIME, MSG) VALUES (:timestamp, :message)");
ParameterSet parameters = statement.parameters();

//添加一條記錄
parameters.setDate("timestamp", new Date());
parameters.setString("message", "XXX XXX XXX");
statement.execute(context);

//添加另一條記錄
parameters.setDate("timestamp", new Date());
parameters.setString("message", "YYY YYY YYY");
statement.execute(context);