Java面試題-持久層十__Java

來源:互聯網
上載者:User
                                         Java面試題-持久層十

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


Java知音公眾號整理一些各大公司常用的面試筆試題,供大家在每天閑暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就自然會遊刃有餘了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.