>查找并返回ALL
>基于唯一标识符检索特定实例
通常情况下,这两个发现者不足.我通常最终看到一个DAO类反复修改,以添加finder方法,如下所示:
>找到并返回ALL where {condition}
当需要支持新的{conditions}或修改现有方法以添加新参数作为标志来修改方法中的SQL查询以支持附加条件时,会发生什么更多的方法.
这是一个丑陋的做法,违反了开放原则.一旦需要支持新的检索条件,我们一直认为DAO类不断修改.关于这个问题的研究经常指向我的Repository Pattern,并将检索条件封装为Specifications或Query对象,然后将它们传递给finder方法.但是,如果您有整个数据集的内存中集合,或者如果您使用某种ORM(我正在使用旧的JDBC代码),这似乎是可行的
我已经考虑过一个解决方案,它将整个DAO管理的数据集加载到内存中,然后使用规范模式作为查询查询.然后我在集合上实现一些观察者,只需在创建,更新或删除方法时更新数据库.但显然性能和可扩展性受到很大影响.
有什么想法吗?
感谢您到目前为止的回应.我有一个想法 – 你对使用命令/策略模式封装数据访问请求有什么意见?每个具体命令可以表示特定类型的访问,并可以传递给Invoker.我最终会得到许多具体的Command Command类,但是每一个都将只关注一种访问,并且应该是非常可测试和隔离的.
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();
解决方法
然后在您的WHERE子句中,您可以将每个字段指定为条件子句,但只能在参数对象中填充.如果param obj中只有一个字段不为null,那么唯一一个将用于过滤结果的字段.
因此,如果您需要向参数添加字段,那么只需更改sql和paramObj.然后,您可以根据传递的参数的组合,使用2种方法返回ALL或一个子集,或至少这种方法会减少所需查询的数量.
例如沿着…的一些东西
SELECT * FROM MY_TABLE WHERE FIELD_ZERO = paramObj.field0 <isNotNull property="paramObj.field1">AND FIELD_ONE = paramObj.field1</isNotNull> <isNotNull property="paramObj.field2">AND FIELD_TWO = paramObj.field2</isNotNull> <isNotNull property="paramObj.field3">AND FIELD_THREE = paramObj.field3</isNotNull>