久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網
      最全最豐富的資訊網站

      java持久層面試題目(一)

      java持久層面試題目(一)

      一、什么是ORM?

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

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

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

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

      (學習視頻推薦:java視頻教程)

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

      Session會延遲獲取數據庫連接(也就是在需要的時候才會獲取)。為了避免創(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()方法是很有必要的;

      (推薦教程:java快速入門)

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

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

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

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

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

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

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

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

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

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

      9、返回數據對象。

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

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

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

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

      相關教程推薦:java面試題

      贊(0)
      分享到: 更多 (0)
      網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號