亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

ibatis 核心原理解析

Stardustsky / 1764人閱讀

摘要:最近查找一個生產(chǎn)問題的原因,需要深入研究框架的源碼。將會保存解析字段相關信息。會按照數(shù)組中的順序使用反射獲取方法返回值生成數(shù)組。第四步,使用獲取返回值,在這一步將會完成數(shù)據(jù)庫類型與類型的轉(zhuǎn)化。

最近查找一個生產(chǎn)問題的原因,需要深入研究 ibatis 框架的源碼。雖然最后證明問題的原因與 ibatis 無關,但是這個過程加深了對 ibatis 框架原理的理解。

這篇文章主要就來講講 ibatis 框架的原理。

可能現(xiàn)在很多人已不再使用 ibatis 或者說也沒聽 ibatis,不過肯定了解過 Mybatis。ibatis 就是 Mybatis框架的前身,雖然 ibatis 框架已經(jīng)比較老,但是其核心功能與 Mybatis 一致。
ibatis 解決的痛點

我們先看一個使用 JDBC 查詢的例子。

使用原生 JDBC 查詢,存在兩個痛點:

使用非常繁瑣,且需要處理各種數(shù)據(jù)庫異常,并且還需要關閉各種資源。

數(shù)據(jù)轉(zhuǎn)化麻煩。查詢之前需要從 Java 對象屬性值設置到 PreparedStatement中,查詢返回之后又需要從 ResultSet獲取返回設置到返回對象中。

在 ibatis 中封裝這些繁雜數(shù)據(jù)庫連接查詢代碼,并處理了各類異常以及關閉各種資源。另外 ibatis 自動處理 Java 對象與數(shù)據(jù)庫類型之間的自動轉(zhuǎn)化,讓業(yè)務代碼與 SQL 代碼之間做到了解耦。

數(shù)據(jù)類型轉(zhuǎn)化原理

數(shù)據(jù)類型轉(zhuǎn)化主要分為兩類,一,傳入查詢的 Java 對象數(shù)據(jù)轉(zhuǎn)化成 SQL 類型數(shù)據(jù)。二 查詢返回的數(shù)據(jù)庫信息映射到 Java 對象中。

ibatis SQL 需要定義在配置文件中,一個查詢 SQL 語句配置如下:

      

ibatis 框架啟動過程將會解析配置文件,生成 MappedStatement 的子類。如 select 配置會生成對應的 SelectStatement 對象。

MappedStatement 相關類圖如下。

MappedStatement 中將會保存存在兩個重要的對象,ParameterMapResultMap,通過這兩個對象將會完成 Java 類型與數(shù)據(jù)庫類型的相互轉(zhuǎn)化。

Java 對象轉(zhuǎn)化成數(shù)據(jù)庫類型

以上面 select 配置為例,我們這里需要做的是從傳入的 com.query.QueryDO對象中獲取屬性值,然后通過 PreparedStatement.setxx 設置到查詢參數(shù)中。

ibatis 解析配置中 SQL 語句時,將會獲取 # 之間的內(nèi)容,將其替換成 ?。然后按照順序保存到一個 ParameterMapping[] 數(shù)組中,這個數(shù)組將會保存到 ParameterMap 對象中。

ParameterMapping 將會保存解析字段相關信息。

最終解析后的 SQL 為:

select  * from  TEST_QUERY where ID=?

該 SQL 就可以通過 connection.prepareStatement("select * from TEST_QUERY where ID=?"); 生成 PreparedStatement 對象。

接著 ibatis 會根據(jù) ParameterMapping parameterClass 指定的類型創(chuàng)建合適的 dataExchange parameterPlan 對象。

其中 parameterPlan 對象會按照 ParameterMapping 數(shù)組中順序保存了變量的 setter 和 getter 方法數(shù)組。

dataExchange 會按照 ParameterMapping 數(shù)組中的順序使用反射獲取 parameterPlan getter 方法返回值生成 parameters 數(shù)組。

最后循環(huán) ParameterMapping 數(shù)組,在 TypeHandler 調(diào)用 PreparedStatement.setxx 設置相關值。

TypeHandler 存在很多子類,通過這些子類正確處理了 Java 對象與數(shù)據(jù)庫類型轉(zhuǎn)化。

轉(zhuǎn)化的時序圖為:

時序圖來源于:https://www.ibm.com/developer...
數(shù)據(jù)庫字段映射到 Java 對象

SQL 執(zhí)行結束之后將會返回查詢結果,這里將會使 SQL 查詢結果轉(zhuǎn)化為返回結果 com.query.QueryDO。這里需要用到上面提到 ResultMap 對象。

當 SQL 執(zhí)行結束返回 ResultSet 對象之后,使用 ResultSet.getMetaData() 獲取返回信息元數(shù)據(jù)對象 ResultSetMetaData

ResultSetMetaData 可以獲取返回結果字段名,類型等信息,然后按照順序存入 ResultMapping 數(shù)組中。

然后按照 ResultMapping 數(shù)組中使用 TypeHandler調(diào)用 ResultSet.getxx 獲取實際返回數(shù)據(jù),保存到 columnValues 數(shù)組中。

ResultMap 對象會根據(jù) ResultMappingresultClass指定的類型合適的 dataExchange resultPlan對象。resultPlan對象與上面的 parameterPlan 對象一樣也會保存著變量的 setter 和 getter 方法數(shù)組。

最后先根據(jù) resultClass 反射生成返回對象,然后使用反射調(diào)用 resultPlan setter 方法,依次設置相關值。

映射返回對象時序圖為:

時序圖來源于:https://www.ibm.com/developer...
ibatis 樣板代碼

上面講完了 ibatis 數(shù)據(jù)類型的轉(zhuǎn)化原理,接著我們來看下 ibatis 調(diào)用 JDBC 樣板代碼。

使用 ibatis 執(zhí)行查詢語句時,如 queryForObject,調(diào)用到 SqlMapExecutorDelegate 。在 SqlMapExecutorDelegate 中將會會做一些前提準備,比如準備事務,最后會將 SQL 語句委托給 SqlExecutor 執(zhí)行。

這里使用委托者模式,接受請求的對象將請求委托給另一個對象來處理。這種模式的優(yōu)點在于解耦了業(yè)務代碼與實際執(zhí)行代碼的聯(lián)系,在于對外隱藏真正執(zhí)行對象,易于擴展。

SqlExecutor#executeQuery 執(zhí)行過程主要分為以下三步。

第一步,獲取 PreparedStatement,使用 conn.prepareStatement(sql) 獲取。

第二步調(diào)用 PreparedStatement.setxxx 方法設置參數(shù)。上文中的 Java 對象類型轉(zhuǎn)化成 SQL 類型在這里完成。

第三步,調(diào)用 PreparedStatement.execute() 執(zhí)行 SQL 語句。

第四步,使用 ResultSet 獲取返回值,在這一步將會完成 數(shù)據(jù)庫類型與 Java 類型的轉(zhuǎn)化。

幫助鏈接

深入分析 iBATIS 框架之系統(tǒng)架構與映射原理

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/76010.html

相關文章

  • 開源框架解析,手寫MyBatis細節(jié)思路

    摘要:基本綱要組成動態(tài)配置配置核心源碼分析源碼解析源碼解析源碼解析源碼解析手寫框架是什么本質(zhì)是一種半自動的框架,前身是其源于和的組合,除了和映射關系之外,還需要編寫語句映射三要素映射規(guī)則快速入門加入的依賴添加的配置文件場景介紹編寫實體類接口以及文 showImg(https://segmentfault.com/img/bVblrnC); Mybatis基本綱要 Mybatis組成 · 動態(tài)...

    paulli3 評論0 收藏0
  • Mybatis Interceptor 攔截器

    摘要:攔截器的使用場景主要是更新數(shù)據(jù)庫的通用字段,分庫分表,加解密等的處理。攔截器均需要實現(xiàn)該接口。攔截器攔截器的使用需要查看每一個所提供的方法參數(shù)。對應構造器,為,為,為??蓞⒖紨r截器原理探究。 攔截器(Interceptor)在 Mybatis 中被當做插件(plugin)對待,官方文檔提供了 Executor(攔截執(zhí)行器的方法),ParameterHandler(攔截參數(shù)的處理),Re...

    nemo 評論0 收藏0
  • 【mybatis】(一)mybatis快速入門

    摘要:一定義是一款優(yōu)秀的持久層框架,它支持定制化存儲過程以及高級映射。別名與類中的屬性名保持一致。接口的名字建議為,與文件保持一致編寫文件,名字與接口名保持一致。 一、定義 MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數(shù)以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射...

    MartinDai 評論0 收藏0
  • 手撕面試官系列(二):開源框架面試題Spring+SpringMVC+MyBatis

    摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準備充分,到底是因為技術原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準備充分),到底是因為技...

    Flink_China 評論0 收藏0
  • [鬧著玩-1] mybatis源碼查看

    摘要:配置測試描述測試類技術部查詢表至此初步配置完成執(zhí)行過程獲取解析成接收方法方法方法屬性定位方法數(shù)據(jù)綁定到具體方法提交傳輸獲取配置解析標簽對象獲取過程源碼使用 MyBatis 配置 4.0.0 com.huifer mybatisBook 1.0-SNAPSHOT UTF-8 UTF-8 1...

    Towers 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<