加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – DAO模式和开放原则

发布时间:2020-12-14 16:22:21 所属栏目:Java 来源:网络整理
导读:我已经看到并使用了大量基于JDBC的DAO代码,通常以CRUD方法开始.我的问题具体涉及检索方法或“查找者”.通常我发现的是,DAO开始有两种方法: 查找并返回ALL 基于唯一标识符检索特定实例 通常情况下,这两个发现者不足.我通常最终看到一个DAO类反复修改,以添加f
我已经看到并使用了大量基于JDBC的DAO代码,通常以CRUD方法开始.我的问题具体涉及检索方法或“查找者”.通常我发现的是,DAO开始有两种方法:

>查找并返回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();

解决方法

我们已经将iBatis用于我们的数据层ORM,并且可以通过将参数对象传递给您可能希望用作参数的各种字段来实现您在一个查询中提出的内容.

然后在您的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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读