1 hibernate的通用BaseDao
1.1 该通用Dao的功能简介
- 在很多的时候,有些如果只是简单的增删改查的能力,很多的Dao会非常的相似,这就不太好了,所以我们可以将一些通用的能力给抽取出来
- 增加保存功能
- 修改功能
- 删除功能
- 查全部功能
- 分页查询功能
- 查个数功能
1.2 通用Dao接口
/**
* 通用的Dao接口
*/
public interface BaseDao<T>
{
/**
* 增加对象
* @Description: save
*/
void save(T t);
/**
* 删除对象
* @Description: delete
*/
void delete(T t);
/**
* 修改对象
* @Description: update
*/
void update(T t);
/**
* 通过id查找对象
* @Description: findById
*/
T findById(Serializable id);
/**
* 统计个数
* @Description: findCount
*/
Integer findCount(DetachedCriteria detachedCriteria);
/**
* 查询所有对象
* @Description: findAll
*/
List<T> findAll();
/**
* 按条件分页查询
* @Description: findByPage
*/
List<T> findByPage(DetachedCriteria detachedCriteria,Integer begin,Integer pageSize);
}
1.3 通用Dao实现
- 因为通过ID查询对象的时候,需要使用class对象,然而我们只是传入了一个泛型T,没有具体的class对象,所以我们需要使用反射技术来获取泛型类的class对象
/**
* 通用Dao实现类
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>
{
private Class clazz;
public BaseDaoImpl() {
// 获取子类的class对象
Class clazz=this.getClass();
// 获取子类继承Type
Type type = clazz.getGenericSuperclass();
// 该子类继承Type实际上是一个参数化类型,可强转
ParameterizedType pType=(ParameterizedType) type;
// 获取子类继承对象的泛型类型
Type[] types=pType.getActualTypeArguments();
// 因为我们只传入了一个类型
this.clazz=(Class) types[0];
}
public void save(T t)
{
this.getHibernateTemplate().save(t);
}
public void delete(T t)
{
this.getHibernateTemplate().delete(t);
}
public void update(T t)
{
this.getHibernateTemplate().update(t);
}
public T findById(Serializable id)
{
return (T) this.getHibernateTemplate().get(clazz, id);
}
public Integer findCount(DetachedCriteria detachedCriteria)
{
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
if(list.size()>0) {
return list.get(0).intValue();
}
return null;
}
public List<T> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize)
{
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
}
public List<T> findAll()
{
return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
}
}
1.4 其他的Dao继承该通用dao,就直接可以使用通用dao的基本功能了
/**
* 联系人数据访问层
*/
public class CustomerDaoImpl extends BaseDaoImpl<CustomerDao> implements CustomerDao
{
}