需要Java EE设计协助

需要Java EE设计协助,java,jakarta-ee,Java,Jakarta Ee,我在我的web应用程序中使用MVC模式。其中我有三层 控制层 管理层 道层 我使用DTO从控制层到管理器,再到Dao层,与之相反 我的问题是,DTO的主要目的是什么? 我可以使用DTO映射关系数据库表,还是应该使用“Bean” 如果在层之间使用DTO,那么如何在对象中表示数据库表,因为层之间的DTO可以包含与数据库表无关的属性。使用DTO并将其映射到数据库表中没有问题。但是您必须自己进行映射(使用JDBC、SpringJDBC等) 另一种选择是使用ORM将DTO映射到数据库。您甚至可以创建未映射

我在我的web应用程序中使用MVC模式。其中我有三层

  • 控制层
  • 管理层
  • 道层
  • 我使用DTO从控制层到管理器,再到Dao层,与之相反

    我的问题是,DTO的主要目的是什么? 我可以使用DTO映射关系数据库表,还是应该使用“Bean”


    如果在层之间使用DTO,那么如何在对象中表示数据库表,因为层之间的DTO可以包含与数据库表无关的属性。

    使用DTO并将其映射到数据库表中没有问题。但是您必须自己进行映射(使用JDBC、SpringJDBC等)

    另一种选择是使用ORM将DTO映射到数据库。您甚至可以创建未映射到表的属性。看看JPA

    这两种选择之间的选择是个人的。第一个选项一开始会更费力,而第二个选项有更大的学习曲线。如果您精通SQL,我会选择JDBC

    我的问题是,主要问题是什么 DTO的目的

    DTO的主要用途是在两层之间传输数据。除了充当装运数据的篮子之外,它没有其他真正的功能

    这就是为什么他们称之为数据传输对象

    我可以使用DTO来映射我们的关系吗 数据库表还是我应该使用 “豆子”

    无论您决定使用JavaBean格式的访问器还是您自己的访问器,都与DTO无关。转让双方必须达成一致;但是,如果您有
    setName(…)
    setter或
    name(…)
    setter,则不会影响功能

    尽管从功能的角度来说这可能无关紧要,但最好还是坚持既定的命名约定,以便在培训新的维护人员时能够轻松地重新查看代码,避免混淆。此外,一些库可能认为您正在使用bean约定(或需要它们)。如果您不确定,最好坚持使用标准JavaBean约定,因为您的新约定可能没有经过测试(或正式)

    如果我在层之间使用DTO,那么如何 我可以在中表示数据库表吗 对象,因为层之间的DTO可以 包含的属性不是 与数据库表相关


    DTO与数据库表无关。除非这是最自然的事情,否则不要让DTO看起来像数据库表。

    DTO的主要目的是减少跨层传输数据时的开销

    如果您没有DTO,那么您将拥有一个包含跨层传递的数据和逻辑的类。使用DTO可以确保只传递所需的数据,即跨层传递数据

    当然,您可以选择将DTO映射到数据库表,并使用更接近于表示域对象的bean设计。 这是一种方法

    相反,根据您的数据库设计,您的DTO可能更符合您的实际业务实体——只是没有逻辑

    我的问题是,主要问题是什么 DTO的目的

    正如扩展(数据传输对象)所暗示的那样,DTO旨在跨不同的层传输结构化数据。DTO使您能够解耦表示数据的特定于协议的实现,以便在跨层通信之前可以提取来自不同来源的数据

    例如,DTO将允许您将HttpServletRequest对象中的数据与其内部存储分离,以便您可以将数据发送到业务逻辑层中的服务。这同样适用于用于抽象从SQL查询获得的结果并驻留在ResultSet对象中的DTO。简而言之,DTO允许您在不保留源代码的情况下传输数据—您可以在处理数据时忘记HTTP响应和JDBC连接

    我可以使用DTO来映射我们的关系吗 数据库表还是我应该使用 “豆子”

    您可以采用第二种使用bean的方法。事实上,使用JPA,您根本不需要DTO。JPA管理的bean本身表示各种表中的数据,并且可以从数据库状态断开链接,以便您可以使用它们进行数据传输

    如果我在层之间使用DTO,那么如何 我可以在中表示数据库表吗 对象,因为层之间的DTO可以 包含的属性不是 与数据库表相关

    这取决于您希望如何将DTO与数据库表耦合。最好在DTO和数据库表之间有一对一的映射,并选择另一个DTO来传输与表无关的属性。毕竟,DTO和其他所有对象一样,都应该承担一项责任。如果职责是反映数据库表,那么它应该包含其他“无关”属性


    为了扩展在这种情况下使用JPA的建议,在JPA实体中使用不相关的属性是一种糟糕的设计,特别是当不相关的属性应该标记为暂时的,并且对实体的行为没有任何价值时。

    要学究的话,现在是JEE了。“2”在几年前就被删除了,很像以前的Java2,现在只是Java。