天天看點

Hibernate5.x 基本開發

簡介:

  Hibernate 不僅僅管理Java類到資料庫表的映射(包括Java資料類型到SQL資料類型的映射),還提供資料查詢和擷取資料的方法,可以大幅度減少開發時人工使用SQL和JDBC處理資料的時間。

快速配置

(1)導包

Hibernate5.x 基本開發
部分包在下載下傳的hibernate/lib/required 中(要全導)
Hibernate5.x 基本開發
下面幾個包無或出現錯誤

(2)總src目錄

Hibernate5.x 基本開發

(3)User.java(開發持久化類,可由POJP+持久化注解組成)

Hibernate5.x 基本開發
運用注解可以不用下面的User.hbm.xml,而上面User.java隻是POJO

(4)hibernate.cfg.xml

Hibernate5.x 基本開發

(5)User.hbm.xml

Hibernate5.x 基本開發

(6)HibernateDemo.java

Hibernate5.x 基本開發
可以寫個工具類來友善初始化session

(7)成功效果圖

Hibernate5.x 基本開發

詳解過程(對應HibernateDemo.java)

為了使用Hibernate進行持久化操作,通常有如下操作步驟。

①開發持久類

②擷取Configuration

Hibernate5.x 基本開發

③擷取SessionFactory

Hibernate5.x 基本開發

④擷取Session,打開事務

Hibernate5.x 基本開發

⑤用面向對象的方式操作資料庫

⑥關閉事務,關閉session

Hibernate5.x 基本開發

PO與Session的關聯關系,PO可有如下三種狀态:

(1)瞬态:如果PO執行個體從未與Session關聯過,該PO執行個體處于瞬态狀态

Hibernate5.x 基本開發

(2)持久化:如果PO執行個體與Session關聯起來,且該執行個體對應到資料庫記錄,則該執行個體處于持久化狀态。

Hibernate5.x 基本開發

(3)脫管:如果PO執行個體曾經與Session關聯過,但因為Session的關閉等原因,PO執行個體脫離了Session的管理,這種狀态被稱為脫管狀态。

Hibernate5.x 基本開發
Hibernate5.x 基本開發
Hibernate5.x 基本開發
Hibernate5.x 基本開發

HibernateUtils

//這個項目是使用這個的(但會提示過時了,對于Hibernate5.x)
package utils;

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

/**
 * Created by Donald on 2016/11/5.
 */
public class HibernateUtils
    private static final Configuration cfg;
    private static final SessionFactory sessionFactory;
    //靜态代碼塊實作
    static{
        //加載核心配置檔案
        cfg = new Configuration().configure();
        sessionFactory = cfg.buildSessionFactory();

    }

    //提供傳回本地線程綁的session的方法
    public static Session getSessionObject(){
        return sessionFactory.getCurrentSession();
    }

    //提供方法傳回sessionFactory
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    public static void main(String[] args) {

    }
}      

這個是做大作業時候寫的(可使用于Hibernate5.X,不提示過時)

//隻寫了部分,其他參照即可
package utils;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

final public class HibernateUtil
    private static SessionFactory sessinotallow=null;

    private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
    private HibernateUtil(){};
    static {
        sessinotallow=new Configuration().configure().buildSessionFactory();
    }


    public static Session openSession(){
        return sessionFactory.openSession();
    }

    public static Session getCurrentSession(){

        Session sessinotallow=threadLocal.get();

        if(sessinotallow==null){
            sessinotallow=sessionFactory.openSession();

            threadLocal.set(session);
        }
        return session;


    }

    public static void closeCurrentSession(){

        Session s=getCurrentSession();

        if(s!=null&& s.isOpen() ){
            s.close();
            threadLocal.set(null);
        }
    }

    /**
     * 查找單一
     * @param hql
     * @param parameters
     * @return
    public static Object uniqueQuery(String hql,String [] parameters){

        Session s = null;
        Object obj = null;

        try {

            s = openSession();

            Query query = s.createQuery(hql);
            //先判斷是否有參數要綁定
            if(parameters != null && parameters.length > 0){
                for(int i=0 ; i < parameters.length; i++){
                    query.setParameter(i, parameters[i]);
                }
            }
            /**
             * 若使用query.getSingleResult()
             * 如果查詢到的object為null 則會直接異常
             */
            obj = query.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }finally{
            if(s!=null&&s.isOpen()){
                s.close();
            }

        }
        return obj;
    }


    public static List executeQuery(String hql,String [] parameters){

        Session s = null;
        List list = null;

        try {
            s = openSession();
            Query query = s.createQuery(hql);
            //先判斷是否有參數要綁定
            if(parameters!=null&& parameters.length>0){
                for(int i=0;i<parameters.length;i++){
                    query.setParameter(i, parameters[i]);
                }
            }
            list = query.list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
            // TODO: handle exception
        }finally{

            if(s!=null&&s.isOpen()){
                s.close();
            }

        }
        return