日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java持久層面試題目及答案整理

瀏覽:178日期:2022-09-05 09:32:17

什么是ORM?

對象關(guān)系映射(Object-Relational Mapping,簡稱ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫的關(guān)系模型互不匹配問題的技術(shù);

簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)(在Java中可以用XML或者是注解),將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中或者將關(guān)系數(shù)據(jù)庫表中的行轉(zhuǎn)換成Java對象,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。

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

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

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

Session會延遲獲取數(shù)據(jù)庫連接(也就是在需要的時候才會獲取)。為了避免創(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)的實例可以通過調(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()方法,按照官方文檔的說明:

1、persist()方法把一個瞬時態(tài)的實例持久化,但是并不保證標(biāo)識符被立刻填入到持久化實例中,標(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加載實體對象的過程。

1、Session在調(diào)用數(shù)據(jù)庫查詢功能之前,首先會在一級緩存中通過實體類型和主鍵進(jìn)行查找,如果一級緩存查找命中且數(shù)據(jù)狀態(tài)合法,則直接返回;

2、如果一級緩存沒有命中,接下來Session會在當(dāng)前NonExists記錄(相當(dāng)于一個查詢黑名單,如果出現(xiàn)重復(fù)的無效查詢可以迅速做出判斷,從而提升性能)中進(jìn)行查找,如果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ù)對象。

#將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對傳入的數(shù)據(jù)自動加上引號;

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

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

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

在大型項目中,可能存在大量的SQL語句,這時候為每個SQL語句起一個唯一的標(biāo)識(ID)就變得并不容易了。

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

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

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

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

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

用法舉例:

<select 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編程有哪些不足之處,MyBatis是如何解決這些問題的?

1、JDBC:數(shù)據(jù)庫鏈接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費從而影響系統(tǒng)性能,如果使用數(shù)據(jù)庫鏈接池可解決此問題。

MyBatis:在SqlMapConfig.xml中配置數(shù)據(jù)鏈接池,使用連接池管理數(shù)據(jù)庫鏈接。

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

MyBatis:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

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

MyBatis: Mybatis自動將java對象映射至sql語句。

4,JDBC:對結(jié)果集解析麻煩,sql變化導(dǎo)致解析代碼變化,且解析前需要遍歷,如果能將數(shù)據(jù)庫記錄封裝成pojo對象解析比較方便。

MyBatis:Mybatis自動將sql執(zhí)行結(jié)果映射至java對象。

MyBatis與Hibernate有哪些不同?

1、Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或注解方式靈活配置要運行的sql語句,并將java對象和sql語句映射生成最終執(zhí)行的sql,最后將sql執(zhí)行的結(jié)果再映射生成java對象。

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

但是靈活的前提是mybatis無法做到數(shù)據(jù)庫無關(guān)性,如果需要實現(xiàn)支持多種數(shù)據(jù)庫的軟件則需要自定義多套sql映射文件,工作量大。

3、Hibernate對象/關(guān)系映射能力強,數(shù)據(jù)庫無關(guān)性好,對于關(guān)系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發(fā)可以節(jié)省很多代碼,提高效率。

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

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

(這里也可以結(jié)合自己的理解說,別說的收不住)

簡單的說一下MyBatis的一級緩存和二級緩存?

Mybatis首先去緩存中查詢結(jié)果集,如果沒有則查詢數(shù)據(jù)庫,如果有則從緩存取出返回結(jié)果集就不走數(shù)據(jù)庫。Mybatis內(nèi)部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象

Mybatis的二級緩存即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中獲取數(shù)據(jù)。二級緩存是可以跨SqlSession的。

以上就是Java持久層面試題目及答案整理的詳細(xì)內(nèi)容,更多關(guān)于Java持久層面試題目的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线看片国产福利你懂的| 日韩精品欧美大片| 国产日韩综合| 久久久夜夜夜| 另类亚洲自拍| 国产一区二区三区四区五区| 国产一区二区精品久| 91精品91| 国产高清亚洲| 91精品啪在线观看国产18| 不卡一区综合视频| 久久黄色影视| 免费在线小视频| 日韩av一区二区三区四区| 久久精品 人人爱| 欧美精品一线| 欧洲精品一区二区三区| 三级久久三级久久久| 红杏一区二区三区| 日本亚洲欧美天堂免费| 亚洲激情中文在线| 夜夜嗨一区二区三区| 免费一区二区视频| 欧美视频一区| 精品国产aⅴ| 国产中文在线播放| 蜜桃精品视频| 免费在线日韩av| 婷婷精品在线观看| 国产一区调教| 欧美在线观看视频一区| 日本不卡在线视频| 久久国产中文字幕| 国产精品毛片久久久| 最新亚洲激情| 国产精品久久久免费| 国产亚洲一区在线| 亚洲欧美日韩视频二区| 日产精品一区| 日韩av网站在线观看| 蜜臀av一区二区在线免费观看 | 国产精品1区| 国产亚洲精品久久久久婷婷瑜伽| 四虎影视精品| 日韩一区电影| 日韩一区欧美二区| 日韩国产欧美在线播放| 国产色噜噜噜91在线精品| 成人一区而且| 免播放器亚洲| 鲁大师精品99久久久| 四虎成人av| 精品视频在线你懂得| 奶水喷射视频一区| 国产传媒av在线| 99久久久久国产精品| 亚洲久久视频| 精品五月天堂| 四虎成人av| 国产一区二区精品久| 久久国产精品毛片| 亚洲免费婷婷| 国产精品久久久免费| 国产精品88久久久久久| 国产精品一区二区99| 久久九九99| 麻豆久久一区| 亚洲精品字幕| 婷婷激情一区| 国产丝袜一区| 亚洲欧美日韩国产一区| 国产成人免费精品| 亚洲综合在线电影| 亚洲一区二区三区四区五区午夜 | 国产精品毛片视频| 精品成人免费一区二区在线播放| 先锋影音国产一区| 国产一区二区三区免费在线| 老牛影视一区二区三区| 久久久久久自在自线| 精品美女视频| 欧美一区不卡| 欧美专区18| 最新亚洲国产| 成人国产精选| 亚洲性图久久| 国产精品香蕉| 色在线视频观看| 久久国产欧美日韩精品| 欧美日韩三区| 精品视频91| 久久国产三级精品| 免费观看久久久4p| 亚洲www免费| 亚洲一级二级| 国产精品视频一区二区三区| 成人av动漫在线观看| 久久精品一本| 午夜精品婷婷| 激情欧美一区二区三区| 天堂va在线高清一区| 嫩草伊人久久精品少妇av杨幂| 99tv成人| 国产不卡精品在线| 国产另类在线| 亚洲成人精选| 日韩精品一二三四| 亚洲精品欧美| 在线日韩中文| 国产一区二区三区黄网站| 日韩精品午夜视频| 视频一区中文字幕| 国产一区二区三区不卡视频网站| 少妇精品久久久一区二区| 青青久久av| 精品国产99| 日韩国产欧美三级| 日韩在线一区二区| 亚洲免费网址| 亚洲欧美日韩精品一区二区| 好吊日精品视频| 欧美在线亚洲| 国产精品成人自拍| 91麻豆精品| 欧美国产三级| 精品国产乱码久久久久久1区2匹| 亚洲欧美日本国产| 日韩在线一二三区| 婷婷激情综合| 99视频精品视频高清免费| 日韩专区精品| 欧美亚洲在线日韩| 国产一级一区二区| 在线观看亚洲精品福利片| 亚洲欧美久久久| 日韩福利视频网| 日韩1区2区日韩1区2区| 国产白浆在线免费观看| 999国产精品视频| 亚洲婷婷丁香| 超碰99在线| 亚洲一级大片| 国产伊人精品| 国产成人免费视频网站视频社区| 91精品亚洲| 荡女精品导航| 国产精品第一国产精品| 电影亚洲精品噜噜在线观看| 免费精品视频| 激情久久五月| 国产精品一站二站| 日韩一区欧美二区| 日本成人精品| 国产乱码精品一区二区三区四区 | 国产精品草草| 福利精品在线| 激情久久一区二区| а√天堂8资源在线| 久久久久99| 人人精品久久| 日韩1区2区3区| 麻豆精品在线播放| 国产精品日本一区二区三区在线| 国产在线看片免费视频在线观看| 视频在线观看91| 婷婷成人av| 激情久久中文字幕| 一区二区日韩免费看| 国产精品视频一区二区三区四蜜臂| 国产成人精品一区二区三区在线| 欧美日韩视频免费观看| 日韩av在线中文字幕| 伊人久久成人| 国产精品一级| 亚洲第一精品影视| 欧美日韩一区自拍| 视频福利一区| 日本午夜精品久久久| 日韩精品一卡| 亚洲毛片一区| 中文字幕在线高清| 日韩精品免费视频一区二区三区 | 国产欧美日韩在线一区二区 | 精品一区电影| 国产精品porn| 精品一区二区男人吃奶| 日韩一区亚洲二区| 国产成年精品| 国产精品99久久免费| 日本在线视频一区二区| 一区二区三区四区日韩| 亚洲香蕉网站| 激情综合网址| 性欧美精品高清| 亚洲精品一级二级| 亚洲精品影院在线观看| 国产一区一一区高清不卡| 免费日韩av片| 狠狠久久伊人| 日韩中文字幕91|