溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于java持久層面試題匯總

發(fā)布時間:2020-03-24 10:32:37 來源:億速云 閱讀:716 作者:小新 欄目:編程語言

今天小編給大家總結(jié)了關(guān)于java持久層面試題匯總,下面一起來看看吧。

關(guān)于java持久層面試題匯總

1、解釋一下MyBatis中命名空間(namespace)的作用。

在大型項目中,可能存在大量的SQL語句,這時候為每個SQL語句起一個唯一的標(biāo)識(ID)就變得并不容易了。為了解決這個問題,在MyBatis中,可以為每個映射文件起一個唯一的命名空間,這樣定義在這個映射文件中的每個SQL語句就成了定義在這個命名空間中的一個ID。

只要我們能夠保證每個命名空間中這個ID是唯一的,即使在不同映射文件中的語句ID相同,也不會再產(chǎn)生沖突了。

2、Hibernate中SessionFactory是線程安全的嗎?Session是線程安全的嗎(兩個線程能夠共享同一個Session嗎)? 
  SessionFactory對應(yīng)Hibernate的一個數(shù)據(jù)存儲的概念,它是線程安全的,可以被多個線程并發(fā)訪問。SessionFactory一般只會在啟動的時候構(gòu)建。對于應(yīng)用程序,最好將SessionFactory通過單例模式進行封裝以便于訪問。

  Session是一個輕量級非線程安全的對象(線程間不能共享session),它表示與數(shù)據(jù)庫進行交互的一個工作單元。Session是由SessionFactory創(chuàng)建的,在任務(wù)完成之后它會被關(guān)閉。Session是持久層服務(wù)對外提供的主要接口。

  Session會延遲獲取數(shù)據(jù)庫連接(也就是在需要的時候才會獲?。榱吮苊鈩?chuàng)建太多的session,可以使用ThreadLocal將session和當(dāng)前線程綁定在一起,這樣可以讓同一個線程獲得的總是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

3、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什么的?有什么區(qū)別? 
  Hibernate的對象有三種狀態(tài):瞬時態(tài)(transient)、持久態(tài)(persistent)和游離態(tài)(detached)。

  瞬時態(tài)的實例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法變成持久態(tài);

  游離態(tài)的實例可以通過調(diào)用 update()、saveOrUpdate()、lock()或者replicate()變成持久態(tài)。save()和persist()將會引發(fā)SQL的INSERT語句,而update()或merge()會引發(fā)UPDATE語句。

  ● save()和update()的區(qū)別在于一個是將瞬時態(tài)對象變成持久態(tài),一個是將游離態(tài)對象變?yōu)槌志脩B(tài)。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態(tài)合并到已有的持久化對象上或創(chuàng)建新的持久化對象。

對于persist()方法,按照官方文檔的說明:

  ● persist()方法把一個瞬時態(tài)的實例持久化,但是并不保證標(biāo)識符被立刻填入到持久化實例中,標(biāo)識符的填入可能被推遲到flush的時間;

  ● persist()方法保證當(dāng)它在一個事務(wù)外部被調(diào)用的時候并不觸發(fā)一個INSERT語句,當(dāng)需要封裝一個長會話流程的時候,persist()方法是很有必要的;

  ● save()方法不保證第2條,它要返回標(biāo)識符,所以它會立即執(zhí)行INSERT語句,不管是在事務(wù)內(nèi)部還是外部。至于lock()方法和update()方法的區(qū)別,update()方法是把一個已經(jīng)更改過的脫管狀態(tài)的對象變成持久狀態(tài);lock()方法是把一個沒有更改過的脫管狀態(tài)的對象變成持久狀態(tài)。

4、闡述Session加載實體對象的過程。 
  1、Session在調(diào)用數(shù)據(jù)庫查詢功能之前,首先會在一級緩存中通過實體類型和主鍵進行查找,如果一級緩存查找命中且數(shù)據(jù)狀態(tài)合法,則直接返回; 
  2、如果一級緩存沒有命中,接下來Session會在當(dāng)前NonExists記錄(相當(dāng)于一個查詢黑名單,如果出現(xiàn)重復(fù)的無效查詢可以迅速做出判斷,從而提升性能)中進行查找,如果NonExists中存在同樣的查詢條件,則返回null; 
  3、如果一級緩存查詢失敗查詢二級緩存,如果二級緩存命中直接返回; 
  4、如果之前的查詢都未命中,則發(fā)出SQL語句,如果查詢未發(fā)現(xiàn)對應(yīng)記錄則將此次查詢添加到Session的NonExists中加以記錄,并返回null; 
  5、根據(jù)映射配置和SQL語句得到ResultSet,并創(chuàng)建對應(yīng)的實體對象; 
  6、將對象納入Session(一級緩存)的管理; 
  7、如果有對應(yīng)的攔截器,則執(zhí)行攔截器的onLoad方法; 
  8、如果開啟并設(shè)置了要使用二級緩存,則將數(shù)據(jù)對象納入二級緩存; 
  9、返回數(shù)據(jù)對象。

5、MyBatis中使用#和$書寫占位符有什么區(qū)別? 
  #將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對傳入的數(shù)據(jù)自動加上引號;

  $將傳入的數(shù)據(jù)直接顯示生成在SQL中。

  注意:使用$占位符可能會導(dǎo)致SQL注射攻擊,能用#的地方就不要使用$,寫order by子句的時候應(yīng)該用$而不是#。

6、解釋一下MyBatis中命名空間(namespace)的作用。 
  在大型項目中,可能存在大量的SQL語句,這時候為每個SQL語句起一個唯一的標(biāo)識(ID)就變得并不容易了。為了解決這個問題,在MyBatis中,可以為每個映射文件起一個唯一的命名空間,這樣定義在這個映射文件中的每個SQL語句就成了定義在這個命名空間中的一個ID。只要我們能夠保證每個命名空間中這個ID是唯一的,即使在不同映射文件中的語句ID相同,也不會再產(chǎn)生沖突了。

以上就是關(guān)于java持久層面試題匯總的詳細內(nèi)容,更多請關(guān)注億速云其它相關(guān)文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI