Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用dao体系结构讨论最佳实践_Java_Spring_Dao_Genericdao - Fatal编程技术网

Java 通用dao体系结构讨论最佳实践

Java 通用dao体系结构讨论最佳实践,java,spring,dao,genericdao,Java,Spring,Dao,Genericdao,我想做这个架构 genericdao+接口-->服务层+接口-->视图层 我的dao将只有泛型方法,例如,我的服务层将有真正的逻辑 服务层方法 你认为这是一个很好的架构吗 我的问题是是否适合移动select。。从dao到服务层的语句不是真的,不是。“tempMap”在做什么?这似乎有点奇怪。不是真的,不。临时地图在做什么?这似乎有点奇怪。无论您是否使用通用DAO,您对接口的使用与Spring的使用方式基本相同。它包括作为视图一部分的web层 我对你的服务代码不感兴趣。持久性接口的全部要点是将SQ

我想做这个架构

genericdao+接口-->服务层+接口-->视图层

我的dao将只有泛型方法,例如,我的服务层将有真正的逻辑

服务层方法 你认为这是一个很好的架构吗


我的问题是是否适合移动select。。从dao到服务层的语句

不是真的,不是。“tempMap”在做什么?这似乎有点奇怪。

不是真的,不。临时地图在做什么?这似乎有点奇怪。

无论您是否使用通用DAO,您对接口的使用与Spring的使用方式基本相同。它包括作为视图一部分的web层

我对你的服务代码不感兴趣。持久性接口的全部要点是将SQL从客户机中抽象出来,但您已经让SELECT泄漏到了您的服务层中。在我看来,这是错误的

你做事的方式很少或根本没有面向对象的

我假设泛型dao的意思是

我已经用春天和冬眠完成了。通用DAO接口如下所示:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    List<T> find();
    T find(K id);
    List<T> find(T example);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}
GenericDao<User, Long> userDao = new GenericDaoImpl<User, Long>(User.class);
GenericDao<Book, String> bookDao = new GenericDaoImpl<Book, String>(Book.class);
因此,如果我有User和Book模型对象,我可能有两个DAO,如下所示:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    List<T> find();
    T find(K id);
    List<T> find(T example);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}
GenericDao<User, Long> userDao = new GenericDaoImpl<User, Long>(User.class);
GenericDao<Book, String> bookDao = new GenericDaoImpl<Book, String>(Book.class);

GenericDaoImpl要么是一个练习,要么要等到我发布源代码后才能使用。

无论您是否使用genericdaos,您对接口的使用与Spring的使用方式基本相同。它包括作为视图一部分的web层

我对你的服务代码不感兴趣。持久性接口的全部要点是将SQL从客户机中抽象出来,但您已经让SELECT泄漏到了您的服务层中。在我看来,这是错误的

你做事的方式很少或根本没有面向对象的

我假设泛型dao的意思是

我已经用春天和冬眠完成了。通用DAO接口如下所示:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    List<T> find();
    T find(K id);
    List<T> find(T example);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}
GenericDao<User, Long> userDao = new GenericDaoImpl<User, Long>(User.class);
GenericDao<Book, String> bookDao = new GenericDaoImpl<Book, String>(Book.class);
因此,如果我有User和Book模型对象,我可能有两个DAO,如下所示:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    List<T> find();
    T find(K id);
    List<T> find(T example);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}
GenericDao<User, Long> userDao = new GenericDaoImpl<User, Long>(User.class);
GenericDao<Book, String> bookDao = new GenericDaoImpl<Book, String>(Book.class);

GenericDaoImpl对您来说要么是一个练习,要么必须等到我发布源代码后才能使用。

您的体系结构有点过时

您需要一个dao接口来抽象简洁的db交互,或者换句话说,您可以使用各种实现来实现数据访问契约,如JPA、Hibernate、Oracle、JDBC等。您的查询应该驻留在实现中,并且您应该查看命名查询,我知道这些查询存在于Hibernate和JPA中。查询可能根据实现的不同而有所不同,例如特定于数据库的细微差别,如MySQL的“限制”或HQL Hibernate查询语言与SQL

在我看来,在大多数情况下,像这样的服务层只是开销。您可能需要一个类似于用户授权的服务,其中您的服务层可能会执行一些业务逻辑来正确构造查找。例如,您可能需要加密/解密密码,或者验证用户名是否已经存在,满足最低密码要求,等等


Duffy的泛型DAO示例基本上是标准的,我建议实现它的一个变体…例如。UserDao HibernateImpl扩展了GenericDao

您的体系结构只是有点不合适

您需要一个dao接口来抽象简洁的db交互,或者换句话说,您可以使用各种实现来实现数据访问契约,如JPA、Hibernate、Oracle、JDBC等。您的查询应该驻留在实现中,并且您应该查看命名查询,我知道这些查询存在于Hibernate和JPA中。查询可能根据实现的不同而有所不同,例如特定于数据库的细微差别,如MySQL的“限制”或HQL Hibernate查询语言与SQL

在我看来,在大多数情况下,像这样的服务层只是开销。您可能需要一个类似于用户授权的服务,其中您的服务层可能会执行一些业务逻辑来正确构造查找。例如,您可能需要加密/解密密码,或者验证用户名是否已经存在,满足最低密码要求,等等


Duffy的泛型DAO示例基本上是标准的,我建议实现它的一个变体…例如。UsDaOHiHiBurnEntIpl扩展了GigiDaAd/P>< P> 2016,你应该考虑使用,而不是建立自己的通用DAO。

< P>现在你应该考虑使用,而不是建立自己的通用DAO。

TimeMmap是将被传递给查询的映射。我想说的是,它不是一个实体,也不是一个实体集合。这是我首选的方法,事实上,我只使用OR/Mapper:LLBLGen[for.NET]。我敢肯定,Java有著名的OR/Mapper可以帮您完成这项工作。我建议你使用它们。以上都没有。Java的ORM将是Hibernate、TopLink等

将传递给Query.setParameter…..是…:我想说的是,它不是一个实体,也不是一个实体集合。这是我首选的方法,事实上,我只使用OR/Mapper:LLBLGen[for.NET]。我敢肯定,Java有著名的OR/Mapper可以帮您完成这项工作。我建议你使用它们。以上都没有。Java的ORM将是Hibernate、TopLink等。我的问题是这是否是一个好的体系结构。我知道春天能做到。我的问题是是否适合移动select。。从dao到服务层的语句,您的接口是正确的——这就是Spring的体系结构习惯用法。您的实现是错误的。SELECT语句属于持久性。是。我非常同意你的看法,这就是我要求证实的原因。如果我在dao中有一个像publicsistsearchstringsqlstatement,Map keyValue{}这样的方法,我必须在dao中用select创建另一个方法。。声明称之为。我的服务层将调用后一种方法。你认为呢?不,错了。我不认为你的方式抽象了什么,所以我认为这是错误的。你应该放弃这个想法。没有您想要的封装方式。服务层应该不知道DAO如何获取其数据。这意味着DAO接口不应该有任何方法参数,比如sqlStatement。如果有一个DAO从消息队列、XML文件、平面文件等获取数据,该怎么办?我的问题是这是否是一个好的体系结构。我知道春天能做到。我的问题是是否适合移动select。。从dao到服务层的语句,您的接口是正确的——这就是Spring的体系结构习惯用法。您的实现是错误的。SELECT语句属于持久性。是。我非常同意你的看法,这就是我要求证实的原因。如果我在dao中有一个像publicsistsearchstringsqlstatement,Map keyValue{}这样的方法,我必须在dao中用select创建另一个方法。。声明称之为。我的服务层将调用后一种方法。你认为呢?不,错了。我不认为你的方式抽象了什么,所以我认为这是错误的。你应该放弃这个想法。没有您想要的封装方式。服务层应该不知道DAO如何获取其数据。这意味着DAO接口不应该有任何方法参数,比如sqlStatement。如果有一个从消息队列、XML文件、平面文件等获取数据的DAO,该怎么办?也就是说,如果我有book和user、car实体,我就必须BookDaoHibernateImpl扩展GenericDao;UserDaoHibernateImpl扩展了GenericDao;CarDaoHibernateImpl扩展了GenericDao;不,你要的是GenericDao。如果我在春季这样做,我必须为每个模型对象创建bean,但我仍然只有一个GenericDaoImpl。看不到扩展。这意味着,如果我有book和user、car实体,我将不得不bookDao HibernateImpl扩展GenericDao;UserDaoHibernateImpl扩展了GenericDao;CarDaoHibernateImpl扩展了GenericDao;不,你要的是GenericDao。如果我在春季这样做,我必须为每个模型对象创建bean,但我仍然只有一个GenericDaoImpl。看不到任何东西。