以下列方式命名DAO是否典型:
UserDAO - interface
UserDAOImpl - implements UserDAO
我想知道它的标准是使用后缀'Impl'来实现,还是更有意义的东西是最佳实践。感谢。
答案 0 :(得分:8)
我见过两种惯例:
前者源于CORBA;后者是Microsoft COM / .NET约定。 (感谢Pascal的更正。)
“不要重复DAO”是一个好主意。我个人认为这篇文章比它需要的更复杂。有一种方法可以在我不喜欢的发现者中反映出来。如果你使用Hibernate,通过示例查询可以很简单地完成它。界面看起来更像是这样:
package persistence;
import java.io.Serializable;
import java.util.List;
public interface GenericDao<T, K extends Serializable>
{
T find(K id);
List<T> find();
List<T> find(T example);
List<T> find(String queryName, String [] paramNames, Object [] bindValues);
K save(T instance);
void update(T instance);
void delete(T instance);
}
答案 1 :(得分:7)
这通常是我使用的。有时像DefaultUserDAO
这样的默认前缀可能会更有意义,如果您正在创建一个您希望其他人实现但您提供参考实现的接口。
大多数时候我觉得这两种语言可以互换使用,但在某些情况下,一种语言比另一种语言更清晰。
答案 2 :(得分:4)
首先 - 您可能不需要为每个课程设置DAO课程。 Don't repeat the DAO!文章解释了什么是通用DAO。想知道如何命名样板代码是没有效率的。
现在,当您拥有通用DAO时,您可以选择:
DAO
(界面)SessionDAO
和EntityManagerDAO
- 使用Session
或EntityManager
当然,只能通过界面使用DAO。您可以轻松地在实现之间切换。
(我实际上更喜欢小写 - Dao
,虽然它是缩写;而Impl
后缀)
答案 3 :(得分:1)
如果保存或删除需要针对某些持久类的额外操作,我一直也是GenericDao和GenericDaoImpl -convention的粉丝,并且有一些来自通用助手类的支持:
public interface PersistListener<T> {
void onPersist(T item);
}
类似的构造也可用于删除。如果您需要某种事件日志来编写每个活动,并且您不想为此使用AOP,这将非常有用。
我的GenericDaoImpl看起来像这样:
public class GenericDaoImpl<T> extends HibernateTemplate {
public void setPersistListeners(List<PersistListener> listeners) {
this.persistListeners = new GenericInterfaceHandler( listeners,
PersistListener.class );
}
// hibernate updates the key to the object itself
public T save(T item) {
getSession().save( item );
List<PersistListener<T>> listeners = this.persistListeners.getAll( item );
for ( PersistListener<T> listener : listeners )
listener.persist( item );
}
// ...
}
上面示例中的persistListener将执行的操作是查找具有与作为参数给出的类的泛型类匹配的泛型类的PersistListener。找到它,然后将调用委托给适当的监听器。我的GenericInterfaceHandler也可用于仅返回给定类的最特定处理程序或处理程序(如果存在)。
如果您有兴趣,我也可以发布GenericInterfaceHandler实现,因为它在很多场合都是非常强大的构造。