1. 程式人生 > >【Mybatis】原始碼設計思想的一點見解

【Mybatis】原始碼設計思想的一點見解

前言

MyBatis是常見的Java資料庫訪問層框架。在日常工作中,開發人員多數情況下是使用MyBatis;首先他是一個很好的很靈活的ORM框架,那麼不論多好,根本都是操作資料庫資料,也就是JDBC;那麼我們先回憶一下JDBC:

JDBC

一、採用JDBC訪問資料庫的基本步驟:

  1.     載入JDBC驅動程式:
  2.     定義連線URL,建立連線: jdbc:子協議,並且載入伺服器的主機名、埠、資料庫名(或引用);顯示呼叫commit()
  3.     建立Statement物件:每個Statement物件只能開啟一個ResultSet物件
  4.     執行查詢或更新:A.查詢操作:executeQuery(SQL語句)  B.維護操作:executeUpdate(SQL語句)
        C.批處理操作:executeBat
  5.     結果處理:ResultSet中行的第一列索引為1,而非0
  6.     關閉連線:以ResultSet、Statement、Connection的順序進行

JDBC-Statement(預備語句):分三種:靜態sql,預編譯,儲存過程

PreparedStatement的好處:防止sql注入

  1. 依賴於伺服器對預編譯查詢的支援,以及驅動程式處理原始查詢的效率,預備語句在效能上的優勢可能有很大的不同。
  2. 安全是預備語句的另外一個特點,我們推薦在通過HTML表單接受使用者輸入,然後對資料庫進行更新時,一定要使用預備語句或儲存過程。
  3. 預備語句還能夠正確地處理嵌入在字串中的引號以及處理非字元資料(比如向資料庫傳送序列化後的物件)   

CallableStatement(儲存過程語句)的優缺點:

  1. 優點:語法錯誤可以在編譯時找出來,而非在執行期間;資料庫儲存過程的執行可能比常規的SQL查詢快得多;程式設計師只需知道輸入和輸出引數,不需瞭解表的結構。另外,由於資料庫語言能夠訪問資料庫本地的一下兒功能(序列,觸發器,多重遊標),因此用它來編寫儲存過程可能要比使用Java程式語言要簡易一些。
  2. 缺點:儲存過程的商業邏輯在資料庫伺服器上執行,而非客戶機或Web伺服器。而行業的發展趨勢是儘可能多地將商業邏輯移出資料庫,將它們放在JavaBean元件(或者在大型的系統中,EnterPrise JavaBean元件)中,在Web構架上採用這種方式的主要動機是:資料庫訪問和網路I/O常常是效能的瓶頸。

Mybatis

那麼對應著JDBC的步驟來講一下mybatis的設計實現過程,我理解他是一個sql驅動的框架,步驟:

  1. sqlSession:最重要的介面入口
  2. Executor:注意這個jdbc中的執行
  3. StatementHandler:建立各種Statement物件
  4. parameterHandler:處理引數
  5. ResultSetHandler:處理結果,對應JDBC的ResultSet;
  6. config配置檔案:mybatis的一大特色,不僅配置資料庫連線等相關配置,一些屬性的配置,以及一些外掛的配置;mybatis最好的特點就是可以自己寫一些plugin外掛,比如我們都用過的分頁等
  7. Intercepter:攔截器,做個性話處理

對於plugin外掛的實現原理主要是通過生成代理物件(靜態代理,動態代理),配合Intercepter一同來處理,也就是我們可以針對上面的前五個過程之間錯個性話的外掛處理,做自己需要的操作;比如分頁就可以有兩種方式:一種在resultSet部分處理,但這個方式顯然不好,不能很好的優化執行sql的效能,只是通過記憶體對查詢結果進行分頁;那麼比較好的就是在StatementHandler緩解做處理進行分頁,也就是查詢sql之前。

根據步驟在ResultHandler緩解處理後在返回Executor然後返回給客戶端的呼叫介面。

大家可能看到mybatis的步驟過程貌似是和jdbc反著的,為什麼不是先Statement,然後Executor呢;這塊其實是mybatis設計的一個思想,採用設計模式,這裡的Executor不是執行器,而是一個引數給Statement;Mybatis對外統一提供了一個操作介面類Executor,提供的介面方法有update、query、flushStatements、commit、rollback等介面函式

關於SqlSession主要有三個:Default,Manager,Template。

總結

至此,就是Mybatis的大體設計思想,同學們可以自己跟著步驟從sqlSession開始研究學習。