DTO、DAO 或服务层?
DTO's, DAO or Service layer?
我的应用程序基于典型的 3 层架构,目标是创建一个 SpringMVC 站点和一个 Spring 批处理解决方案,用于提供和维护我们数据库的产品和库存,其中速度是一个非常重要的因素。
我正在使用 Spring 的 JdbcTemplate 来管理遗留数据库。我的一些表包含很多我不使用的列,并且由于某些字段的大小(我们甚至不需要映射的 blob),检索整行显示出负面影响,所以我创建了一些匹配的 beans我要检索的列,例如:
- Product -- 包含与存储在数据库中的字段的 1:1 关系。
- ProductDetailsView -- 包含id, name, price, description, stock.
- ProductListItemView -- Id, Price, name, stock.
DAO层returns这些bean到服务层。 AFAIK 创建一个 DTO 以在我的 Product 服务接口中公开它可能有意义,但是,
1) ProductDetailsView 和 ProductListItemView 呢?
2) 我是否应该将这些 'views' 或 'projections' 映射到具有相同属性的 DTO?为什么?
3) 在任何情况下,您会在哪里放置 JSR-303 注释来验证 Web 的输入?
通常使用 DTO 是为了将实体与视图分离,然后数据库中的任何内部更改都不会影响视图,或者客户端和视图根本不需要更改。除非您需要发送更多或不同的信息。但是您没有使用 JPA,而是使用 jdbctemplate,因此您的对象可以立即充当 DTO,因为您没有绑定到数据库模型。
对于 Product 实体,创建 DTO 似乎是一个好方法,因为您的视图对象只是存储在数据库中的整个对象的部分表示。
我看到 ProductDetailsView 和 ProductListItemView 中有最少的列数,(可能你只是放了一组),如果你认为你不会对 tables,因为它们不是那么大,您可以像使用 rest 存储库方法一样使用实体对象。
Projections 也是解决相同需求的不同方法,避免将无关紧要的信息发送到视图,但您将在同一个 POJO 中包含 jackson 注释和 jpa 注释。 (这在您使用 ORM 时更多)。人们不太喜欢那样,这就是创建 DTO 的方法的原因
通常JSR303注解属于'input'对象,它们一到达控制器就检查,你可以使用与springmvc配合得很好的@Validated
注解和 jsr,这用于属于您的端点的方法中。
我认为没有黄金法则,但我会尽可能多地解耦数据库层的视图。当您使用 jdbcTemplate 时,您不必担心带来完整的表示或 table 的 eager/lazy 集合有问题,因为您始终可以修改投影以使用 get 您将使用的内容。考虑从 DAO 中获取要发送到视图的 DTO,并在 CRUD 操作中将其用作输入对象
我的应用程序基于典型的 3 层架构,目标是创建一个 SpringMVC 站点和一个 Spring 批处理解决方案,用于提供和维护我们数据库的产品和库存,其中速度是一个非常重要的因素。
我正在使用 Spring 的 JdbcTemplate 来管理遗留数据库。我的一些表包含很多我不使用的列,并且由于某些字段的大小(我们甚至不需要映射的 blob),检索整行显示出负面影响,所以我创建了一些匹配的 beans我要检索的列,例如:
- Product -- 包含与存储在数据库中的字段的 1:1 关系。
- ProductDetailsView -- 包含id, name, price, description, stock.
- ProductListItemView -- Id, Price, name, stock.
DAO层returns这些bean到服务层。 AFAIK 创建一个 DTO 以在我的 Product 服务接口中公开它可能有意义,但是,
1) ProductDetailsView 和 ProductListItemView 呢?
2) 我是否应该将这些 'views' 或 'projections' 映射到具有相同属性的 DTO?为什么?
3) 在任何情况下,您会在哪里放置 JSR-303 注释来验证 Web 的输入?
通常使用 DTO 是为了将实体与视图分离,然后数据库中的任何内部更改都不会影响视图,或者客户端和视图根本不需要更改。除非您需要发送更多或不同的信息。但是您没有使用 JPA,而是使用 jdbctemplate,因此您的对象可以立即充当 DTO,因为您没有绑定到数据库模型。
对于 Product 实体,创建 DTO 似乎是一个好方法,因为您的视图对象只是存储在数据库中的整个对象的部分表示。
我看到 ProductDetailsView 和 ProductListItemView 中有最少的列数,(可能你只是放了一组),如果你认为你不会对 tables,因为它们不是那么大,您可以像使用 rest 存储库方法一样使用实体对象。
Projections 也是解决相同需求的不同方法,避免将无关紧要的信息发送到视图,但您将在同一个 POJO 中包含 jackson 注释和 jpa 注释。 (这在您使用 ORM 时更多)。人们不太喜欢那样,这就是创建 DTO 的方法的原因
通常JSR303注解属于'input'对象,它们一到达控制器就检查,你可以使用与springmvc配合得很好的
@Validated
注解和 jsr,这用于属于您的端点的方法中。
我认为没有黄金法则,但我会尽可能多地解耦数据库层的视图。当您使用 jdbcTemplate 时,您不必担心带来完整的表示或 table 的 eager/lazy 集合有问题,因为您始终可以修改投影以使用 get 您将使用的内容。考虑从 DAO 中获取要发送到视图的 DTO,并在 CRUD 操作中将其用作输入对象