对于数据库的CRUD操作实在太常用了,每个模块基本都要用到,每次用到都得写重复的代码,这样非常繁琐,这里我打算用一个基类来处理。
基类的接口
package blog.csdn.net.mchenys.dao;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import blog.csdn.net.mchenys.domain.PageBean;
/**
* 基本的CRUD操作的接口
*
* @author mChenys
*
* @param <T>
*/
public interface BaseDao<T> {
// 保存
void save(T t);
// 更新
void update(T t);
// 删除
void delete(T t);
// 查单个
T findById(Long id);
// 查所有
List<T> findAll();
// 分页查
PageBean<T> findByPage(Integer pageNo, Integer pageSize, DetachedCriteria criteria);
}
基类的实现类
package blog.csdn.net.mchenys.dao.impl;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import blog.csdn.net.mchenys.dao.BaseDao;
import blog.csdn.net.mchenys.domain.PageBean;
/**
* 基本的CRUD操作的实现类
*
* @author mChenys
*
* @param <T>
*/
@SuppressWarnings("all")
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class<T> clazz; // 泛型类的的class对象
public BaseDaoImpl() {
// 先等到子类现实父类时,声明的泛型参数,然后转成class对象
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
@Override
public T findById(Long id) {
return this.getHibernateTemplate().get(clazz, id);
}
@Override
public List<T> findAll() {
return (List<T>) this.getHibernateTemplate().find("from " + clazz.getSimpleName());
}
@Override
public PageBean<T> findByPage(Integer pageNo, Integer pageSize, DetachedCriteria criteria) {
// 创建分页的对象
PageBean<T> page = new PageBean<T>();
// 一个一个设置
page.setPageNo(pageNo);
page.setPageSize(pageSize);
// 设置查询聚合函数:SQL已经变成了 select count(*) from
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if (list != null && list.size() > 0) {
int totalCount = list.get(0).intValue();
// 总记录数
page.setTotalCount(totalCount);
}
// 清除SQL select count(*) from xxx
criteria.setProjection(null);
List<T> beanList = (List<T>) this.getHibernateTemplate().findByCriteria(criteria, (pageNo - 1) * pageSize, pageSize);
// 每页显示的数据
page.setData(beanList);
return page;
}
}
以后再有新的模块在创建dao接口和实现类的时候就继承上面2个就可以了。例如
public interface CustomerDao extends BaseDao<Customer> {
//特有的方法可以自己定义,公共的crud方法就继承父接口的
}
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
}