1. 程式人生 > 程式設計 >java關於持久層面試題目整理

java關於持久層面試題目整理

一、什麼是ORM?

物件關係對映(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的面向物件模型與資料庫的關係模型互不匹配問題的技術;

簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料(在Java中可以用XML或者是註解),將程式中的物件自動持久化到關係資料庫中或者將關係資料庫表中的行轉換成Java物件,其本質上就是將資料從一種形式轉換到另外一種形式。

二、Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)?

SessionFactory對應Hibernate的一個數據儲存的概念,它是執行緒安全的,可以被多個執行緒併發訪問。SessionFactory一般只會在啟動的時候構建。對於應用程式,最好將SessionFactory通過單例模式進行封裝以便於訪問。

Session是一個輕量級非執行緒安全的物件(執行緒間不能共享session),它表示與資料庫進行互動的一個工作單元。Session是由SessionFactory建立的,在任務完成之後它會被關閉。Session是持久層服務對外提供的主要介面。

Session會延遲獲取資料庫連線(也就是在需要的時候才會獲取)。為了避免建立太多的session,可以使用ThreadLocal將session和當前執行緒繫結在一起,這樣可以讓同一個執行緒獲得的總是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

三、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什麼的?有什麼區別?

Hibernate的物件有三種狀態:瞬時態(transient)、持久態(persistent)和遊離態(detached)。

瞬時態的例項可以通過呼叫save()、persist()或者saveOrUpdate()方法變成持久態;

遊離態的例項可以通過呼叫 update()、saveOrUpdate()、lock()或者replicate()變成持久態。save()和persist()將會引發SQL的INSERT語句,而update()或merge()會引發UPDATE語句。

save()和update()的區別在於一個是將瞬時態物件變成持久態,一個是將遊離態物件變為持久態。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態合併到已有的持久化物件上或建立新的持久化物件。

對於persist()方法,按照官方文件的說明:

1、persist()方法把一個瞬時態的例項持久化,但是並不保證識別符號被立刻填入到持久化例項中,識別符號的填入可能被推遲到flush的時間;

2、persist()方法保證當它在一個事務外部被呼叫的時候並不觸發一個INSERT語句,當需要封裝一個長會話流程的時候,persist()方法是很有必要的;

3、save()方法不保證第2條,它要返回識別符號,所以它會立即執行INSERT語句,不管是在事務內部還是外部。至於lock()方法和update()方法的區別,update()方法是把一個已經更改過的脫管狀態的物件變成持久狀態;lock()方法是把一個沒有更改過的脫管狀態的物件變成持久狀態。

四、闡述Session載入實體物件的過程

1、Session在呼叫資料庫查詢功能之前,首先會在一級快取中通過實體型別和主鍵進行查詢,如果一級快取查詢命中且資料狀態合法,則直接返回;

2、如果一級快取沒有命中,接下來Session會在當前NonExists記錄(相當於一個查詢黑名單,如果出現重複的無效查詢可以迅速做出判斷,從而提升效能)中進行查詢,如果NonExists中存在同樣的查詢條件,則返回null;

3、如果一級快取查詢失敗查詢二級快取,如果二級快取命中直接返回;

4、如果之前的查詢都未命中,則發出SQL語句,如果查詢未發現對應記錄則將此次查詢新增到Session的NonExists中加以記錄,並返回null;

5、根據對映配置和SQL語句得到ResultSet,並建立對應的實體物件;

6、將物件納入Session(一級快取)的管理;

7、如果有對應的攔截器,則執行攔截器的onLoad方法;

8、如果開啟並設定了要使用二級快取,則將資料物件納入二級快取;

9、返回資料物件。

五、MyBatis中使用#和$書寫佔位符有什麼區別?

#將傳入的資料都當成一個字串,會對傳入的資料自動加上引號;

$將傳入的資料直接顯示生成在SQL中。

注意:使用$佔位符可能會導致SQL注射攻擊,能用#的地方就不要使用$,寫order by子句的時候應該用$而不是#。

內容補充:

JDBC程式設計有哪些不足之處,MyBatis是如何解決這些問題的?

● JDBC:資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。

MyBatis:在SqlMapConfig.xml中配置資料鏈接池,使用連線池管理資料庫連結。

● JDBC:Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。

MyBatis:將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。

● JDBC:向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。

MyBatis: Mybatis自動將java物件對映至sql語句。

● JDBC:對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便。

MyBatis:Mybatis自動將sql執行結果對映至java物件。

到此這篇關於java關於持久層面試題目整理的文章就介紹到這了,更多相關java持久層面試題目內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!