我看过并处理了很多基于JDBC的旧DAO代码,通常都是以CRUD方法开始。我的问题特别关注检索方法或“查找器”。通常我发现DAO从两个方法开始:
这是一种丑陋的方法,违反了开放封闭原则。每当需要支持某个新的检索条件时,DAO类不断修改,一直都让我不爽。研究这个问题时,常常会指向存储库模式并将检索条件封装为规范或查询对象,然后将它们传递给查找器方法。但如果您拥有整个数据集的内存集合或者使用某种ORM(我正在使用旧版本的JDBC代码),那么这似乎只是可行的。
我考虑了一种解决方案,即将DAO管理的整个数据集作为内存中的集合进行惰性加载,然后使用规范模式作为检索查询。我然后在集合上实现某种观察者,只有在调用创建、更新或删除方法时才会更新数据库。但显然,性能和可扩展性会大大降低。
对此有什么想法吗?
谢谢你们迄今为止提供的回答。我有一个想法-您对使用命令/策略模式封装数据访问请求有何看法?每个具体命令可以表示一种特定的访问,并可以传递给调用者。我最终会得到众多具体命令类,但每个命令类都将专注于一种访问方式,并且应该非常易于测试和隔离。
- 查找并返回全部
- 根据唯一标识符检索特定实例
- 查找并返回满足{条件}的所有内容
这是一种丑陋的方法,违反了开放封闭原则。每当需要支持某个新的检索条件时,DAO类不断修改,一直都让我不爽。研究这个问题时,常常会指向存储库模式并将检索条件封装为规范或查询对象,然后将它们传递给查找器方法。但如果您拥有整个数据集的内存集合或者使用某种ORM(我正在使用旧版本的JDBC代码),那么这似乎只是可行的。
我考虑了一种解决方案,即将DAO管理的整个数据集作为内存中的集合进行惰性加载,然后使用规范模式作为检索查询。我然后在集合上实现某种观察者,只有在调用创建、更新或删除方法时才会更新数据库。但显然,性能和可扩展性会大大降低。
对此有什么想法吗?
谢谢你们迄今为止提供的回答。我有一个想法-您对使用命令/策略模式封装数据访问请求有何看法?每个具体命令可以表示一种特定的访问,并可以传递给调用者。我最终会得到众多具体命令类,但每个命令类都将专注于一种访问方式,并且应该非常易于测试和隔离。
public abstract class Command<R>{
public <R> execute();
public void setArguments(CommandArguments args){
//store arguments
}
}
//map based structure for storing and returning arguments
public class CommandArguments{
public String getAsString(String key);
public String getAsInt(String key);
//... others
}
//In some business class...
Command command = CommandFactory.create("SearchByName");
CommandArguments args = new CommandArguments();
args.setValue("name", name);
// others
command.setArguments(args);
List<Customer> list = command.execute();