我已经看到并使用了大量基于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>

java – DAO模式和开放原则的更多相关文章

  1. Android – 使用ORMLite DAO作为ContentProvider

    我旁边的同事真的非常想使用Ormlite,因为他不想自己编写任何映射.我知道atleap和Android-OrmliteContentProvider项目的存在.这些只为活动提供了一个光标,我的同事希望拥有模型列表或单个模型.这可以实现吗?和Contentprovider必须使用模型.但是,使用列表等仍然可以实现相同的功能吗?将事件传递给contentobservers等活动?

  2. java – 每个’容器’类一个DAO或每个表一个DAO?

    我有一个’容器’类,其中的字段包含在几个数据库表中,我使用DAO模式来访问数据.问题是,我应该为这个“容器”类创建一个DAO,还是每个表有一个DAO并组合它们的数据更好?

  3. java – 使用DAO和Web服务的数据库插入方法的Junit测试用例

    我正在实施一个基于Web服务的大学管理系统.该系统将某些课程添加到数据库中.下面是我正在使用的代码.Course.java然后另一个文件如下CourseDaoImpl.java第三个是如下的Web服务文件,它与前两个交互并将数据添加到数据库.CourseService.java查看我的代码清单,任何机构都可以建议我如何为我的add方法编写测试用例.我是JAVA的初学者,我从朋友那里学习了这个jav

  4. Java新手 – 什么是JPA和DAO?

    我是Java的新手,我正在尝试使用servlet创建一个Web项目.我想查询我的数据库,但我想我不了解JPA和DAO的一切.我被教导过这样做:>创建类com.package.entity.User(从我的数据库生成)>创建接口com.package.dao.UserDao>创建实现UserDao的类com.package.dao.jpa.JpaUserDao>使用publicList等

  5. java中的泛型DAO

    我正在尝试在java中开发通用DAO.我尝试了以下内容.这是实现通用DAO的好方法?

  6. java swing应用程序中的服务层

    我知道将@Transactional放在DAO上是一种糟糕的方式,但此时此刻我必须编写仅用于放置@Transactional的服务…谢谢.解决方法如果您的服务层重复dao,则根本不使用服务层.我在我的一些应用程序中犯了同样的错误,我想知道“为什么服务层看起来如此丑陋,并且是复制DAO”……

  7. java-ee – 应该为DAO和Service类使用哪个CDI范围

    )继承.例如UserServiceImpl:以这种方式使用CDIDAO和Service类都将具有Dependent范围,而不像spring那样它们将是singleton.因此,每个客户端都会注入新实例.我应该将DAO和Service类的范围更改为ApplicationScope吗?一个我很乐意提出任何建议.解决方法@ApplicationScoped与Serializable无关,它们总是存在,永远不会持久存在于磁盘上.由于HTTP会话对象的行为,@SessionConcped将需要序列化.我建议使用一个

  8. java – 使用JDBC连接到不同数据库的模式

    我正在编写一个应用程序,它必须可配置为根据客户端的想法连接到Oracle,sqlServer和MySQL.到目前为止,我一直在计划使用JDBC-ODBC桥,只使用不同的连接字符串连接到数据库.我被告知这不是很有效率.>是否存在连接多个数据库系统的模式或最佳实践?

  9. 春天 – JPA和DAO – 什么是标准方法?

    我正在使用JPA/Hibernate和Spring开发我的第一个应用程序.我在DAO课上的第一次尝试看起来像这样:我还发现了一些使用JpaDaoSupport和JpaTemplate的例子.你更喜欢哪种设计?我的例子有什么问题吗?

  10. java – DAO模式和开放原则

    感谢您到目前为止的回应.我有一个想法–你对使用命令/策略模式封装数据访问请求有什么意见?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部