DTO,DAO或服务层?

时间:2016-03-03 15:52:58

标签: java spring architecture n-tier-architecture

我的应用程序基于典型的3层架构,目标是创建一个SpringMVC站点和一个Spring Batch解决方案,该解决方案可以提供和维护我们数据库的产品和库存,其中速度是一个非常重要的因素。

我正在使用Spring的 JdbcTemplate 来管理旧数据库。我的一些表包含许多我不使用的列,并且由于某些字段的大小(我们甚至不需要映射的blob),检索整行显示了负面影响,所以我创建了一些与之匹配的bean我想要检索的列,例如:

  • 产品 - 包含与数据库中存储的字段的1:1关系。
  • ProductDetailsView - 包含ID,名称,价格,说明,股票。
  • ProductListItemView - ID,价格,名称,股票。

DAO层将这些bean返回给服务层。 AFAIK创建DTO以在产品的服务界面中公开它可能有意义,但是,

1) ProductDetailsView ProductListItemView 怎么样?

2)我应该从这些“视图”或“投影”到具有相同属性的DTO进行1:1映射吗?为什么呢?

3)在任何情况下,您会在哪里放置 JSR-303 注释来验证网络的输入?

1 个答案:

答案 0 :(得分:2)

通常使用DTO是因为实体与视图分离,然后数据库中的任何内部更改都不会影响视图,或者客户端和视图根本不需要更改。除非您需要发送更多或不同的信息。但是您没有使用JPA,而是使用jdbctemplate,因此您的对象可以立即作为DTO执行,因为您不依赖于数据库模型。

对于Product实体,似乎创建DTO是一种很好的方法,因为您的视图对象只是存储在数据库中的整个对象的部分表示。

  1. 我看到ProductDetailsView和ProductListItemView中有最小数量的列,(可能你只是放了一个集合),如果你认为你的表定义没有太大的变化,因为它们不是如此之大,您可以使用实体对象,如休息存储库方法。

  2. 投影也是一种不同的方法来解决相同的要求,避免向视图发送无关紧要的信息,但您将在同一个POJO中包含jackson注释和jpa注释。 (当您使用ORM时更多)。人们不喜欢这么多,这就是创建DTO的方法

  3. 通常JSR303注释属于'输入'对象,一旦它们到达控制器就会检查,你可以使用与springmvc和jsr非常匹配的.mobilenav.mobilenavclose { height: 100vh; background: #5aaafa; width: 0vw; margin: 0px; animation: closeHamburger; animation-duration: 0.7s; position: absolute; z-index: 10; } 注释,这用于属于你的端点的方法。

  4. 我认为没有黄金法则,但我会尝试尽可能多地解耦数据库层的视图。当您使用jdbcTemplate时,您不必担心带来整个表示或者表的急切/懒惰集合有问题,因为您始终可以修改投影以使用获取您将使用的内容。考虑从DAO带来您将发送到视图的DTO,并将其用作CRUD操作中的输入对象