1. 程式人生 > >Spring框架學習筆記(四)-- Mybatis

Spring框架學習筆記(四)-- Mybatis

Mybatis是什麼

  • MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis,實質上Mybatis對ibatis進行一些改進。
  • MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼
  • Mybatis通過xml或註解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。

未使用Mybatis之前我們會怎麼做(使用jdbc)

  1. 載入資料庫驅動
  2. 建立並獲取資料庫連結
  3. 建立jdbc statement物件
  4. 設定sql語句
  5. 設定sql語句中的引數(使用preparedStatement)
  6. 通過statement執行sql並獲取結果
  7. sql執行結果進行解析處理
  8. 釋放資源(resultSet、preparedstatement、connection)

使用jdbc導致的問題

  • 資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。
  • Sql語句在程式碼中硬編碼,造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。
  • 使用preparedStatement向佔有位符號傳引數存在硬編碼,因為
    sql語句的where條件不一定,可能多也可能少,修改sql還要修改程式碼,系統不易維護。
  • 對結果集解析存在硬編碼(查詢列名),sql變化導致解析程式碼變化,系統不易維護,如果能將資料庫記錄封裝成pojo物件解析比較方便。

Mybatis框架介紹

sqlMapConfig.xml-->sqlsessionFactory-->sqlsession-->Executor-->Mapped statement-->資料庫

  1. sqlMapConfig.xml:是mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊
  2. sqlsessionFactory:會話工廠,建立sqlsession
  3. sqlsession:會話,操作資料庫(增、刪、改、查)
  4. Executor:執行器,sqlsession通過執行器操作資料庫
  5. Mapped statement:底層封裝物件,對資料庫儲存封裝,包括sql語句、輸入引數、輸出結果型別
  6. 資料庫:database,我們操作的最終目標

Mybatis中的延遲載入

定義:先從單表查詢,需要時再從關聯表進行關聯查詢,這個稱作延遲載入。

這樣可以大大提高資料庫效能,因為畢竟查詢單表時比關聯查詢速度要快。

用網上的一個栗子很好說明(借用https://blog.csdn.net/eson_15/article/details/51668523,特此說明)

關聯查詢:SELECT orders.*, user.username FROM orders, USER WHERE orders.user_id = user.id 
延遲載入:SELECT orders.*, (SELECT username FROM USER WHERE orders.user_id = user.id)username FROM orders

可以使用Mybatis中的association和collection去實現延遲載入的方法。

使用延遲載入,先去查詢簡單的sql,再按照需求載入關聯查詢的其他資訊。

Mybatis中的查詢快取

Mybatis提供了查詢快取機制,包括一級快取和二級快取。用於減輕資料壓力,提高資料庫效能(如果有快取機制,就可以不從資料庫中獲取資料,大大提高了系統性能)。

一級快取:

是SqlSession級別的快取。

在操作資料庫時需要構造 sqlSession物件,在物件中有一個數據結構(HashMap)用於儲存快取資料。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的。

二級快取:

是mapper級別的快取。

多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級快取,二級快取是跨SqlSession的。