我正在使用如下所述的jdbc事务:JDBC Transaction example来存储复杂的对象及其关系。例如,为了存放汽车,我打电话给public
"一般方法"需要存储轮子,引擎,汽车本身等...它将这些任务委托给私有方法,它通过连接。如果在某个步骤出现问题,则抛出异常会被公共方法捕获并执行回滚。
例如:
public boolean saveCar(Car car){
Connection con = null;
try{
con = ....//get connection
con.setAutoCommit(false);
storeCar(car, con);
storeWheels(car, con);
storeEngine(car, con);
con.commit();
} catch(Exception e){
e.printStackTrace();
con.rollback();
} finally {
con.close();
}
}
private void storeWheels(Car car, Connection con) throws Exception{
String sql = "...";
PreparedStatement ps = con.prepareStatement(sql);
ps.executeUpdate;
}
但我也需要关闭PreparedStatement
。它应该在finally
子句中关闭,所以我必须编写我的私有方法:
private void storeWheels(Car car, Connection con) throws Exception{
String sql = "...";
PreparedStatement ps = null;
try{
ps = con.prepareStatement(sql);
ps.executeUpdate;
} catch (Exception e) {
throw new Exception("Something went wrong");
} finally {
ps.close();
}
}
太多try-catch
它使我的代码容易出错并且过载。从catch块中抛出Exception并不好看。我的问题是如何能够或者可以按照我的描述委派这些任务,并避免在每个私有方法中使用不必要的try-catch
块。
答案 0 :(得分:0)
您可以存储Engine
而不预先存储Car
吗?同样的问题适用于其他所有组件。如果必须在创建Car
的同时创建所有这些组件,则应将这些组件的逻辑放在saveCar
内。如果没有,你的逻辑仍然有点模糊",因为你是单独创建的 - 而你可能会对更新操作感到困惑,这在某些时候可以共享相同的代码。
注意:我认为传递Connection
对象不是一个好主意。虽然这没有什么不妥,但是当程序增长时(如果有的话)在某些时候获得未发布资源的不便之处。把它视为"一个好的做法",如果它是可以理解/可维护的,那么你不能做的事情。
答案 1 :(得分:0)
找到这个美丽的图书馆DBUtils,它解决了我的问题:
private QueryRunner runner = new QueryRunner(); //creating global runner object which used across all methods in my class
public boolean saveCar(Car car){
Connection con = null;
try{
con = ....//get connection
con.setAutoCommit(false);
storeCar(car, con);
storeWheels(car, con);
storeEngine(car, con);
DbUtils.commitAndCloseQuietly(con);
} catch(Exception e){
DbUtils.rollbackAndCloseQuietly(con);
}
}
private void storeWheels(Car car, Connection con) throws Exception{
String sql = "...";
runner.update(connection, sql); //all functionality encapsulated, performing update, closing statement, etc..
}