对于mvc结构而言,Dao数据访问层必不可少,而每个项目中基本都有很多个模块,很多模块都涉及增删改查(curd),如何每个模块都去写增删改查的的代码,就工作效率太低,而且浪费时间空间,所以可以对共有的重复的curd代码进行抽取。
以下为一个项目抽取的dao层
接口
package com.mol.core.dao;
import java.io.Serializable;
import java.util.List;
public interface IBaseDao<T> {
//新增
public void save(T t);
//更新
public void update(T t);
//根据id删除
public void delete(Serializable id);//用Serializable就不局限于使用int型id,也可以是String类型
//根据id查找
public T getById(Serializable id);
//查找列表
public List<T> list();
}
实现
package com.mol.core.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.mol.core.dao.IBaseDao;
//不能直接实例化,所以必须是抽象的
public abstract class BaseDao<T> extends HibernateDaoSupport implements
IBaseDao<T> {
Class<T> clazz;
@SuppressWarnings("unchecked")
public BaseDao(){
//获取当前运行的父类的参数化类型
Type type = this.getClass().getGenericSuperclass();
//转换为参数化类型
ParameterizedType pt =(ParameterizedType)type;
//得到实际类型
Type[] types = pt.getActualTypeArguments();
clazz = (Class<T>) types[0];
}
@Override
public void save(T t) {
getHibernateTemplate().save(t);
}
@Override
public void update(T t) {
getHibernateTemplate().update(t);
}
@Override
public void delete(Serializable id) {
getHibernateTemplate().delete(getById(id));
}
@Override
public T getById(Serializable id) {
T t = getHibernateTemplate().get(clazz, id);
return t;
}
@SuppressWarnings("unchecked")
@Override
public List<T> list() {
Query query = getSession().createQuery("from "+clazz.getSimpleName());
List<T> list = query.list();
return list;
}
}
接口的实现中实现了hibernateDaoSupport,这样就不用手动注入sessionFactory,而且hibernateDaoSupport中有getSessionFactory方法,可以获取sessionFactory。