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
以包括添加,更改,删除,它还提供其他方法。
实施XmlGenericDao
和XmlCarDao
的方式相同。
所以我最终有可能使用XmlCarDao
或JsonCarDao
取决于我想要使用的持久性。
在实现持久性时,我使用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>>
因此包装一切。
这里的问题是考虑到这一点,这意味着我可以摆脱JsonGenericDao
和XmlGenericDao
并实现一个PersistenceGenericDao
,它将在其CONSTRUCTOR中使用Persister
接口来指定是否应该使用JsonPersister
或者应该使用XmlPersister
。它基本上是DAO
和Strategy Pattern
的组合。现在这似乎是我可以做的事情......但在我看来它也会让我最初的DAO设计变得混乱。这是适当的做法还是不好的做法?
我认为你的选项2实际上看起来像GoF Bridge Pattern。 XmlPersister
/ JsonPersister
是ConcreteImplementor
s。 PersistenceGenericDao
是Abstraction
,JsonCarDao
是RefinedAbstraction
。
所以这个想法确实有意义。请参阅What problems can the Bridge design pattern solve?以确定您是否确实需要该模式。
如果您只打算使用XML或JSON持久性,我个人会选择选项2.如果您将JsonCarDao
与XmlCarDao
进行比较,它们之间的唯一区别可能是从某些资源保存/加载数据的机制(JSON与XML) 。其余逻辑可能几乎相同。从这个角度来看,将“保存/加载”提取到特定的实现者中是合理的,并且对于其余的DAO逻辑有一个通用类。
但是,如果考虑关系或NoSQL数据库持久性,这可能不适合。因为DAO逻辑可能会有所不同。与JSON DAO(从JSON文件加载数据并搜索具有给定ID的对象的对象集合)相比,像findById
这样的方法在关系DAO(DB中的查询)中会有很大的不同。在这种情况下,RelationalPersistence
可能效率不高。
以上是关于Java CRUD DAO持久性设计的主要内容,如果未能解决你的问题,请参考以下文章
Spring框架针对dao层的jdbcTemplate操作 包括crud