Hibernate通用Dao实现
@(Hibernate)[dao, hibernate, 反射]
BaseDao接口
package com.pc.dao.base;
import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
/**
* Hibernate通用的持久层接口
*
* @author Switch
* @data 2016年12月2日
* @version V1.0
*/
public interface BaseDao<T> {
/**
* 保存
*
* @param entity
*
* @return oid
*/
public Serializable save(T entity);
/**
* 更新
*
* @param entity
*/
public void update(T entity);
/**
* 保存或更新
*
* @param entity
*/
public void saveOrUpdate(T entity);
/**
* 删除
*
* @param entity
*/
public void delete(T entity);
/**
* 通过对象标识符获取对象
*
* @param oid
* @return 标识符对应的对象,没找大则返回null
*/
public T findById(Serializable oid);
/**
* 返回所有对象的列表
*
* @return
*/
public List<T> findAll();
/**
* 查找满足条件的总记录数
*
* @param detachedCriteria
* @return
*/
Integer findRecordNumByPage(DetachedCriteria detachedCriteria);
/**
* 向分页对象中设置记录
*
* @param detachedCriteria
* 离线查询对象
* @param startIndex
* 开始索引
* @param pageSize
* 每页记录数
* @return
*/
List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);
/**
* 通过条件查询
*
* @param detachedCriteria
* @return
*/
List<T> findByCriteria(DetachedCriteria detachedCriteria);
/**
* 通用更新方法
*
* @param queryName
* 命名查询的名字,在映射文件中定义
* @param objects
* 参数列表
*/
public void executeUpdate(String queryName, Object... objects);
}
BaseDao接口实现类
package com.pc.dao.base.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.itheima.bos.dao.base.BaseDao;
/**
* Hibernate通用持久层接口实现类
*
* @author Switch
* @data 2016年12月2日
* @version V1.0
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
// 存储泛型的实际参数
private Class<T> clazz;
public BaseDaoImpl() {
// 谁实现该类,这就是谁的类字节码
Class c = this.getClass();
// 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
Type type = c.getGenericSuperclass();
// 将类型强转为参数化类型
ParameterizedType pType = (ParameterizedType) type;
// 获取该类的父类的所有实际类型参数,也就是泛型的实际参数
// 这里也就是获取BaseDaoImpl的实际类型参数
Type[] actualTypeArguments = pType.getActualTypeArguments();
// 将实际类型参数赋值给成员变量
clazz = (Class<T>) (actualTypeArguments[0]);
}
@Resource(name = "sessionFactory")
public void setMySessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
@Override
public Serializable save(T entity) {
return this.getHibernateTemplate().save(entity);
}
@Override
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
@Override
public void saveOrUpdate(T entity) {
this.getHibernateTemplate().saveOrUpdate(entity);
}
@Override
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
@Override
public T findById(Serializable oid) {
return (T) this.getHibernateTemplate().get(this.clazz, oid);
}
@Override
public List<T> findAll() {
return (List<T>) this.getHibernateTemplate().find("from " + this.clazz.getSimpleName());
}
@Override
public Integer findRecordNumByPage(DetachedCriteria detachedCriteria) {
// 设置记录数投影
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
// 将投影置为空
detachedCriteria.setProjection(null);
if (list.size() > 0) {
return list.get(0).intValue();
}
return null;
}
@Override
public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
// 指定hibernate在连接查询时,只封装成一个对象
detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, startIndex, pageSize);
}
@Override
public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
}
@Override
public void executeUpdate(String queryName, Object... objects) {
// 获取当前session
Session session = this.getSessionFactory().getCurrentSession();
// 获取命名查询对象
Query query = session.getNamedQuery(queryName);
int i = 0;
// 设置参数
if (objects != null) {
for (Object object : objects) {
query.setParameter(i++, object);
}
}
query.executeUpdate();
}
}
命名Query在映射文件中定义
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.pc.domain.User" table="user">
...
</class>
<!-- 命名查询语句 -->
<query name="user.editPassword">
update User set password = ? where id = ?
</query>
</hibernate-mapping>
调用方式
@Override
public void editPassword(String password, String id) {
password = MD5Utils.md5(password);
userDao.executeUpdate("user.editPassword", password, id);
}