Java新手 - 什么是JPA和DAO?

时间:2013-03-21 18:00:11

标签: java jpa ejb dao

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

我被教导过这样做:

  • 创建类com.package.entity.User(从我的数据库生成)
  • 创建界面com.package.dao.UserDao
  • 创建实现UserDao的类com.package.dao.jpa.JpaUserDao
  • 使用public List<User> findAll()
  • 等方法创建EJB com.package.service.UserService

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

我的servlet和JSP已经可以了。

你会推荐什么?

2 个答案:

答案 0 :(得分:8)

DAO代表“数据访问对象”。它抽象了“从数据存储中获取内容”的概念。您可以使用JDBC调用,JPA调用或其他任何方式实现DAO对象。也许它会调用一些远程Web服务。在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. 单元测试会更容易。获得绿眼睛用户的课程只需要创建一个“Mock”dao。这比嘲笑JPA更容易。
  4. 这些只是使用DAO的一些参数。对于一个非常简单的小应用程序,它可能是太多的开销。但对于任何会变得更大并且需要维持多年的事情,我认为这是值得的。

答案 1 :(得分:6)

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。

祝你好运