1

我有一个 DAO 类,它有多个方法。在每个方法中,我使用变量名“result”作为 ResultSet 和“statement”作为 PreparedStatement 和 closeResources() 方法来关闭 PreparedStatement 和连接。我使用了一个 DataManager 类,它具有 createConnection() 方法、getConnection() 方法。我的 DAO 中有 10 个 mwthods。我使用 DAO 工厂方法在 BO 中获取 DAO 对象。这是代码片段,显示为当我在 Eclipse 中运行 CPD 工具时违规。它在我的 DAO 的大约 6 到 8 个方法中显示此代码片段作为违规。

PreparedStatement statement=null;

try{

PreparedStatement statement=connection.prepareStatement(query);

//statements to set data in query

ResultSet result=statement.executeQuery();

if(result.next){

//some operation

   }
}
catch(SQLException e){

//encapsulating sql exception....


throw new BusinessException(e);

}
finally{

closeResources(connection,statement);

}

由于 DAO 中的许多方法使用相同的方法,CPD 将上述代码显示为违规,我认为您无法使这段代码更加模块化。我的问题是在许多情况下使用相同的变量名,如“result”方法是否是最佳实践。要清除违规行为,我需要将“结果”重命名为“结果1”“结果 2”等,但我觉得这些名称没有意义。

注意:我的培训即将结束。我没有在 Springs 或 Struts 上工作,我只知道 Servlets 和 JSP。我正在做一个案例研究,这是我第一次使用 PMD、CPD 工具。

4

1 回答 1

0

使用模板方法模式:

public void runQuery(Callback callback) {
    PreparedStatement statement=null;
    try{
        PreparedStatement statement=connection.prepareStatement(query);
        ResultSet result=statement.executeQuery();
        if(result.next){
            callback.onRow(result);  //crucial!
       }
    }
    catch(SQLException e){
        throw new BusinessException(e);
    }
    finally{
        closeResources(connection,statement);
    }
}

interface Callback {
    void onRow(ResultSet resultSet);
}

你使用你的方法是这样的:

runQuery(new Callback() {
    public void onRow(ResultSet result) {
        //extract one row here
    }
});

唯一改变的代码是各种Callback实现,从不同的表中提取行。一旦你熟悉了这个模式,看看JdbcTemplate哪个是围绕这个想法构建的,但功能强大得多,但仍然是低级和快速的。您不需要完整的来使用它。

于 2012-08-30T19:41:31.423 回答