我是Java的新手,我正在尝试使用servlet创建一个Web项目.我想查询我的数据库,但我想我不了解JPA和DAO的一切.
我被教导过这样做:
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在这里有几个优点:
这些只是使用DAO的一些参数.对于一个非常简单的小应用程序,它可能是太多的开销.但对于任何会变得更大并且需要维持多年的东西,我认为这是值得的.
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.
最好的祝福