我是Java的新手,我正在尝试使用servlet创建一个Web项目。 我想查询我的数据库,但我想我不了解JPA和DAO的所有内容。
我被教导过这样做:
public List<User> findAll()
我听说没有必要与JPA创建DAO接口,但我完全迷失了,我根本不了解我应该做什么或者EJB是什么。我只是想找到我数据库中的所有用户,并按照Java的良好实践显示他们的名字。
我的servlet和JSP已经可以了。
你会推荐什么?
答案 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有几个优点:
这些只是使用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。
祝你好运