编程语言
首页 > 编程语言> > java – DTO,DAO还是服务层?

java – DTO,DAO还是服务层?

作者:互联网

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

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

> Product – 包含与DB中存储的字段的1:1关系.
> ProductDetailsView – 包含id,名称,价格,描述,股票.
> ProductListItemView – Id,价格,名称,股票.

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

1)ProductDetailsView和ProductListItemView怎么样?

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

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

解决方法:

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

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

>我看到ProductDetailsView和ProductListItemView中有最小数量的列,(可能你只是放了一个集合),如果你认为你在表的定义上没有太大的变化,因为它们不是那么大你可以使用实体对象就像休息库方法一样.
>预测也是一种不同的方法来解决相同的要求,避免向视图发送无关紧要的信息,但您将在同一个POJO中包含jackson注释和jpa注释. (当您使用ORM时更多).人们不喜欢这么多,这就是创建DTO的方法
>通常JSR303注释属于’input’对象,只要它们到达控制器就会检查,你可以使用与Springmvc和jsr一起使用的@Validated注释,这在属于你的端点的方法中使用.

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

标签:java,spring,architecture,n-tier-architecture
来源: https://codeday.me/bug/20190702/1355361.html