在spring+hibernate项目中,都会涉及到对数据库的crud操作,为了减少重复代码,抽取了BaseDao接口,具体实现如下:
BaseDao.java接口
package dao;
import java.util.List;
public interface BaseDao<T> {
// 增
void add(T t);
// 删
void delete(T t);
// 改
void update(T t);
// 查所有
List<T> list();
// 通过id查
T find(Integer id);
}
BaseDaoImpl.java实现类
package dao.impl;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import dao.BaseDao;
import entity.Customer;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class aclass;
//查询所有和根据id查询两个方法都需要具体的实体类,所以在构造方法中获取实际类型参数。
public BaseDaoImpl(){
Class clazz=this.getClass();
//获得运行类的父类的参数化类型BaseDaoImpl<Customer>
ParameterizedType ptype=(ParameterizedType) clazz.getGenericSuperclass();
//获得参数化类型中的实际类型参数<Customer>
Type types[] = ptype.getActualTypeArguments();
this.aclass=(Class) types[0];
}
@Override
public void add(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
// 不能直接写成this.getHibernateTemplate().find("from T")
@Override
public List<T> list() {
// TODO Auto-generated method stub
return (List<T>) this.getHibernateTemplate().find("from "+aclass.getSimpleName());
}
@Override
public T find(Integer id) {
// TODO Auto-generated method stub
return (T) this.getHibernateTemplate().get(aclass, id);
}
}
CustomerDao接口,需要继承BaseDao接口,并传入实际类型参数Customer。
package dao;
import java.util.List;
import java.util.Map;
import entity.Customer;
import entity.PageBean;
public interface CustomerDao extends BaseDao<Customer>{
// void add(Customer customer);
// List<Customer> list();
// Customer find(Integer cid);
// void update(Customer customer);
// void delete(Customer customer);
}
CustomerDaoImpl实现类,并需要继承BaseDaoImpl。
因为BaseDaoImpl中继承了HibernateDaoSupport,所以CustomerDaoImpl直接继承BaseDaoImpl即可。
package dao.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import dao.CustomerDao;
import entity.Customer;
import entity.PageBean;
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
}