BaseDao接口
![基于Hibernate的dao层抽取 基于Hibernate的dao层抽取](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OXBiV0ZuWlhNdVkyNWliRzluY3k1amIyMHZUM1YwYkdsdWFXNW5TVzVrYVdOaGRHOXljeTlEYjI1MGNtRmpkR1ZrUW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![基于Hibernate的dao层抽取 基于Hibernate的dao层抽取](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OXBiV0ZuWlhNdVkyNWliRzluY3k1amIyMHZUM1YwYkdsdWFXNW5TVzVrYVdOaGRHOXljeTlGZUhCaGJtUmxaRUpzYjJOclUzUmhjblF1WjJsbQ%3D%3D.jpg?w=700&webp=1)
package com.hao.dao.base;View Code
import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
public interface BaseDao<T> {
/**
* 保存实体
* @param entity
*/
void save(T entity);
/**
* 删除实体
* @param entity
*/
void delete(T entity);
/**
* 根据实体Id删除实体
* @param id
*/
void deleteById(Serializable id);
/**
* 更新实体信息
* @param entity
*/
void update(T entity);
/**
* 根据Id查询实体
* @param id
* @return
*/
T findById(Serializable id);
/**
* 查询所有实体信息
* @return
*/
List<T> list();
/**
* 查询实体的总数
* @param dc
* @return
*/
Integer getTotalCount(DetachedCriteria dc);
/**
* 分页查询实体
* @param dc 离线查询条件
* @param start 查询起始下标
* @param pageSize 每页的记录条数
* @return
*/
List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
}
BaseDaoImpl实现类
![基于Hibernate的dao层抽取 基于Hibernate的dao层抽取](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OXBiV0ZuWlhNdVkyNWliRzluY3k1amIyMHZUM1YwYkdsdWFXNW5TVzVrYVdOaGRHOXljeTlEYjI1MGNtRmpkR1ZrUW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![基于Hibernate的dao层抽取 基于Hibernate的dao层抽取](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OXBiV0ZuWlhNdVkyNWliRzluY3k1amIyMHZUM1YwYkdsdWFXNW5TVzVrYVdOaGRHOXljeTlGZUhCaGJtUmxaRUpzYjJOclUzUmhjblF1WjJsbQ%3D%3D.jpg?w=700&webp=1)
package com.hao.dao.base.impl;View Code
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.hao.dao.base.BaseDao;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class<T> entityClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
// 获取子类对象的父类类型
ParameterizedType superClass = (ParameterizedType) this.getClass()
.getGenericSuperclass();
// 获得在父类类型上声明的反省数组
Type[] genericTypes = superClass.getActualTypeArguments();
// 第一个泛型即为实体类型
entityClass = (Class<T>) genericTypes[0];
}
@Override
public void save(T entity) {
getHibernateTemplate().save(entity);
}
@Override
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}
@Override
public void deleteById(Serializable id) {
T entity = getHibernateTemplate().load(entityClass, id);
getHibernateTemplate().delete(entity);
}
@Override
public void update(T entity) {
getHibernateTemplate().update(entity);
}
@Override
public T findById(Serializable id) {
return getHibernateTemplate().get(entityClass, id);
}
@Override
public List<T> list() {
return getHibernateTemplate().loadAll(entityClass);
}
@Override
public Integer getTotalCount(DetachedCriteria dc) {
//设置查询的聚合函数,总记录数
dc.setProjection(Projections.rowCount());
@SuppressWarnings("unchecked")
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
//清空之前设置的聚合函数
dc.setProjection(null);
if(list!=null && list.size()>0){
Long count = list.get(0);
return count.intValue();
}else{
return null;
}
}
@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
@SuppressWarnings("unchecked")
List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
return list;
}
/**
* HibernateDao接口在使用前必须注入SessionFactory
*
* @param sessionFactory
*/
@Autowired
public void setSF(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
}