hibenate --- - 일반 설정 을 통 해 DAO

6746 단어 hibernate
자신의 일부 견해 에서 비롯 되 고 인터넷 에서 찾 은 해석 과 주석 의 이해 부분 이 전면적 이 고 정확 하지 않 을 수 있 습 니 다.
package com.test.dao;

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

/**
 *   dao  
 * @author Ming
 * @date 2017/11/16 12:46
 */
 //   entity user,    id   Integer   ,       BaseDao
public interface BaseDaoextends Serializable> {

    /**
     *         
     * @param id
     * @return
     */
    T get(PK id);

    /**
     *     
     * @return
     */
    List getAll();

    /**
     *   
     * @param entity
     */
    void save(T entity);

    /**
     *       
     * @param id
     */
    void delete(PK id);

    /**
     *   
     * @param entity
     */
    void update(T entity);

    /**
     *   or  
     * @param entity
     */
    void saveOrUpdate(T entity);

    /**
     *     
     * @param hql
     * @return
     */
    Integer getSize(String hql);
}
package com.test.dao.impl;


import com.test.dao.BaseDao;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;

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

/**
 *  dao   
 * @author Ming
 * @date 2017/11/16 12:46
 */
@Repository
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {

//    DAO     HibernateDaoSupport ,    HibernareDaoSupport        sessionFactory
//     sessionfactory  HibernateDaoSupprot  sessionfactory,             HibernateDaoSupport      
    @Resource
    private SessionFactory sessionFactory;
    //     Class  
    private Class entityClass;

    public BaseDaoImpl() {
//                 Class   ,          Class                    。
        Class clz = getClass();
//              Class       ( 、  、      void)       Type
        Type type = clz.getGenericSuperclass();
//        instanceof         :      ?            ?   getClass        ==                  。           
//        ParameterizedType        ,  Collection
        if (type instanceof ParameterizedType) {
            //           
            Type[] types = ((ParameterizedType) type).getActualTypeArguments();
            entityClass = (Class) types[0];
        }
    }

    /**
     *   Session   
     *   sessionFactory.getCurrentSession():               。
     *    session        ,        session        ,    session。
     * 
     * sessionFactory.openSession():         session,        ,      ,       
     * 
     *         ,  DAO    Spring  hibernate   ,  Spring    session      ,
     *    getCurrentSession ()。
     * 
     * @return
     */
    public Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public T get(PK id) {
        return (T) getSession().get(entityClass, id);
    }

    @Override
    public List getAll() {
        Query query = getSession().createQuery("from " + entityClass.getName());//from TableName
        return (List) query.list();
    }

    @Override
    public void save(T entity) {
        getSession().save(entity);
        getSession().flush();
    }

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

    /**
     * .fiush()     ,  SQL。
     * @param entity
     */
    @Override
    public void delete(PK id) {
        T entity = get(id);
        getSession().delete(entity);
        getSession().flush();
    }

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

    @Override
    public Integer getSize(String hql) {
        Query query = getSession().createQuery(hql);
        return query.list().size();
    }
}

좋은 웹페이지 즐겨찾기