1. 程式人生 > 其它 >CF1538G.Gift Set(二分)

CF1538G.Gift Set(二分)

1.Mybatis中#{}和${}的區別是什麼?

  #{}是預編譯處理,${}是字串替換。

  使用#{}時,Mybatis會將sql中#{}替換成?號,配合PreparedStatement的set方法賦值,這樣可以有效的防止sql注入,保證程式的執行安全。

2.Mybatis有幾種分頁方式?

  Mybatis有兩種分頁方式:邏輯分頁和物理分頁

  邏輯分頁:使用Mybatis自帶的RowBounds進行分頁,它是一次性查詢很多資料,然後在資料中進行檢索。

  物理分頁:自己手寫分頁sql或使用分頁外掛PageHelper,去資料庫查詢指定條數的分頁資料。

3.RowBounds是一次性查詢全部結果嗎?為什麼?

  RowBounds表面上是在所有資料中檢索資料,其實並非是一次性查詢出所有資料,因為Mybatis是對jdbc的封裝,在jdbc驅動中有一個Fetch Size的配置,它規定了每次最多從資料庫查詢多少條資料,假如你要查詢更多資料,它會在你執行next()的時候,在去查詢更多資料。只是對於 jdbc 來說,當你呼叫next()的時候會自動幫你完成查詢工作。這樣做的好處可以有效的防止記憶體溢位。

4.Mybatis邏輯分頁和物理分頁的區別是什麼?

  邏輯分頁:一次性查詢很多資料,如何在結果中檢索分頁的資料。這樣做需要消耗大量的記憶體、有記憶體溢位的風險、對資料庫壓力較大。

  物理分頁:從資料庫查詢指定條數的資料,有效的防止了一次性全部查詢出所有資料所帶來風險。

5.Mybatis是否支援延遲載入?延遲載入的原理是什麼?

  Mybatis支援延遲載入,設定lazyLoadingEnabled=true即可。

  延遲載入的原理是在呼叫的時候觸發載入,而不是在初始化的時候就載入資訊。比如呼叫a.getB().getName(),這個時候發現a.getB()的值為null,就會單獨觸發事先儲存好的關聯B物件sql,先查出B,再呼叫a.set(B),而這個時候再呼叫a.getB().getName()就有值了,這就是延遲載入的原理。

6.說一下Mybatis的一級快取和二級快取?

  一級快取:基於PerpetualCache的HashMap本地快取,它的宣告週期是和sqlSession一致的,有多個sqlSession或者分散式的環境中資料庫操作,可能會出現髒資料。當Session flush或者close之後,該Session中的所有Cache就將清空,預設一級快取是開啟的。

  二級快取:也是基於PerpetualChache的HashMap本地快取,不同在於其儲存作用域為Mapper級別的,如果多個sqlSession之間需要共享快取,則需要使用到二級快取,並且二級快取可自定義儲存源,如Ehcache。預設不開啟二級快取,要開啟二級快取,使用二級快取屬性類要實現Serializable序列化介面(可用來儲存物件的狀態)。

  開啟二級快取資料查詢流程:二級快取 -> 一級快取 -> 資料庫。

  快取更新機制:當某一個(一級快取Session/二級快取Mapping)進行了C/U/D操作後,預設該作用域下所有select中的快取將被clear。

7.Mybatis和Hibernate的區別有哪些?

  靈活性:Mybatis更加靈活,自己可以寫sql語句,使用起來方便。

  可移植性:Mybatis有很多自己寫的sql,因為每個資料庫的sql可以不相同,所以可移植性比較差。

  學習和使用門檻:Mybatis入門比較簡單,使用門檻也很低。

  二級快取:Hibernate擁有更好的二級快取,它的二級快取可以自行更換為第三方的二級快取。

8.Mybatis有哪些執行器?

  Mybatis有三種基本的Executor執行器

  • SimpleExecutor:每執行一次update或select就開啟一個Statement物件,用完立刻關閉Statement物件。
  • ReuseExecutor:執行update或selest,以sql作為key查詢Statement物件,存在就使用,不存在就建立,用完後不關閉Statement物件,而是放置於Map內供下次使用。就是重複使用Statement物件。
  • BatchExecutor:執行update(沒有select,jdbc批量處理不支援select),將所有sql都新增到批處理中(addBatch()),等待統一執行(executeBatch()),它快取了多個Statement物件,每個Statement物件都是addBatch()完畢後,等待逐一執行executeBatch()批處理,與jdbc批處理相同。

9.Mybatis分頁外掛的實現原理是什麼?

  分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。