Hibernate通用Dao实现

Hibernate通用Dao实现

@(Hibernate)[dao, hibernate, 反射]

  • Hibernate通用Dao实现
    • BaseDao接口
    • BaseDao接口实现类
    • 命名Query在映射文件中定义
      • 调用方式

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 findAll();

    /**
     * 查找满足条件的总记录数
     * 
     * @param detachedCriteria
     * @return
     */
    Integer findRecordNumByPage(DetachedCriteria detachedCriteria);

    /**
     * 向分页对象中设置记录
     * 
     * @param detachedCriteria
     *            离线查询对象
     * @param startIndex
     *            开始索引
     * @param pageSize
     *            每页记录数
     * @return
     */
    List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);

    /**
     * 通过条件查询
     * 
     * @param detachedCriteria
     * @return
     */
    List 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 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) (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 findAll() {
        return (List) this.getHibernateTemplate().find("from " + this.clazz.getSimpleName());
    }

    @Override
    public Integer findRecordNumByPage(DetachedCriteria detachedCriteria) {
        // 设置记录数投影
        detachedCriteria.setProjection(Projections.rowCount());
        List list = (List) this.getHibernateTemplate().findByCriteria(detachedCriteria);
        // 将投影置为空
        detachedCriteria.setProjection(null);
        if (list.size() > 0) {
            return list.get(0).intValue();
        }
        return null;
    }

    @Override
    public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
        // 指定hibernate在连接查询时,只封装成一个对象
        detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
        return (List) this.getHibernateTemplate().findByCriteria(detachedCriteria, startIndex, pageSize);
    }

    @Override
    public List findByCriteria(DetachedCriteria detachedCriteria) {
        return (List) 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在映射文件中定义



<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);
 }

你可能感兴趣的:(hibernate,dao,通用,反射,Hibernate)