通过单一方法处理多个数据库操作的优雅方式



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

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字符串将是一项相当简单的任务,但这是一种糟糕的方法,应该始终坚持使用参数化的PreparedStatement。

我正在考虑创建一个带有以下字段的对象

class SQLparameters {
String SQL;
ArrayList<UserRecord> records;
}

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

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

您可以使用以下伪代码

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;
}

请注意,这根本不是最佳实践,您不应该允许动态调用任何查询,这将在一致性、解耦和代码维护方面成为一个问题。更不用说很难在这里跟踪问题,很多工具使用方法检查取决于方法名称(堆栈跟踪)的性能问题,例如,在这里您将无法找到导致性能问题的确切查询,因为其中很多都抛出了此方法。

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

这就是春季模板的亮点。Spring 模板(在您的情况下JdbcTemplate)删除了样板代码、资源管理和异常翻译。它只是具有类似于您需要的签名,还有更多。

我建议你创建一个具有清晰接口的DAO类,并将所有JdbcTemplate用法包装在其中,并且不要让SQL的东西(查询和...)泄漏到代码的其他部分。因此,不要公开超出 DAO 类范围的 SQL 和查询。

顺便问一下,为什么要在一种方法中进行更新和选择?看来你违反了Single Responsibility Principle.

最新更新