Java 新手 - 啥是 JPA 和 DAO? [关闭]

Posted

技术标签:

【中文标题】Java 新手 - 啥是 JPA 和 DAO? [关闭]【英文标题】:New to Java - What's JPA and DAO? [closed]Java 新手 - 什么是 JPA 和 DAO? [关闭] 【发布时间】:2013-03-11 09:27:00 【问题描述】:

我是 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 来说一切正常。

你会推荐什么?

【问题讨论】:

看到这个类似的问题:programmers.stackexchange.com/questions/97423/… 问题是:这对我来说是中文的!我什至不知道 DAO 是做什么的,因为我只是创建 DAO 接口。它是像 PDO for php 那样的抽象层吗?或者更像是像 Doctrine 这样的 ORM? 【参考方案1】:

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 有几个优点:

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

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

【讨论】:

您的查询将返回绿眼用户,而不是您最初预期的蓝眼用户。 :)【参考方案2】:

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。

最好的问候

【讨论】:

对于您通过 JDBC 通过 JPA2 获取数据的正常用例而言,这似乎完全过度设计,但您不会随意更改访问方法 -威利忘记工厂,只需实例化您的 DAO。 @Marcelo,我能知道为什么在使用 JPA 时仍然需要 JDBC 吗?目前,我也在做类似的事情,但我很困惑是否应该将 JDBC 与 JPA 混合。期待您的回复。谢了。 嗨@KarenGoh。如果您决定使用 JPA 等持久性框架,那么我看不出您应该将 JDBC 与它混合使用的原因。在这个特定的示例中,我只是试图展示如何根据我之前工作中使用的应用程序来处理不同类型的持久性“管理器”。它从 2004 年使用 JDBC 的这种模式(DAO)开始,后来它在 2009 年迁移到 Pure Hibernate,然后我在 2013 年迁移到 JPA(+Eclipselink)。这个例子只是为了展示我们如何改变持久性模式使用这种模式可以轻松地从一种类型转换到另一种类型。 您可以继续使用 JPA,这是一种通过 ORM 规范管理实体的简单方法,如果您需要本机查询,则 JPA 提供“createNativeQuery”方法,您可以在其中提供纯 SQL 指令查询数据库。 @Marcelo,问题是我已经开始使用 JDBC 和 DAO。然后,我发现将数据插入到链接表中非常困难,所以基本上我使用 JPA 来做到这一点。但是,我现在发现我的代码相当混乱。知道如何在不重新做项目的情况下做到这一点吗?

以上是关于Java 新手 - 啥是 JPA 和 DAO? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java 春天jpa dao样本

java web spring jpa 在以接口为dao的方法里使用原生sql,联合查找没有对应实体,用啥来接收? 求大神

JPA的泛型DAO设计及使用

JPA 和 DAO - 标准方法是啥?

使用 JSF、JPA 和 DAO。没有春天?

Spring+JPA EntityManager 注入 service 和 dao