在Dorado提供默认的提交操作中,用户可能会有其他自定义的数据更新操作,如何使他们都处于一个事务中呢?
方法一: 使用标准的JDBC对象完成数据操作.
Dorado提供了一个工具类,com.bstek.dorado.common.TransactionManager,该类提供一个静态方法:
Transaction getTransaction(DoradoContext context) throws java.lang.Exception
获取与指定的上下文(DoradoContext)相关的事务对象.
这样我们得到一个默认的处理事务对象,通过该事务对象提供的方法:
Connection getConnection(java.lang.String dataSource) throws java.lang.Exception
获取一个与本事务相关的Connection,自定义的更新就通过这个Connection对象处理,最后系统会自动管理整个事务。
代码示例:
Transaction transaction = TransactionManager.getTransaction(context);
Connection connection = transaction.getConnection(null);
try {
// 利用connection对象进行数据操作.
}
finally {
connection.close();
}
注意 |
该Connection 对象,你可以执行close操作,但是不允许执行commit或rollback操作。因为commit或rollback操作将在系统所有更新完成之后才允许进行, commit或rollback操作是由Transaction对象管理的。
即使您在Transaction执行commit之前对Connection执行了close操作也不会影响到你在该Connection上所作得数据修改. 您不必担心由于提前关闭了Connection而导致所作的数据修改脱离了事务. |
方法二: 使用标准的dorado的Dataset和DBStatement对象完成数据操作.
除了使用上面的方法之外, 我们还可以使用dorado中提供的Dataset和DBStatement对象完成数据操作. 这种做法优点在于:
1. 可直接集成Context中的当前事务, 代码量小.
2. 支持命名参数, 使用方便.
使用SqlDataset添加记录的代码示例:
AutoSqlDataset dataset = new AutoSqlDataset();
dataset.setOriginTable("employee"); //设置要操作的数据库表名
dataset.setKeyFields("employee_id"); //设置该表的主键(在更新或删除记录时必须设置)
dataset.insertRecord(); //插入一条空记录
// 以下代码设置新记录的值
dataset.setString("employee_id", "GUOLIWEI");
dataset.setString("employee_name", "国莅伟");
dataset.setBoolean("sex", false);
dataset.insertRecord(); //插入另一条空记录
// 以下代码设置新记录的值
dataset.setString("employee_id", "PANLONG");
dataset.setString("employee_name", "盘龙");
dataset.setBoolean("sex", true);
dataset.update(context); //将所做的修改更新到数据库中
使用DBStatement对象的代码示例:
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);