通过单一方法

时间:2018-04-15 20:35:41

标签: java jdbc

通过单一方法处理不同数据库操作的最优雅方法是什么? 假设有一个界面:

public interface ServiceDAO {
    void addRecord(UserRecord userRecord);
    void delRecord(UserRecord userRecord);
    void updateRecord(UserRecord oldRrecord, UserRecord newRecord);
    List<UserRecord> getAllRecords();
}

它由某个类实现,该类还具有在数据库上连接和执行语句的方法。 在这一点上,我想知道是否有一个很好的解决方案,有一个通用的方法 - 像

private Collection<UserRecord> executeStatement(<some args>)

哪个能够处理简单的SQL选择并进行更新?然后所有其他方法只需用适当的参数调用executeStatement()。 通过构建带有所有参数的SQL字符串作为纯文本,这将是一个相当简单的任务,但这是一个糟糕的方法,应该始终坚持参数化的PreparedStatements。

我正在考虑用

这样的字段创建一个对象
class SQLparameters {
    String SQL;
    ArrayList<UserRecord> records;
}

并将其传递给executeStatement(),但如果逻辑变得更复杂(即几个不同的可能UPDATE语句或带有许多参数的SELECT),我预计会出现不必要的复杂情况。

是否有任何模式可以涵盖这种情况,或者我应该简单地在上述接口的每个方法中放置单独的连接处理逻辑?

2 个答案:

答案 0 :(得分:0)

您可以使用以下伪代码

private Collection<UserRecord> executeStatement(String ... args){
    String preparedStatementSql = args[0];
    PreparedStatement preparedStatement = 
    dbConnection.prepareStatement(preparedStatementSql );
    for(int i=1;i<args.length;i++){
        preparedStatement.setObject(i,preparedStatementSql[i];
    }
    // if true, then it's select query
    if(preparedStatementSql.execute())
      return preparedStatementSql.getResultSet().convertToListOfUserRecrod();
    else
      return null;
}

请注意,这根本不是最佳做法,您不应该允许动态调用任何查询,这在连贯性,解耦和代码维护方面将是一个问题。更不用说在这里很难跟踪问题了,很多工具使用方法来检查依赖于方法名称(stacktraces)的性能问题,例如你在这里找不到&# 39; s导致性能问题的确切查询,因为很多人都抛出了这个方法。

然而,JPA实现供应商只需要编写两行代码来获得任何查询,尤其是使用复杂的查询语言(如HQL)。

答案 1 :(得分:0)

这就是Spring Templates闪耀的地方。 Spring模板(在您的案例中为JdbcTemplate)删除样板代码,资源管理和异常转换。它只是具有类似于您需要的签名,还有更多。

我建议您创建一个带有清晰界面的DAO类,并在其中包含所有JdbcTemplate用法,并且不要让SQL内容(查询和...)泄漏到代码的其他部分。因此,不要将SQL和查询暴露在DAO类的范围之外。

顺便说一下,为什么要进行更新并选择单一方法?您似乎违反了Single Responsibility Principle