10

我是 Java 新手,我正在尝试使用 servlet 制作一个 Web 项目。我想查询我的数据库,但我认为我不了解有关 JPA 和 DAO 的所有内容。

我被教导以这种方式做事:

  • 创建类 com.package.entity.User (从我的数据库生成)
  • 创建接口 com.package.dao.UserDao
  • 创建类 com.package.dao.jpa.JpaUserDao 实现 UserDao
  • 使用类似的方法创建 EJB com.package.service.UserServicepublic List<User> findAll()

我听说没有必要使用 JPA 创建 DAO 接口,但我完全迷失了,我完全不明白我应该做什么或 EJB 是什么。我只是想在我的数据库中找到所有用户并按照 Java 的良好实践显示他们的名字。

对我的 servlet 和 JSP 来说一切正常。

你会推荐什么 ?

4

2 回答 2

13

DAO 代表“数据访问对象”。它抽象了“从数据存储中获取某些东西”的概念。您的 DAO 对象可以通过 JDBC 调用、JPA 调用或其他方式实现。也许它调用了一些远程网络服务。在 JPA 上使用 DAO 似乎是多余的,它确实增加了一层,但我认为这是值得的。

例如,您可能有一个“显示有绿眼睛的用户”的用例。

使用直接 JPA:

List<User> users = entityManager.createQuery("select u  from User u where u.EyeColor = 'green'"");

使用 DAO,您将拥有:

List<User> users = dao.UsersWithEyeColor("green");

这里的 DAO 有几个优点:

  1. 它更容易阅读。
  2. 它不会将您的数据库结构暴露给应用程序的其余部分
  3. 单元测试会容易得多。获得绿眼用户的类只需要创建一个“模拟”道。这比模拟 JPA 更容易。

这些只是使用 DAO 的几个论据。对于一个非常简单的小型应用程序,它可能会产生太多开销。但是对于任何会变得更大并且需要维护多年的东西,我认为这是值得的。

于 2013-03-21T18:45:56.943 回答
7

DAO(数据访问对象)基本上是一种编程模式,要使用它,您必须创建一个类,该类将创建一个对象,该对象为某种类型的持久性单元(db、文件系统、xml 等)提供抽象接口。为什么有用吗?因为它提供了一些特定的数据操作而不暴露数据库的细节。

DAO 的一个基本示例:

import java.util.List;


public abstract class DAOFactory {

    public static final int MYSQL_JDBC = 1;
    public static final int MYSQL_JPA = 2;
    public static final int MYSQL_HIBERNATE = 3;

    public abstract List<UserDTO> listAllUsers();

    public static DAOFactory getDAOFactory(int whichFactory) {
        switch (whichFactory) {
        case MYSQL_JDBC : return new MySqlJDBCDaoFactory();
        case MYSQL_JPA: return new MySqlJpaDaoFactory();
        case MYSQL_HIBERNATE: return new MySqlHibernateDaoFactory();
        default: return null;
        }
    }

}

然后,您必须为您将在应用程序中管理的每种持久性类型创建一个特定的工厂,并且该特定工厂必须实现您用于持久性的方法,例如 listAllUsers();

例如,对于 MySQL JPA:

public class MySqlJpaDaoFactory extends DAOFactory {

    @Override
    public List<UserDTO> listAllUsers() {
      // Here I implement specific functionality to retrieve data using JPA Framework
        //EntityManagerFactory emf = ...
        //EntityManager em = ...
        //List<UserDTO> list = em.get...();
        //return list;
        return null;
    }

}

对于 MySQL JDBC,您必须执行其他过程:

public class MySqlJDBCDaoFactory extends DAOFactory {

    @Override
    public List<UserDTO> listAllUsers() {
        //Connection = DriverManager ...
        //PreparedStatement ps = connection.prepareStatement("select * from ...");
        //ResultSet = ps.executeQuery()
        // and so on...
        return null;
    }

}

然后你以这种方式调用你的工厂:

DAOFactory myfactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL_JDBC);
List<UserDTO> list = myfactory.listAllUsers();

如果你能看到无论你改变你的数据库框架还是持久化模式,你都不必重新发明轮子,只需要改变一个参数,你就会得到你想要的持久化的实现,只是基于一个参数。

希望它可以帮助您理解模式,我不使用 EJB,如果您使用的是 DAO,我认为仍然没有必要实现 EJB。

此致

于 2013-03-21T18:57:40.273 回答