通过跨多个私有方法使用JDBC事务来存储复杂对象会导致代码过载

时间:2016-01-11 15:23:16

标签: java jdbc transactions

我正在使用如下所述的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块。

2 个答案:

答案 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..
}