【问题标题】:Violation of DAO pattern. What to do?违反 DAO 模式。该怎么办?
【发布时间】:2015-06-03 12:26:49
【问题描述】:

我需要生成并执行一个复杂的 sql 查询,该查询将访问多个数据库以创建一些通用的report。这意味着查询与特定的DAO 对象无关。

那么我应该把执行这样一个查询并返回结果为DTO的逻辑放在哪里?如果我创建ReportDao 接口然后实现它可能会导致另一个开发人员陷入困境,因为我认为他们会期望Dao 对象与数据库中的某个表相关联。

【问题讨论】:

  • 是否会在同一个查询中访问多个数据库?还是使用多个数据库的结果?
  • @EvanKnowles 是的,这将是一个dblink 查询。
  • @user3663882 请尝试再次解释
  • 为什么访问多个表会违反 DAO 模式?
  • 据我所知,DAO 不一定要链接到特定的域类。没有域类是孤立存在的,如果假设 DAO 只包含对一个表/域类的操作,那会令人惊讶,因为操作可能与多个域类有关,因此无论你放在哪里都会被错误地放置它。最好也将 DAO 视为与某个功能领域相关的方法的集合。如果大多数 Dao 都是围绕域对象建模的,那么将不同的命名稍微不同可能是明智之举,但 ReportDao 应该没问题...

标签: java dao


【解决方案1】:

!意见警告!

DAO 不一定必须链接到特定的域类。没有域类是孤立存在的,如果假设 DAO 只包含对一个表/域类的操作,那会令人惊讶,因为操作可能与多个域类有关,因此无论你放在哪里都会被错误地放置它。最好也将 DAO 视为与某个功能领域相关的方法的集合。如果大多数 Dao 是围绕域对象建模的,那么将不同的命名稍微不同可能是明智的,但是只要我们谈论与报告/报告有关的一组方法,ReportDao 应该没问题。或者“GeneralReportDataDao”可能更好(请记住,我只有您问题中的信息可以使用,考虑类代表什么并尝试找到一个描述性的名称..)

我从在域类之后组织 DAO 的经验中看到的另一点是,与中心域类有关的 DAO 往往会变得非常大,因为中心域类通常与大量功能相关联。这不仅适用于 DAO 类,而且适用于服务等,使用相同的模式来组织功能。

我们在 Java 中主要有两种“类型”的类,我们有表示某些东西的类(包含数据的类,通常是有状态的类),以及某些东西的类(服务、dao 等,通常是无状态类)。有状态的数据类应该按照它们所代表的东西来命名和建模,即数据,而无状态的服务类应该按照功能来命名和建模。虽然尝试以与数据相同的方式组织服务很诱人,但这通常会导致代码质量不佳,大型类和功能区域分布在多个类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2022-01-23
    • 2019-01-10
    相关资源
    最近更新 更多