因为DAO层基本的就是CRUD操作,变化不是很大,要是有变化的那就是查询。而确实没有必要为每一个实体写一个完整的DAO,但是没有还不行,那就“抽取”出来吧。而Service依赖与DAO层,有时就是简单调用一下,也确实没有必要每个都写。总之,不爱写多个,那就写一个通用的,而其他的继承或实现这个通用的可以了。
还是用代码说话吧。
- package org.monday.dao;
- import java.io.Serializable;
- import java.util.List;
- /**
- * BaseDAO 定义DAO的通用操作
- *
- * @author Monday
- */
- public interface BaseDao<T> {
- public void save(T entity);
- public void update(T entity);
- public void delete(Serializable id);
- public T findById(Serializable id);
- public List<T> findByHQL(String hql, Object... params);
- }
上面的DAO只定义了一些常见的方法,有需要通用的方法,可以随便加,然后实现它就行了。
- package org.monday.dao.impl;
- import java.io.Serializable;
- import java.lang.reflect.ParameterizedType;
- import java.util.List;
- import javax.annotation.Resource;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.monday.dao.BaseDao;
- /**
- * BaseDaoImpl 定义DAO的通用操作的实现
- *
- * @author Monday
- */
- @SuppressWarnings("unchecked")
- public class BaseDaoImpl<T> implements BaseDao<T> {
- private Class<T> clazz;
- /**
- * 通过构造方法指定DAO的具体实现类
- */
- public BaseDaoImpl() {
- ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
- clazz = (Class<T>) type.getActualTypeArguments()[0];
- System.out.println("DAO的真实实现类是:" + this.clazz.getName());
- }
- /**
- * 向DAO层注入SessionFactory
- */
- @Resource
- private SessionFactory sessionFactory;
- /**
- * 获取当前工作的Session
- */
- protected Session getSession() {
- return this.sessionFactory.getCurrentSession();