亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2020年03月15日 09:14:06   作者:V  
在本篇文章里小編給大家分享的是一篇關于java關于持久層面試題目整理內容,需要的朋友們可以學習下。

一、什么是ORM?

對象關系映射(Object-Relational Mapping,簡稱ORM)是一種為了解決程序的面向對象模型與數(shù)據(jù)庫的關系模型互不匹配問題的技術;

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

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

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

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

Session會延遲獲取數(shù)據(jù)庫連接(也就是在需要的時候才會獲?。榱吮苊鈩?chuàng)建太多的session,可以使用ThreadLocal將session和當前線程綁定在一起,這樣可以讓同一個線程獲得的總是同一個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)的實例可以通過調用save()、persist()或者saveOrUpdate()方法變成持久態(tài);

游離態(tài)的實例可以通過調用 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)的實例持久化,但是并不保證標識符被立刻填入到持久化實例中,標識符的填入可能被推遲到flush的時間;

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

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

四、闡述Session加載實體對象的過程

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

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

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

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

5、根據(jù)映射配置和SQL語句得到ResultSet,并創(chuàng)建對應的實體對象;

6、將對象納入Session(一級緩存)的管理;

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

8、如果開啟并設置了要使用二級緩存,則將數(shù)據(jù)對象納入二級緩存;

9、返回數(shù)據(jù)對象。

五、MyBatis中使用#和$書寫占位符有什么區(qū)別?

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

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

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

內容補充:

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

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

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

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

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

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

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

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

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

到此這篇關于java關于持久層面試題目整理的文章就介紹到這了,更多相關java持久層面試題目內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法

    SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法

    這篇文章主要介紹了SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案,通過實例代碼介紹了SpringBoot各個層次的操作,需要的朋友可以參考下
    2022-04-04
  • Java中InputSteam怎么轉String

    Java中InputSteam怎么轉String

    面了一位實習生,叫他給我說一下怎么把InputStream轉換為String,這種常規(guī)的操作,他竟然都沒有用過我準備結合工作經驗,整理匯集出了InputStream 到String 轉換的十八般武藝,助大家闖蕩 Java 江湖一臂之力,需要的朋友可以參考下
    2021-06-06
  • 三道java新手入門面試題,通往自由的道路--JVM

    三道java新手入門面試題,通往自由的道路--JVM

    這篇文章主要為大家分享了最有價值的3道JVM面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經典面試編程題等,對hashCode方法的設計、垃圾收集的堆和代進行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • MyBatisCodeHelperPro插件下載及使用教程詳解

    MyBatisCodeHelperPro插件下載及使用教程詳解

    這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • Java開發(fā)實現(xiàn)的Socket雙向通信功能示例

    Java開發(fā)實現(xiàn)的Socket雙向通信功能示例

    這篇文章主要介紹了Java開發(fā)實現(xiàn)的Socket雙向通信功能,結合實例形式分析了java基于socket實現(xiàn)的服務器端與客戶端雙向通信相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • SpringBoot?jwt的token如何刷新

    SpringBoot?jwt的token如何刷新

    這篇文章主要給大家介紹了關于SpringBoot?jwt的token如何刷新的相關資料,Json web token(JWT)是為了在網絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準,需要的朋友可以參考下
    2023-07-07
  • SpringBoot使用Flyway進行數(shù)據(jù)庫遷移的實現(xiàn)示例

    SpringBoot使用Flyway進行數(shù)據(jù)庫遷移的實現(xiàn)示例

    Flyway是一個數(shù)據(jù)庫遷移工具,它提供遷移歷史和回滾的功能,本文主要介紹了如何使用Flyway來管理Spring Boot應用程序中的SQL數(shù)據(jù)庫架構,感興趣的可以了解一下
    2023-08-08
  • java+jsp+struts2實現(xiàn)發(fā)送郵件功能

    java+jsp+struts2實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細介紹了java+jsp+struts2實現(xiàn)發(fā)送郵件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • SpringBoot實現(xiàn)線程池

    SpringBoot實現(xiàn)線程池

    現(xiàn)在由于系統(tǒng)越來越復雜,導致很多接口速度變慢,這時候就會想到可以利用線程池來處理一些耗時并不影響系統(tǒng)的操作。本文就介紹了SpringBoot線程池的使用,感興趣的可以了解一下
    2021-06-06
  • Eclipse Debug模式的開啟與關閉問題簡析

    Eclipse Debug模式的開啟與關閉問題簡析

    這篇文章主要介紹了Eclipse Debug模式的開啟與關閉問題簡析,同時向大家介紹了一個簡單的debug模式啟動不起來的解決方法,希望對大家有所幫助。
    2017-10-10

最新評論