Java 将数据从spring DAO层返回到spring服务层

Java 将数据从spring DAO层返回到spring服务层,java,spring,spring-boot,dao,Java,Spring,Spring Boot,Dao,目前,我正在SpringDAO层方法中执行一个sql查询,该方法返回一个JavaResultSet对象。我直接将这个ResultSet对象返回到spring服务层。想知道,这是返回完整结果集的好方法吗?如果不是,那么如果我们在查询数据库时根据某些条件在结果集中得到不同的名称和列数,我们应该以什么形式将结果集返回到服务层。而不是返回结果集,您应该考虑返回集合(集,列表,等等)实体对象的定义。DAO通常会从结果集中读取,从中收集实体对象,然后将其返回到服务层。您当前正在做的是向服务层公开持久性层的实

目前,我正在SpringDAO层方法中执行一个sql查询,该方法返回一个JavaResultSet对象。我直接将这个ResultSet对象返回到spring服务层。想知道,这是返回完整结果集的好方法吗?如果不是,那么如果我们在查询数据库时根据某些条件在结果集中得到不同的名称和列数,我们应该以什么形式将结果集返回到服务层。

而不是返回
结果集
,您应该考虑返回
集合
列表
,等等)实体对象的定义。DAO通常会从
结果集
中读取,从中收集实体对象,然后将其返回到服务层。您当前正在做的是向服务层公开持久性层的实现细节。如果您将持久性更改为Hibernate,那么您也需要更改服务层


此外,如果查询从同一个表中获取不同数量的列,则可以从DAO返回不同类型的实体对象,例如
BasicUserDetails
(仅包含一组基本属性)和
UserDetails
(包含所有属性)。如果希望持久性层是动态的,则需要确保服务层了解返回的数据类型。

与其返回
结果集
,不如考虑返回实体对象的
集合(
集合
列表
,等等)。DAO通常会从
结果集
中读取,从中收集实体对象,然后将其返回到服务层。您当前正在做的是向服务层公开持久性层的实现细节。如果您将持久性更改为Hibernate,那么您也需要更改服务层


此外,如果查询从同一个表中获取不同数量的列,则可以从DAO返回不同类型的实体对象,例如
BasicUserDetails
(仅包含一组基本属性)和
UserDetails
(包含所有属性)。如果您希望持久层是动态的,您需要确保您的服务层了解返回的数据类型。

您的DAO必须返回对象的集合。不要返回结果集。
服务层是执行业务逻辑的地方。我们实际做的是创建适配器接口来访问业务对象。因此,您的服务类不应该有业务逻辑以外的任何内容

DAO必须返回对象集合。不要返回结果集。
服务层是执行业务逻辑的地方。我们实际做的是创建适配器接口来访问业务对象。因此,您的服务类不应该有业务逻辑以外的任何内容

就个人而言,我更喜欢将服务与“基础设施实现”分开,而不是在您的情况下使用jdbcTemplate查询数据库。我将在DAO(或存储库)中添加一个行映射器,并仅向服务返回域对象。通过这种方式,您可以决定在不涉及服务的情况下实现DAO(例如,传递到另一个数据库)。我不知道,在2018年,将结果集封送到POJO的想法似乎有些古怪和过时。如果我只是将其传递到前端(没有任何值类或我们称之为任何值类),可能会将其转换为json. 像这里:。如果我必须在jvm上,并且获得了完全的自由,我会在clojure中这样做,并且只使用内置的clojure数据结构。@RobertMoskal:您跳过了一层。如果您需要业务逻辑(即服务层)中的数据来做出关键决策,该怎么办?可以说,如果您有复杂的业务逻辑。但是,如果您只是对一些数据进行模板化,那么就没有了。我还要说,如果您只是转换、过滤或装饰一个结果集,那么也没有必要这样做。让100个函数在一个数据结构上工作比让10个类在10个数据结构上工作要好。就我个人而言,我更喜欢将服务与“基础设施实现”分开,而不是在您的情况下使用jdbcTemplate查询数据库。我将在DAO(或存储库)中添加一个行映射器并仅向服务返回域对象。通过这种方式,您可以决定在不涉及服务的情况下实现DAO(例如,传递到另一个数据库)。我不知道,在2018年,将结果集封送到POJO的想法似乎有些古怪和过时。如果我只是将其传递到前端(没有任何值类或我们称之为任何值类),可能会将其转换为json. 像这里:。如果我必须在jvm上,并且获得了完全的自由,我会在clojure中这样做,并且只使用内置的clojure数据结构。@RobertMoskal:您跳过了一层。如果您需要业务逻辑(即服务层)中的数据来做出关键决策,该怎么办?可以说,如果您有复杂的业务逻辑。但是,如果您只是对一些数据进行模板化,那么就没有了。我还要说,如果您只是转换、过滤或装饰一个结果集,那么也没有必要这样做。让100个函数在一个数据结构上工作比让10个类在10个数据结构上工作要好。