我应该如何设计我的DAO图层

时间:2013-08-30 16:27:45

标签: java oop dao spring-jdbc

让我们说我想要一个代表动物园的网页。应该有一个附件列表(大约一万个),应该可以用三种方式显示它:

  • 所有附件,
  • 仅当前登录用户标记为收藏夹的附件
  • 仅当前登录用户已注释的附件。

在所有这些情况下,列表可能太长而无法放在单个页面上,因此应使用分页栏将其分成多个页面。

为了便于搜索特定机箱,所有三种模式都应支持通过关键字进行额外过滤(机箱名称中的全文搜索)。即用户应该能够例如显示标记为收藏夹的所有机箱,其名称中包含给定的字符串。当然,列表仍然可以很大,分页也适用于此。

问题是 - 如何设计DAO层以避免代码延迟和充满条件的意大利面条代码?此外,将代码划分为抽象层/区域会很好,所以那个,例如用于构建最终SQL查询的代码不会在来自不同抽象层的许多不同类中不一致地分散。

2 个答案:

答案 0 :(得分:1)

假设传统的请求/响应Web应用程序样式是草图:

将各种过滤选项表示为支持DAO代码的类。让Web客户端指定表示过滤选项的URL参数。您需要一种方法来确保始终在每个请求中发送过滤选项,或将它们存储在用户的会话中。

将过滤参数映射到过滤选项,并将选项传递给DAO。在您的DAO查询中,将过滤选项“扩展”为适当的克劳斯数据库。

对于分页,具有分页“窗口”的概念。例如,您可以有一个表示起始行的类和要返回的行数。再次,将该类扩展为针对数据库执行的谓词。

还有其他方法可以实现这一目标(可能使用了数百万个框架中的一个),但如果我必须从头开始全部开发,我就会采用这种方法。

答案 1 :(得分:0)

由于我误读了你的标准,因此编辑我的原始答案。您的DAO将与任何其他基本DAO相同。它(基本上)将为三个查询中的每一个都有一个GET方法。如果用户想要在此之后缩小标准范围,我建议使用像DataTables.这样的jquery插件,假设在DAO方法中返回的数据量不是一些非常大的数量。该插件允许您为键入时更新的每个列添加过滤器,还具有排序,搜索和分页功能。