Java新手 - 什么是JPA和DAO?

mim*_*ipc 8 java dao ejb jpa

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

我被教导过这样做:

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

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

对于我的servlet和JSP来说已经足够了.

你会推荐什么 ?

Dav*_*ave 11

DAO代表"数据访问对象".它抽象了"从数据存储中获取内容"的概念.您可以使用JDBC调用,JPA调用或其他任何方式实现DAO对象.也许它会调用一些远程Web服务.在JPA上使用DAO似乎是多余的,它确实添加了一个层,但我认为这是值得的.

例如,您可能有一个"显示绿眼睛用户"的用例.

直接JPA:

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

有DAO你有:

List<User> users = dao.UsersWithEyeColor("green");
Run Code Online (Sandbox Code Playgroud)

DAO在这里有几个优点:

  1. 它更容易阅读.
  2. 它不会将您的数据库结构暴露给应用程序的其余部分
  3. 单元测试会更容易.获得绿眼睛用户的课程只需要创建一个"Mock"dao.这比嘲笑JPA更容易.

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


Mar*_*aje 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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,您必须为将在应用程序中管理的每种类型的持久性创建特定工厂,并且该特定工厂必须实现用于持久性的方法,例如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;
    }

}
Run Code Online (Sandbox Code Playgroud)

对于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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你这样调用你的工厂:

DAOFactory myfactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL_JDBC);
List<UserDTO> list = myfactory.listAllUsers();
Run Code Online (Sandbox Code Playgroud)

如果您可以看到无论您是更改数据库框架还是持久性模式,您都不必重新创建轮子,只需更改参数,您就可以获得所需的持久性实现,只需基于参数即可.

希望它可以帮助您理解模式,我不使用EJB,如果您使用DAO,我认为仍然不需要实现EJB.

最好的祝福