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
版權宣告:本文為博主原創文章,轉載請附上博文連結!