面試之Java持久層(十)

来源:http://www.cnblogs.com/peke/archive/2017/11/23/7887626.html
-Advertisement-
Play Games

91,什麼是ORM? 對象關係映射(Object-Relational Mapping,簡稱ORM)是一種為瞭解決程式的面向對象模型與資料庫的關係模型互不匹配問題的技術; 簡單的說,ORM是通過使用描述對象和資料庫之間映射的元數據(在Java中可以用XML或者是註解),將程式中的對象自動持久化到關係 ...


91,什麼是ORM? 
        對象關係映射(Object-Relational Mapping,簡稱ORM)是一種為瞭解決程式的面向對象模型與資料庫的關係模型互不匹配問題的技術;

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

 

92,Hibernate中SessionFactory是線程安全的嗎?Session是線程安全的嗎(兩個線程能夠共用同一個Session嗎)? 
        SessionFactory對應Hibernate的一個數據存儲的概念,它是線程安全的,可以被多個線程併發訪問。SessionFactory一般只會在啟動的時候構建。對於應用程式,最好將SessionFactory通過單例模式進行封裝以便於訪問。

        Session是一個輕量級非線程安全的對象(線程間不能共用session),它表示與資料庫進行交互的一個工作單元。Session是由SessionFactory創建的,在任務完成之後它會被關閉。Session是持久層服務對外提供的主要介面。

        Session會延遲獲取資料庫連接(也就是在需要的時候才會獲取)。為了避免創建太多的session,可以使用ThreadLocal將session和當前線程綁定在一起,這樣可以讓同一個線程獲得的總是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

 

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

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

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

        save()和update()的區別在於一個是將瞬時態對象變成持久態,一個是將游離態對象變為持久態。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態合併到已有的持久化對象上或創建新的持久化對象。

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

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

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

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

 

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

 

95,MyBatis中使用#和$書寫占位符有什麼區別? 
        #將傳入的數據都當成一個字元串,會對傳入的數據自動加上引號;

    $將傳入的數據直接顯示生成在SQL中。

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

 

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

 

97、MyBatis中的動態SQL是什麼意思? 
        對於一些複雜的查詢,我們可能會指定多個查詢條件,但是這些條件可能存在也可能不存在,如果不使用持久層框架我們可能需要自己拼裝SQL語句,不過MyBatis提供了動態SQL的功能來解決這個問題。MyBatis中用於實現動態SQL的元素主要有: 
- if    - choose / when / otherwise    - trim    - where    - set     - foreach

用法舉例:

   <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>

 

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

        1、JDBC:資料庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫鏈接池可解決此問題。

        MyBatis:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理資料庫鏈接。

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

        MyBatis:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
        3、JDBC:向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。

        MyBatis: Mybatis自動將java對象映射至sql語句。
        4,JDBC:對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo對象解析比較方便。

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

 

99,MyBatis與Hibernate有哪些不同?

        1、Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程式員自己編寫Sql語句,不過mybatis可以通過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。           
        2、Mybatis學習門檻低,簡單易學,程式員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關係數據模型要求不高的軟體開發,例如互聯網軟體、企業運營類軟體等,因為這類軟體需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到資料庫無關性,如果需要實現支持多種資料庫的軟體則需要自定義多套sql映射文件,工作量大。                3、Hibernate對象/關係映射能力強,資料庫無關性好,對於關係模型要求高的軟體(例如需求固定的定製化軟體)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的缺點是學習門檻高,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。           
        總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟體架構都是好架構,所以框架只有適合才是最好。

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

 

 

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

        Mybatis首先去緩存中查詢結果集,如果沒有則查詢資料庫,如果有則從緩存取出返回結果集就不走資料庫。Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象
        Mybatis的二級緩存即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中獲取數據。二級緩存是可以跨SqlSession的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在看過一篇文章 WPF自定義控制項之列表滑動特效 PowerListBox http://www.cnblogs.com/ShenNan/p/4993374.html#3619585 實現了滑動的特效(就是動畫)之後 ,覺得很有趣 也想在 UWP裡面實現。最好效果如下 接下來就說說是怎麼實現的吧: 一 ...
  • 代碼如下: //複製文件 private void btnCopy_Click(object sender, EventArgs e) { try { if (!File.Exists(this.txtFileName.Text)) { MessageBox.Show("文件不存在"); } els ...
  • Orchard Core 是Orchard CMS的ASP.NET Core版本。 Orchard Core是全新一代的ASP.NET Core CMS。 官方文檔介紹:http://orchardcore.readthedocs.io/en/latest/GitHub: https://githu ...
  • 【返回導航】 在簡單瞭解了Orleans 之後我們可以通過幾個例子去加深印象 一、快速入門示例 這個例子也是跟著《Microsoft Orleans 之 入門指南》(https://www.cnblogs.com/endv/p/6147976.html)這篇文章做的 上篇筆記中的連個例子說明瞭開發的 ...
  • 1、介紹 FSLIB.NETWORK 是一款開源HTTP的高性能高易用性網路庫,是對HttpWebRequest/HttpWebResponse的包裝,目的是為了用起來更簡單明瞭。設計的時候就為了提供更高的可用性和擴展性。每天由它發現的請求數過億。 源碼:https://github.com/icc ...
  • 問題 1072: 汽水瓶 時間限制: 1Sec 記憶體限制: 128MB 題目描述 有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶, 方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這 ...
  • 抽象類是由abstract修飾的類,定義方式如public abstract class A{...}。 介面由interface修飾,定義方式如public interface B{...}。 抽象類與介面的具體特性見下文。 抽象類: (1).抽象類中由abstract修飾的方法稱為抽象方法,抽象 ...
  • spring-aop-4.3.7.RELEASE 在《Spring AOP高級——源碼實現(1)動態代理技術》中介紹了兩種動態代理技術,當然在Spring AOP中代理對象的生成也是運用的這兩種技術。本文將介紹Spring AOP如何通過JDK動態代理的方式創建代理對象。 JDK動態代理以及CGLI ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...