Hibernate學習(四)---通用HibernateDao類

獲取Session的工具類:

HibernateUtil類:

package hibernateDao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/*
 * Hibernate工具類,簡化獲取和關閉Session
 */
public class HibernateUtil {
    //線程本地變量,使用key爲當前的線程對象,value就是Session
    private static final ThreadLocal<Session> tl = new ThreadLocal<>();
    private static final SessionFactory sf;
    //初始化
    static {
        Configuration cf = new Configuration().configure();
        sf = cf.buildSessionFactory();
    }
    //獲取session
    public static Session getSession() {
        //先從線程本地變量中獲取當前線程對象的Session對象
        Session session = tl.get();
        if(session==null) {
            session = sf.openSession();
            //放置Session
            tl.set(session);
        }
        return session;
    }
    //關閉Session
    public static void closeSssion() {
        //先從線程本地變量中獲取當前線程對象的Session對象
        Session session = tl.get();
        if(session!=null) {
            session.close();
            //驅逐被關閉的Session
            tl.set(null);
        }
    }
}

通用DAO接口:

HibernateDao接口:

package hibernateDao;

import java.io.Serializable;
import java.util.List;

/*
 * 通用Hibernate DAO接口
 */
public interface HibernateDao <T>{

    //保存
    public Serializable save(final T entity);

    //更新,必須帶主鍵
    public void update(final T entity);

    //保存或更新
    public void saveOrUpdate(final T entity);
    // 刪除,必須帶有主鍵
    public void delete(final T entity);

    // 通過對象標識符獲取對象
    public T findById(final Serializable oid);

    // 返回所有對象
    public List<T> findAll();

    // 獲取分頁記錄
    List<T> findByPage(String hql,int start, int pageSize);

    // 通用查詢方法:queryName是命名查詢名字
    public List<T> executeQuery(String hql, Object... params);

    // 通用查詢方法:queryName是命名查詢名字
    public List<T> executeNamedQuery(String queryName, Object... params);

    // 通用更新方法:queryName是命名查詢名字
    public int executeUpdate(String hql, Object... params);

    // 通用更新方法:queryName是命名查詢名字
    public int executeNamedUpdate(String hqlName, Object... params);

}

通用接口子類:

具體實現類 HibernateDaoImp可以實現自己的接口同時繼承該子類

package hibernateDao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.hibernate.query.Query;

public abstract class HibernateDaoImp<T> implements HibernateDao<T> {
    private Class<T> clazz;

    public HibernateDaoImp() {
        //獲取子類對應父類對象泛型的實際類型
        Type superClass = getClass().getGenericSuperclass();
        ParameterizedType type = (ParameterizedType) superClass;
        Type[] types = type.getActualTypeArguments();
        this.clazz = (Class<T>) types[0].getClass();    
    }
    @Override
    public Serializable save(T entity) {
        Serializable uid = HibernateUtil.getSession().save(entity);
        return uid;
    }

    @Override
    public void update(T entity) {
        HibernateUtil.getSession().update(entity);

    }

    @Override
    public void saveOrUpdate(T entity) {
        HibernateUtil.getSession().saveOrUpdate(entity);

    }

    @Override
    public void delete(T entity) {
        HibernateUtil.getSession().delete(entity);

    }

    @Override
    public T findById(Serializable oid) {
        T t = HibernateUtil.getSession().get(clazz, oid);
        return t;
    }

    @Override
    public List<T> findAll() {
        Query<T> query = HibernateUtil.getSession().createQuery("from " + clazz.getSimpleName());
        return query.getResultList();
    }

    @Override
    public List<T> findByPage(String hql, int start, int pageSize) {
        Query<T> query = HibernateUtil.getSession().createQuery(hql);
        query.setFirstResult(start);
        query.setMaxResults(pageSize);
        return query.getResultList();
    }

    @Override
    public List<T> executeQuery(String hql, Object... params) {
        Query<T> query = HibernateUtil.getSession().createQuery(hql);
        int len = params.length;
        if (len != 0) {
            for (int i = 0; i < len; i++) {
                query.setParameter(i, params[i]);
            }
        }
        return query.getResultList();
    }

    @Override
    public List<T> executeNamedQuery(String queryName, Object... params) {
        Query<T> query = HibernateUtil.getSession().getNamedQuery(queryName);
        int len = params.length;
        if (len != 0) {
            for (int i = 0; i < len; i++) {
                query.setParameter(i, params[i]);
            }
        }
        return query.getResultList();
    }

    @Override
    public int executeUpdate(String hql, Object... params) {
        Query<T> query = HibernateUtil.getSession().createQuery(hql);
        int len = params.length;
        if (len != 0) {
            for (int i = 0; i < len; i++) {
                query.setParameter(i, params[i]);
            }
        }
        return query.executeUpdate();
    }

    @Override
    public int executeNamedUpdate(String hqlName, Object... params) {
        Query<T> query = HibernateUtil.getSession().getNamedQuery(hqlName);
        int len = params.length;
        if (len != 0) {
            for (int i = 0; i < len; i++) {
                query.setParameter(i, params[i]);
            }
        }
        return query.executeUpdate();
    }

}

測試

UserInfoDaoImpl類:

package hibernateDao;

public class UserInfoDaoImpl<UserInfo> extends HibernateDaoImp<UserInfo> {

}
package hibernateDao;

import org.hibernate.Transaction;
import org.westos.hibernate.UserInfo;

public class TestDao {
    public static void main(String[] args) {
        UserInfoDaoImpl<UserInfo> impl = new UserInfoDaoImpl<>();
        Transaction ts = HibernateUtil.getSession().beginTransaction();
        UserInfo userInfo = new UserInfo("陳十","1334");
        impl.save(userInfo);
        ts.commit();
        HibernateUtil.getSession().close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章