java關(guān)于持久層面試題目整理
一、什么是ORM?
對(duì)象關(guān)系映射(Object-Relational Mapping,簡(jiǎn)稱ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫(kù)的關(guān)系模型互不匹配問(wèn)題的技術(shù);
簡(jiǎn)單的說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù)(在Java中可以用XML或者是注解),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中或者將關(guān)系數(shù)據(jù)庫(kù)表中的行轉(zhuǎn)換成Java對(duì)象,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。
二、Hibernate中SessionFactory是線程安全的嗎?Session是線程安全的嗎(兩個(gè)線程能夠共享同一個(gè)Session嗎)?
SessionFactory對(duì)應(yīng)Hibernate的一個(gè)數(shù)據(jù)存儲(chǔ)的概念,它是線程安全的,可以被多個(gè)線程并發(fā)訪問(wèn)。SessionFactory一般只會(huì)在啟動(dòng)的時(shí)候構(gòu)建。對(duì)于應(yīng)用程序,最好將SessionFactory通過(guò)單例模式進(jìn)行封裝以便于訪問(wèn)。
Session是一個(gè)輕量級(jí)非線程安全的對(duì)象(線程間不能共享session),它表示與數(shù)據(jù)庫(kù)進(jìn)行交互的一個(gè)工作單元。Session是由SessionFactory創(chuàng)建的,在任務(wù)完成之后它會(huì)被關(guān)閉。Session是持久層服務(wù)對(duì)外提供的主要接口。
Session會(huì)延遲獲取數(shù)據(jù)庫(kù)連接(也就是在需要的時(shí)候才會(huì)獲?。?。為了避免創(chuàng)建太多的session,可以使用ThreadLocal將session和當(dāng)前線程綁定在一起,這樣可以讓同一個(gè)線程獲得的總是同一個(gè)session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。
三、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什么的?有什么區(qū)別?
Hibernate的對(duì)象有三種狀態(tài):瞬時(shí)態(tài)(transient)、持久態(tài)(persistent)和游離態(tài)(detached)。
瞬時(shí)態(tài)的實(shí)例可以通過(guò)調(diào)用save()、persist()或者saveOrUpdate()方法變成持久態(tài);
游離態(tài)的實(shí)例可以通過(guò)調(diào)用 update()、saveOrUpdate()、lock()或者replicate()變成持久態(tài)。save()和persist()將會(huì)引發(fā)SQL的INSERT語(yǔ)句,而update()或merge()會(huì)引發(fā)UPDATE語(yǔ)句。
save()和update()的區(qū)別在于一個(gè)是將瞬時(shí)態(tài)對(duì)象變成持久態(tài),一個(gè)是將游離態(tài)對(duì)象變?yōu)槌志脩B(tài)。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態(tài)合并到已有的持久化對(duì)象上或創(chuàng)建新的持久化對(duì)象。
對(duì)于persist()方法,按照官方文檔的說(shuō)明:
1、persist()方法把一個(gè)瞬時(shí)態(tài)的實(shí)例持久化,但是并不保證標(biāo)識(shí)符被立刻填入到持久化實(shí)例中,標(biāo)識(shí)符的填入可能被推遲到flush的時(shí)間;
2、persist()方法保證當(dāng)它在一個(gè)事務(wù)外部被調(diào)用的時(shí)候并不觸發(fā)一個(gè)INSERT語(yǔ)句,當(dāng)需要封裝一個(gè)長(zhǎng)會(huì)話流程的時(shí)候,persist()方法是很有必要的;
3、save()方法不保證第2條,它要返回標(biāo)識(shí)符,所以它會(huì)立即執(zhí)行INSERT語(yǔ)句,不管是在事務(wù)內(nèi)部還是外部。至于lock()方法和update()方法的區(qū)別,update()方法是把一個(gè)已經(jīng)更改過(guò)的脫管狀態(tài)的對(duì)象變成持久狀態(tài);lock()方法是把一個(gè)沒(méi)有更改過(guò)的脫管狀態(tài)的對(duì)象變成持久狀態(tài)。
四、闡述Session加載實(shí)體對(duì)象的過(guò)程
1、Session在調(diào)用數(shù)據(jù)庫(kù)查詢功能之前,首先會(huì)在一級(jí)緩存中通過(guò)實(shí)體類型和主鍵進(jìn)行查找,如果一級(jí)緩存查找命中且數(shù)據(jù)狀態(tài)合法,則直接返回;
2、如果一級(jí)緩存沒(méi)有命中,接下來(lái)Session會(huì)在當(dāng)前NonExists記錄(相當(dāng)于一個(gè)查詢黑名單,如果出現(xiàn)重復(fù)的無(wú)效查詢可以迅速做出判斷,從而提升性能)中進(jìn)行查找,如果NonExists中存在同樣的查詢條件,則返回null;
3、如果一級(jí)緩存查詢失敗查詢二級(jí)緩存,如果二級(jí)緩存命中直接返回;
4、如果之前的查詢都未命中,則發(fā)出SQL語(yǔ)句,如果查詢未發(fā)現(xiàn)對(duì)應(yīng)記錄則將此次查詢添加到Session的NonExists中加以記錄,并返回null;
5、根據(jù)映射配置和SQL語(yǔ)句得到ResultSet,并創(chuàng)建對(duì)應(yīng)的實(shí)體對(duì)象;
6、將對(duì)象納入Session(一級(jí)緩存)的管理;
7、如果有對(duì)應(yīng)的攔截器,則執(zhí)行攔截器的onLoad方法;
8、如果開(kāi)啟并設(shè)置了要使用二級(jí)緩存,則將數(shù)據(jù)對(duì)象納入二級(jí)緩存;
9、返回?cái)?shù)據(jù)對(duì)象。
五、MyBatis中使用#和$書寫占位符有什么區(qū)別?
#將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)傳入的數(shù)據(jù)自動(dòng)加上引號(hào);
$將傳入的數(shù)據(jù)直接顯示生成在SQL中。
注意:使用$占位符可能會(huì)導(dǎo)致SQL注射攻擊,能用#的地方就不要使用$,寫order by子句的時(shí)候應(yīng)該用$而不是#。
內(nèi)容補(bǔ)充:
JDBC編程有哪些不足之處,MyBatis是如何解決這些問(wèn)題的?
● JDBC:數(shù)據(jù)庫(kù)鏈接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費(fèi)從而影響系統(tǒng)性能,如果使用數(shù)據(jù)庫(kù)鏈接池可解決此問(wèn)題。
MyBatis:在SqlMapConfig.xml中配置數(shù)據(jù)鏈接池,使用連接池管理數(shù)據(jù)庫(kù)鏈接。
● JDBC:Sql語(yǔ)句寫在代碼中造成代碼不易維護(hù),實(shí)際應(yīng)用sql變化的可能較大,sql變動(dòng)需要改變java代碼。
MyBatis:將Sql語(yǔ)句配置在XXXXmapper.xml文件中與java代碼分離。
● JDBC:向sql語(yǔ)句傳參數(shù)麻煩,因?yàn)閟ql語(yǔ)句的where條件不一定,可能多也可能少,占位符需要和參數(shù)一一對(duì)應(yīng)。
MyBatis: Mybatis自動(dòng)將java對(duì)象映射至sql語(yǔ)句。
● JDBC:對(duì)結(jié)果集解析麻煩,sql變化導(dǎo)致解析代碼變化,且解析前需要遍歷,如果能將數(shù)據(jù)庫(kù)記錄封裝成pojo對(duì)象解析比較方便。
MyBatis:Mybatis自動(dòng)將sql執(zhí)行結(jié)果映射至java對(duì)象。
到此這篇關(guān)于java關(guān)于持久層面試題目整理的文章就介紹到這了,更多相關(guān)java持久層面試題目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)戰(zhàn):Spring如何找到對(duì)應(yīng)轉(zhuǎn)換器優(yōu)雅使用枚舉參數(shù)
這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)中Spring是如何找到對(duì)應(yīng)轉(zhuǎn)換器優(yōu)雅的使用枚舉參數(shù),文中附有詳細(xì)的實(shí)例代碼有需要的朋友可以參考下,希望可以有所幫助2021-08-08
Java Set集合及其子類HashSet與LinkedHashSet詳解
這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過(guò)Set集合存儲(chǔ)原理展開(kāi)文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下2022-06-06
Java實(shí)現(xiàn)將Boolean轉(zhuǎn)為Json對(duì)象的方法
在Java中,將boolean值轉(zhuǎn)換為JSON對(duì)象通常涉及使用JSON庫(kù),例如org.json或Gson,這里我們將使用org.json庫(kù)來(lái)進(jìn)行詳細(xì)演示,這個(gè)庫(kù)提供了簡(jiǎn)單且直觀的方法來(lái)創(chuàng)建和操作JSON對(duì)象,需要的朋友可以參考下2024-11-11
MyBatisPlus?大數(shù)據(jù)量查詢慢的問(wèn)題解決
本文主要介紹了MyBatis?Plus?解決大數(shù)據(jù)量查詢慢問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
idea 打包maven項(xiàng)目忽略test文件的操作
這篇文章主要介紹了idea 打包maven項(xiàng)目忽略test文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
一文詳解如何配置MyBatis實(shí)現(xiàn)打印可執(zhí)行的SQL語(yǔ)句
在MyBatis中,動(dòng)態(tài)SQL是一個(gè)強(qiáng)大的特性,允許我們?cè)赬ML映射文件或注解中編寫條件語(yǔ)句,根據(jù)運(yùn)行時(shí)的參數(shù)來(lái)決定SQL的具體執(zhí)行內(nèi)容,這篇文章主要給大家介紹了關(guān)于如何配置MyBatis實(shí)現(xiàn)打印可執(zhí)行的SQL語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2024-08-08
Java中的WeakHashMap概念原理以及簡(jiǎn)單案例
這篇文章主要介紹了Java中的WeakHashMap概念原理以及簡(jiǎn)單案例,WeakHashMap使用了軟引用結(jié)構(gòu),它的對(duì)象在垃圾回收時(shí)會(huì)被刪除,垃圾回收是優(yōu)先級(jí)非常低的線程,不能被顯示調(diào)用,當(dāng)內(nèi)存不足的時(shí)候會(huì)啟用,需要的朋友可以參考下2023-09-09
windows 32位eclipse遠(yuǎn)程hadoop開(kāi)發(fā)環(huán)境搭建
這篇文章主要介紹了windows 32位eclipse遠(yuǎn)程hadoop開(kāi)發(fā)環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2016-07-07

