天天看點

SessionFactory和Session簡單講解

首先,講一個悲傷的故事。。。

有一天,一個以為自己javaEE很叼的程式員,在經曆了好久不寫java代碼的情況下,去參加阿裡巴巴的java面試,然後,在被問到一個很簡單的問題的時候,結果沒有回答好。那麼接下來先說說這個問題吧。。。

問:hibernate的sessionfactory是幹嘛的?session又是幹嘛的呢?

那麼,你會嗎?可以講清楚麼?如果答案是會,可以,那麼你就不用往下看了。。。。如果會還是想往下看,那麼,

你就看呗。

在回答這個問題之前,先來看看一些概念。

一、hibernate是什麼?

Hibernate是一個開放源代碼的對象關系映射架構,它對JDBC進行了非常輕量級的對象封裝,使得Java程式員可以随心所欲的使用對象程式設計思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的用戶端程式使用,也可以在Servlet/JSP的Web應用中使用。----百度百科

其實我自己的了解是,使用hibernate,最常用的場景是,使用它的ORM機制,然後把傳統的關系型資料庫操作,轉換為面向對象的方式來操作。為什麼這麼做呢?在沒有使用到ORM之前。一個簡單的例子,你在表單上,填了好多個資料,姓名,性别,年齡。。。。。愛好等等等,然後你使用JDBC去連接配接資料庫,接下來一條一條的把資料從request或者某個地方讀進來,如果有100個,表示需要定義100個變量來暫存這些表單資料,然後在儲存到資料庫中,在儲存的時候,也要一下下的寫sql語句,再次傳100個值。。。如果是1000個。。想想就好累,我現在某個公司,學習使用PHP,存儲資料的時候,就是這樣一下下來,心好累。

那麼如果有了ORM,是什麼情況,你隻要把對應的資料庫的表,映射為一個對象(比如student)。然後在表單對應的input的name上,填寫對應對象的對應屬性(比如student.name),然後在儲存的時候,在送出到的Action中,定義一個student的對象執行個體,那麼這些資料就會自動儲存在這個對象中了(我用了Struts2,不扯這個,隻是說明效率)。接下來,你隻需要儲存一下這個對象就ok了。是不是感覺友善了好多。

二、什麼是sessionfactory

SessionFactory接口負責初始化Hibernate。它充當資料存儲源的代理,并負責建立Session對象。這裡用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常隻需要一個SessionFactory就夠,當需要操作多個資料庫時,可以為每個資料庫指定一個SessionFactory。----百度百科

我的了解是,其實顧名思義,sessionfactory,就是用來建立session會話(具體接下來講)的工廠。想想有一個特别大的工廠,專門用來在你需要使用session的時候,讓它幫你建立一個就好了。(突然記起來一個冷笑話,如果你沒有對象怎麼辦?辦法是,new一個出來呗。。額你沒有笑,我知道)。但是需要注意一下就是,一般來講,一個web工程(系統),如果涉及到的是一個資料庫(你在學校做項目,一般就一個吧。。。哈哈哈),那麼本工程就隻需要一個sessionfactory就夠了。這個工程所涉及到的所有的session,都交由這個sessionfactory來管理。

接下來,建立一個sessionfactory,一般有兩種建立方式,1.從XML檔案讀取配置資訊建構SessionFactory,2.從Java屬性檔案讀取配置資訊建構SessionFactory(這個不熟悉,沒怎用,不好意思)。

第一種:

1》執行個體化Configuration對象,預設讀取src目錄下的hibernate.cfg.xml,配置檔案

<span style="font-size:18px;">Configuration config = new Configuration().configure();</span>

或者在configure();中指明檔案名稱和路徑

<span style="font-size:24px;">Configuration config = new Configuration().configure("hibernate.cfg.xml");</span>

2》現在這個config對象,已經包括所有Hibernate運作期的參數,通過Configuration執行個體的buildSessionFactory()方法可以建構一個惟一的SessionFactory:

<span style="font-size:24px;">SessionFactory sessionFactory = config.buildSessionFactory();</span>

3》得到這個sessionfactory對象之後,就可以開始另外的話題了

三、什麼是Session

提起來Session的話,首先想到的是http這個東東的session,想到了http這個無狀态的協定,沒辦法儲存任何通路對象的資訊,是以就出現了session這個東東,用來記錄通路者的一些資訊。但是,好好轉折一下下,轉折,轉折,轉折說三遍。

在hibernate中的session并不是http中所說的session,一般把HttpSession對象稱為使用者會話。。。

而hibernate中的Session呢?是用來表示,應用程式和資料庫的一次互動(會話)。在這個Session中,包含了一般的持久化方法(CRUD),不要說不知道CRUD是什麼。而且,Session是一個輕量級對象(線程不安全),通常将每個Session執行個體和一個資料庫事務綁定,也就是每執行一個資料庫事務,都應該先建立一個新的Session執行個體,在使用Session後,還需要關閉Session。(記得關閉哈)

接下來,建立一個Session對象,依據第二步得到的sessionfactory對象。

<span style="font-size:24px;">Session session=sessionFactory.openSession();</span>

然後得到這個session之後,就可以使用它來進行資料庫的具體操作了,給一個簡單的代碼。多說一句,一般來說在使用session的時候,都會用到事務,尤其是需要對資料做修改的時候。上代碼:

<span style="font-size:24px;">public void save(Student student) {

    Transaction transaction= getSession().beginTransaction();  //開啟事務

    getSession().save(student);//隻要傳一個Student的對象執行個體        

    transaction.commit();  //事務送出 

    getSession().close();//關閉session

}</span>

簡單的總結一下。那麼開始繼續那個故事,應為那個程式員在面試的時候,沒有記起來一些事情,尤其是hibernate的session和http的session的差別,導緻很郁悶。是以做次簡單的總結,希望給有需要的人一些幫助。因為自己了解的也不是很深刻,難免有些地方扯的不對,還望大家見諒,并提出來。

offer還未到手,同志還需努力。加油哦!!!

--------------------- 

作者:将心666666 

來源:CSDN 

原文:https://blog.csdn.net/jiangxindu1/article/details/48037731 

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀