Java CRUD DAO持久性设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java CRUD DAO持久性设计相关的知识,希望对你有一定的参考价值。

最近我真的专注于编写干净的代码和实现设计,我偶然发现我有几个选项,但无法确定哪一个是合适的。我正在研究一种需要持久化对象集合的软件。我决定实现DAO模式。问题是持久性可能都是Json OR Xml所以我这样实现它:

我创建了一个通用DAO:

public interface GenericDao<T> {
    public boolean add(T type);
    public boolean change(T type);
    public void delete(T type);
}

然后我创建了一个CarDAO:

public interface CarDao extends GenericDao<Car> {
    public Car getByIdentificationNumber(int id);
    public void process();
}

对于JSON持久性:

JsonGenericDao:

public class JsonGenericDao<T> implements GenericDao<T>  {

    public boolean add(T type) {
        // implement ADD for json
    }
    public boolean change(T type) {
        // implement Change for json
    }

    public void delete(T type) {
        // implement Delete for json
    }
}

JsonCarDao:

public class JsonCarDao extends JsonGenericDao<Task> implements CarDao {

    public Car getByIdentificationNumber(int id) {
        // Implement logic
    }

    public void process() {
        // Logic
    }
}

JsonCarDao扩展JsonGenericDao以包括添加,更改,删除,它还​​提供其他方法。

实施XmlGenericDaoXmlCarDao的方式相同。

所以我最终有可能使用XmlCarDaoJsonCarDao取决于我想要使用的持久性。

在实现持久性时,我使用JAXB表示XML,使用Gson表示JSON。我创建了一个EntityCollection<T>类来存储内部的对象,我会根据使用的持久性将此集合转换为XML或JSON,我会从文件中检索信息到此集合,更改需要更改的内容然后重写文件。

我可以通过两种方式实现它:

选项1:

我可以在Gson中使用JsonGenericDao实现持久性,并对JAXB中的XmlGenericDao执行相同的操作。

选项2:

我可以创建一个接口Persister<T>并编写两个实现此接口的类,因此JsonPersister<T>XmlPersister<T>使用update(T type)acquireAllFromFile()等方法,其中一个将使用新数据重写整个文件,另一个将要检索来自文件的信息。 (可以在选项1中完成同样的事情但不进行额外的类)

然后在JsonGenericDao<T>里面我可以使用:JsonPersister<EntityCollection<T>>XmlGenericDao<T>里面我可以使用:XmlPersister<EntityCollection<T>>因此包装一切。

这里的问题是考虑到这一点,这意味着我可以摆脱JsonGenericDaoXmlGenericDao并实现一个PersistenceGenericDao,它将在其CONSTRUCTOR中使用Persister接口来指定是否应该使用JsonPersister或者应该使用XmlPersister。它基本上是DAOStrategy Pattern的组合。现在这似乎是我可以做的事情......但在我看来它也会让我最初的DAO设计变得混乱。这是适当的做法还是不好的做法?

答案

我认为你的选项2实际上看起来像GoF Bridge PatternXmlPersister / JsonPersisterConcreteImplementors。 PersistenceGenericDaoAbstractionJsonCarDaoRefinedAbstraction

所以这个想法确实有意义。请参阅What problems can the Bridge design pattern solve?以确定您是否确实需要该模式。

如果您只打算使用XML或JSON持久性,我个人会选择选项2.如果您将JsonCarDaoXmlCarDao进行比较,它们之间的唯一区别可能是从某些资源保存/加载数据的机制(JSON与XML) 。其余逻辑可能几乎相同。从这个角度来看,将“保存/加载”提取到特定的实现者中是合理的,并且对于其余的DAO逻辑有一个通用类。

但是,如果考虑关系或NoSQL数据库持久性,这可能不适合。因为DAO逻辑可能会有所不同。与JSON DAO(从JSON文件加载数据并搜索具有给定ID的对象的对象集合)相比,像findById这样的方法在关系DAO(DB中的查询)中会有很大的不同。在这种情况下,RelationalPersistence可能效率不高。

以上是关于Java CRUD DAO持久性设计的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb技术:DAO设计模式

DAO设计模式

Spring框架针对dao层的jdbcTemplate操作 包括crud

带有 Servlet、JSP 和 MySQL 的 Java 中的 CRUD Web 应用程序,没有 DAO

javaWeb_JDBC_dao模式设计

如何仅使用 java 和 jdbc(无 ORM)为基本的 crud 操作实现通用 DAO?