前段时间我开始学习java EE
。我迅速移动到春天(mvc)+休眠。当我学习数据库并与spring + hibernate集成时,我提出了一个想法。
据我所知(并理解),有一种构建对象结构的常用方法,包括配置文件,实体,dao接口和dao实现(因为我们只谈dbs,而不是控制器和其他应用程序的层) 。我决定编写一个通用的java类并将其命名为BasicDao
。 这是一个以实体为类型的模板。
这实际上是有效的,我认为它比接口和实现要好得多,因为你只需要一个类用于所有实体(如果你想为每个实体编写单独的实现,你可能最终会得到大量的文件)。
我还在那里编写了一些模板函数,因此该类非常灵活(没有类型传递给db的异常)。这是代码
package local.bb.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Repository(value = "basicDao")
@Transactional(propagation = Propagation.REQUIRED,readOnly = true)
public class BasicDao<ENTITY> {
private Class<ENTITY> data;
private SessionFactory sessionFactory;
public BasicDao() {
this.data = null;
}
@Transactional
public void addRecord(ENTITY t) {
this.sessionFactory.getCurrentSession().save(t);
}
@Transactional
public void removeRecord(ENTITY t) {
this.sessionFactory.getCurrentSession().delete(t);
}
@Transactional
public List<ENTITY> getAllRecords() {
return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).list();
}
@Transactional
public <TYPE> ENTITY getRecordByParam(String param, TYPE value) {
return (ENTITY)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.eq(param, value)).uniqueResult();
}
@Transactional
public <TYPE> List<ENTITY> getRecordsByParam(String param, TYPE value) {
return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.like(param, value)).list();
}
// GETTERS / SETTERS
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Class<ENTITY> getData() {
return data;
}
public void setData(Class<ENTITY> data) {
this.data = data;
}
}
最后,问题是:它实际上是一种好方法吗?因为我从未在任何地方见过这样的代码(谈论互联网和书籍上的教程)。
答案 0 :(得分:2)
Spring喜欢接口,因为有几个重要的机制是基于它的,例如AOP,拦截器。因此,如果您决定不使用它们,则必须接受Spring功能的某些限制。更重要的是,为依赖于你的DAO的其他类编写Test-Mocks会更难。
如果您想保存代码,我建议您丢失实施而不是接口。使用Spring JPA,您可以使用一组注释(即@Query, @Procedure, @Modifying
等)来注释DAO接口,以定义数据的访问方式。如果您在应用程序上下文中启用JPA存储库,Spring将为您提供DAO实现。
可以找到更多信息here。