gpt4 book ai didi

java - DAO设计模式

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:55 24 4
gpt4 key购买 nike

假设我们有几个要使用 DAO 对象持久化的实体。所以我们实现了正确的接口(interface),所以我们最终得到了

class JdbcUserDao implements UserDao{
//...
}

class JdbcAddressDao implements AddressDao{
//...
}

因此,如果我希望能够将持久性实现从 JDBC 切换到 JPA(例如),反之亦然,我需要 JPAUserDao 和 JPAAddressDao...这意味着如果我有 20 个实体,并决定切换实现(使用 DI 容器),我必须在代码中使用 JPA 切换每个 Jdbc 实现。

现在可能是我误解了 DAO 的工作原理,但是......如果我刚刚有

class JdbcDaoImpl implements UserDao,AddressDao{
//...
}

然后我会将所有 JDBC 实现都放在一个类中,切换实现将是小菜一碟。此外,DaoImpl 计数等于 Dao 接口(interface)的数量。为什么不按实现(jdbc、JTA、JPA...)将它们分组并将所有内容都放在一个类中?

提前致谢。

最佳答案

让一个类实现整个应用程序中的每个 DAO 接口(interface)将是一个相当糟糕的设计。

一个更典型的模式是有一个BaseDAO接口(interface)(也经常被称为GenericDAO)并且有一个JPABaseDAOJDBCBaseDAO 等。这些基类将包含查找/获取/读取、保存/存储/持久化、更新/修改和删除/删除/清除等方法。

UserDAO 等特定的 DAO 接口(interface)继承自 BaseDAOJPAUserDAO 等具体实现继承自 JPABaseDAO

BaseDAO 接口(interface)可能如下所示:

public interface BaseDAO <T> {      
T getByID(Long ID);
T save(T type);
T update(T type);
void delete(T type);
}

还有一个UserDAO接口(interface):

public interface UserDAO extends BaseDAO<User> {
List<User> getAllAuthorized();
}

JPABaseDAO 实现此接口(interface)的基本示例:

@Stateless
public class JPABaseDAO<T> implements BaseDAO<T> {

@PersistenceContext
private EntityManager entityManager;

private final Class<T> entityType;

@SuppressWarnings("unchecked")
public JPABaseDAO() {
this.entityType = ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}

@Override
public T getByID(Long ID) {
return entityManager.find(entityType, ID);
}

@Override
public T save(T type) {
return entityManager.persist(type);
}

@Override
public T update(T type) {
return entityManager.merge(type);
}

@Override
public void delete(T type) {
entityManager.remove(entityManager.contains(type) ? type : entityManager.merge(type));
}

}

还有一些示例 UserDAO 实现将从它继承:

@Stateless
public class JPAUserDAO extends JPABaseDAO<User> implements UserDAO {

@PersistenceContext
private EntityManager entityManager;

@Override
public List<User> getAllAuthorized() {
return entityManager.createNamedQuery("User.getAllAuthorized", User.class)
.getResultList();
}
}

在实践中,基类通常可以透明地做一些其他事情,例如检查一个实体是否实现了某种Auditable接口(interface),并自动设置修改它的日期和用户等。

当使用 EJB 实现您的 DAO 时,一种更改实现的策略是将所有 JDBC 实现放在一个包中,将所有 JPA 实现放在另一个包中。然后在您的构建中只包含一个实现包。

关于java - DAO设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com