亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java面試題 Java持久層面試題目

Java持久層面試題目

Dec 10, 2019 pm 02:41 PM
java

Java持久層面試題目

什麼是ORM? ? ? ? ? ? ? ? ? ? ? ? (建議學(xué)習(xí):java訪談題目

#物件關(guān)係對應(yīng)(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的物件導(dǎo)向模型與資料庫關(guān)係式的關(guān)聯(lián)式模型互不匹配問題的技術(shù);

簡單的說,ORM是透過使用描述物件和資料庫之間映射的元資料(在Java中可以用XML或註解),將程式中的物件自動持久化到關(guān)聯(lián)式資料庫中或?qū)㈥P(guān)聯(lián)式資料庫表中的行轉(zhuǎn)換成Java對象,其本質(zhì)上就是將資料從一種形式轉(zhuǎn)換到另外一種形式。

Hibernate中SessionFactory是執(zhí)行緒安全的嗎? Session是線程安全的嗎(兩個線程能夠共享同一個Session嗎)?

SessionFactory對應(yīng)Hibernate的一個資料儲存的概念,它是執(zhí)行緒安全的,可以被多個執(zhí)行緒並發(fā)存取。 SessionFactory一般只會在啟動的時候建置。對於應(yīng)用程序,最好將SessionFactory透過單例模式進(jìn)行封裝以便於存取。

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

Session會延遲取得資料庫連線(也就是在需要的時候才會取得)。為了避免創(chuàng)建太多的session,可以使用ThreadLocal將session和當(dāng)前線程綁定在一起,這樣可以讓同一個線程獲得的總是同一個session。

Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

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

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

瞬時態(tài)的實(shí)例可以透過呼叫save()、persist()或saveOrUpdate()方法變成持久性;

遊離態(tài)的實(shí)例可以透過呼叫update()、saveOrUpdate()、 lock()或replicate()變成持久態(tài)。 save()和persist()將會引發(fā)SQL的INSERT語句,而update()或merge()會引發(fā)UPDATE語句。

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

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

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

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

3、save()方法不保證第2條,它要回傳標(biāo)識符,所以它會立即執(zhí)行INSERT語句,不管是在事務(wù)內(nèi)部或外部。

至於lock()方法和update()方法的區(qū)別,update()方法是把一個已經(jīng)更改過的脫管狀態(tài)的物件變成持久狀態(tài);lock()方法是把一個沒有更改過的脫管狀態(tài)的物件變成持久狀態(tài)。

闡述Session載入實(shí)體物件的過程。

1、Session在呼叫資料庫查詢功能之前,首先會在一級快取中透過實(shí)體類型和主鍵進(jìn)行查找,如果一級快取查找命中且資料狀態(tài)合法,則直接返回;

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

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

4、如果之前的查詢都未命中,則發(fā)出SQL語句,如果查詢未發(fā)現(xiàn)對應(yīng)記錄則將此次查詢添加到Session的NonExists中加以記錄,並返回null;

5、根據(jù)映射配置和SQL語句得到ResultSet,並建立對應(yīng)的實(shí)體物件;

6、將物件納入Session(一級快?。┑墓芾恚?/p>

7、如果有對應(yīng)的攔截器,則執(zhí)行攔截器的onLoad方法;

8、如果開啟並設(shè)定了要使用二級緩存,則將資料物件納入二級緩存;

9、傳回資料物件。

?

#將傳入的資料都當(dāng)成字串,會對傳入的資料自動加上引號;

$將傳入的資料直接顯示產(chǎn)生在SQL中。

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

說明MyBatis中命名空間(namespace)的作用。

在大型專案中,可能存在大量的SQL語句,這時候?yàn)槊總€SQL語句起一個唯一的識別(ID)就變得不容易了。

為了解決這個問題,在MyBatis中,可以為每個映射檔案起一個唯一的命名空間,這樣定義在這個映射檔案中的每個SQL語句就成了定義在這個命名空間中的一個ID。

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

MyBatis中的動態(tài)SQL是什麼意思?

對於一些複雜的查詢,我們可能會指定多個查詢條件,但是這些條件可能存在也可能不存在,如果不使用持久層框架我們可能需要自己拼裝SQL語句,不過MyBatis提供了動態(tài)SQL的功能來解決這個問題。 MyBatis中用來實(shí)作動態(tài)SQL的元素主要有:

- if    - choose / when / otherwise    - trim    - where    - set     - foreach

用法範(fàn)例:

<select id="foo" parameterType="Blog" resultType="Blog">        
select * from t_blog where 1 = 1
<if test="title != null">            
   and title = #{title}
</if>
<if test="content != null">            
   and content = #{content}
</if>
<if test="owner != null">            
   and owner = #{owner}
</if>
</select>

##JDBC程式設(shè)計(jì)有哪些不足之處,MyBatis是如何解決這些問題的?

1、JDBC:資料庫連結(jié)建立、釋放頻繁造成系統(tǒng)資源浪費(fèi)進(jìn)而影響系統(tǒng)效能,如果使用資料庫連結(jié)池可解決此問題。

MyBatis:在SqlMapConfig.xml中設(shè)定資料連結(jié)池,使用連接池管理資料庫連結(jié)。

2、JDBC:Sql語句寫在程式碼中造成程式碼不易維護(hù),實(shí)際應(yīng)用sql變化的可能較大,sql變動需要改變java程式碼。

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

3、JDBC:向sql語句傳參數(shù)麻煩,因?yàn)閟ql語句的where條件不一定,可能多也可能少,佔(zhàn)位符需要和參數(shù)一一對應(yīng)。

MyBatis: Mybatis自動將java物件對應(yīng)至sql語句。

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

MyBatis:Mybatis自動將sql執(zhí)行結(jié)果對應(yīng)至java物件。

MyBatis與Hibernate有哪些不同?

1、Mybatis和hibernate不同,它不完全是一個ORM框架,因?yàn)镸yBatis需要程式設(shè)計(jì)師自己寫Sql語句,不過mybatis可以透過XML或註解方式靈活配置要運(yùn)行的sql語句,並將java物件和sql語句映射產(chǎn)生最終執(zhí)行的sql,最後將sql執(zhí)行的結(jié)果再映射產(chǎn)生java物件。

2、Mybatis學(xué)習(xí)門檻低,簡單易學(xué),程式設(shè)計(jì)師直接編寫原始生態(tài)sql,可嚴(yán)格控制sql執(zhí)行效能,靈活度高,非常適合對關(guān)聯(lián)式資料模型要求不高的軟體開發(fā),例如互聯(lián)網(wǎng)軟體、企業(yè)營運(yùn)軟體等,因?yàn)檫@類軟體需求變化頻繁,一但需求變化要求成果輸出迅速。

但是靈活的前提是mybatis無法做到資料庫無關(guān)性,如果需要實(shí)作支援多種資料庫的軟體則需要自訂多套sql映射文件,工作量大。??

3、Hibernate物件/關(guān)係映射能力強(qiáng),資料庫無關(guān)性好,對於關(guān)係模型要求高的軟體(例如需求固定的客製化軟體)如果用hibernate開發(fā)可以節(jié)省很多程式碼,提高效率。

但是Hibernate的缺點(diǎn)是學(xué)習(xí)門檻高,要精通門檻更高,而且怎麼設(shè)計(jì)O/R映射,在性能和對像模型之間如何權(quán)衡,以及怎樣用好Hibernate需要具有很強(qiáng)的經(jīng)驗(yàn)和能力才行。? ? ? ? ??

總之,依照使用者的需求在有限的資源環(huán)境下只要能做出維護(hù)性、可擴(kuò)展性良好的軟體架構(gòu)就是好架構(gòu),所以架構(gòu)只有適合才是最好。

(這裡也可以結(jié)合自己的理解說,別說的收不?。?p>

#簡單的說一下MyBatis的一級快取和二級快取?

Mybatis先到快取中查詢結(jié)果集,如果沒有則查詢資料庫,如果有則從快取取出回傳結(jié)果集就不走資料庫。 Mybatis內(nèi)部儲存快取使用一個HashMap,key為hashCode sqlId Sql語句。 value為從查詢出來映射生成的java物件

Mybatis的二級快取即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從快取中獲取資料。二級緩存是可以跨SqlSession的。

以上是Java持久層面試題目的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設(shè)置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

itertools.combinations用於生成從可迭代對像中選取指定數(shù)量元素的所有不重複組合(順序無關(guān)),其用法包括:1.從列表中選2個元素組合,如('A','B')、('A','C')等,避免重複順序;2.對字符串取3個字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

故障排除常見的java`ofmemoryError`場景'' 故障排除常見的java`ofmemoryError`場景'' Jul 31, 2025 am 09:07 AM

java.lang.OutOfMemoryError:Javaheapspace表示堆內(nèi)存不足,需檢查大對象處理、內(nèi)存洩漏及堆設(shè)置,通過堆轉(zhuǎn)儲分析工具定位並優(yōu)化代碼;2.Metaspace錯誤因類元數(shù)據(jù)過多,常見於動態(tài)類生成或熱部署,應(yīng)限制MaxMetaspaceSize並優(yōu)化類加載;3.Unabletocreatenewnativethread因係統(tǒng)線程資源耗盡,需檢查線程數(shù)限制、使用線程池、調(diào)整棧大?。?.GCoverheadlimitexceeded指GC頻繁但回收少,應(yīng)分析GC日誌,優(yōu)化

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

fixture是用於為測試提供預(yù)設(shè)環(huán)境或數(shù)據(jù)的函數(shù),1.使用@pytest.fixture裝飾器定義fixture;2.在測試函數(shù)中以參數(shù)形式註入fixture;3.yield之前執(zhí)行setup,之後執(zhí)行teardown;4.通過scope參數(shù)控製作用域,如function、module等;5.將共用fixture放在conftest.py中實(shí)現(xiàn)跨文件共享,從而提升測試的可維護(hù)性和復(fù)用性。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

See all articles