2016-03-03 101 views
4

我的应用程序基于典型的三层体系结构,目标是创建一个SpringMVC站点和一个Spring Batch解决方案,用于提供和维护我们的数据库产品和库存,其中速度是一个非常重要的因素。DTO,DAO或服务层?

我使用Spring的JdbcTemplate来管理遗留数据库。我的一些表格包含很多不使用的列,并且由于某些字段(我们甚至不需要映射的斑点)的大小,检索整行已经显示出负面影响,所以我创建了一些与列我想要检索,如:

  • 产品 - 包含一个1:与存储在数据库中的字段1的关系。
  • ProductDetailsView - 包含ID,名称,价格,描述,库存。
  • ProductListItemView - Id,Price,name,stock。

DAO层将这些bean返回到服务层。据我所知创建DTO揭露它在我的服务接口产品可能是有意义的,但是,

1)什么ProductDetailsViewProductListItemView

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

3)无论如何,你会在哪里放置JSR-303注释来验证网络的输入?

回答

2

通常情况下,DTO的使用是由于将实体从视图中分离出来,然后数据库中的任何内部更改都不会影响视图或客户端,视图也不需要进行任何更改。除非你需要发送更多或不同的信息。但是你没有使用jdbctemplate使用JPA,因此你的对象可以作为DTO立即行为,因为你没有绑定到数据库模型。

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

  1. 我看到有在ProductDetailsView和ProductListItemView有列的最小数目,(可能你只是把一组),如果你认为你不会有在表的定义太大的变化,因为它们是不是那么大,你可以使用像休息存储库方法的实体对象。

  2. 预测也是一种解决相同需求的不同方法,避免将不重要的信息发送到视图,但是您将在同一个POJO中包含jackson注释和jpa注释。 (当你使用ORM时这更多)。人们不那么喜欢那样,这就是为什么创建DTO的原因。通常,JSR303注释属于'输入'对象,它们在它们到达控制器后立即进行检查,您可以使用@Validated批注在springmvc和jsr中发挥得很好,这用于属于你的端点的方法。

我觉得没有金科玉律,但我会尽力去耦数据库层的多,我可以的视图。而且,当您使用jdbcTemplate时,您不必担心带来整个表示或者对表的渴望/懒惰集合存在问题,因为您始终可以修改投影以使用获取您将使用的内容。考虑从DAO带来的DTO,你将发送到视图并使用相同的输入对象在您的CRUD操作

+1

您好,感谢您真正有用的答案,真的很感激它。 在我们使用DAO中检索到的结果作为中间DTO的情况下,我们需要服务层中的特定DTO(假设我们需要在服务层中添加一些计算的字段到实体的这些缩小版本中的一个),我们将在哪里放置以及如何在项目中命名这两种类型的DTO? 一些例子我能想到的现在: 'org.company.project.catalog.model.view.ProductListItemView' 'org.company.project.catalog.dto.ProductListItemDto' 'org.company.project。 common.dto.ProductListItemDto' – Computist

+2

如果你是我,我使用POJO将我需要的服务层(存储计算值)的所有属性+我从数据库中检索的属性,我将完全用它来调用它model.jdbc包中的数据库表的名称。我将发送给视图的DTO使用第一个POJO值来将所需值移动到表示层,并且在此DTO中定义json注释或视图注释,我将把这个DTO放入应用程序模块中的dto文件夹中包 – Koitoer