分析了MapperMethod從創(chuàng)建到執(zhí)行的過程,MapperMethod的執(zhí)行包括執(zhí)行sql返回結(jié)果.
在執(zhí)行sql和返回結(jié)果的過程中就會涉及到參數(shù)類型的轉(zhuǎn)換,這個過程是通過TypeHandler來處理的.關(guān)於TypeHandler官網(wǎng)有比較詳細(xì)的文檔http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers,文檔主要說明瞭如何使用TypeHandler,在下面的分析中將重點分析與TypeHandler有關(guān)的源碼.
1.配置
MyBatis有預(yù)設(shè)的類型處理器,如果需要自訂配置也相當(dāng)簡單,在mybatis-config.xml裡添加如下配置:
<typeHandlers> <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>
下面分析配置讀取設(shè)定的過程,在XMLConfigBuilder中
/** * 讀取配置文件組裝configuration * @param root 配置文件的configuration節(jié)點 */ private void parseConfiguration(XNode root) { try { //issue #117 read properties first propertiesElement(root.evalNode("properties")); Properties settings = settingsAsProperties(root.evalNode("settings")); loadCustomVfs(settings); typeAliasesElement(root.evalNode("typeAliases")); pluginElement(root.evalNode("plugins")); objectFactoryElement(root.evalNode("objectFactory")); objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); reflectorFactoryElement(root.evalNode("reflectorFactory")); settingsElement(settings); // read it after objectFactory and objectWrapperFactory issue #631 environmentsElement(root.evalNode("environments")); databaseIdProviderElement(root.evalNode("databaseIdProvider")); typeHandlerElement(root.evalNode("typeHandlers")); mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } }
在以上原始碼中有一行
typeHandlerElement(root.evalNode("typeHandlers"));
再來看typeHandlerElement這個方法
/** * 讀取typeHandlers配置并注冊 * @param parent 配置文件typeHandlers節(jié)點 * @throws Exception */ private void typeHandlerElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : parent.getChildren()) { if ("package".equals(child.getName())) { String typeHandlerPackage = child.getStringAttribute("name"); typeHandlerRegistry.register(typeHandlerPackage); } else { String javaTypeName = child.getStringAttribute("javaType"); String jdbcTypeName = child.getStringAttribute("jdbcType"); String handlerTypeName = child.getStringAttribute("handler"); Class<?> javaTypeClass = resolveClass(javaTypeName); JdbcType jdbcType = resolveJdbcType(jdbcTypeName); Class<?> typeHandlerClass = resolveClass(handlerTypeName); if (javaTypeClass != null) { if (jdbcType == null) { typeHandlerRegistry.register(javaTypeClass, typeHandlerClass); } else { typeHandlerRegistry.register(javaTypeClass, jdbcType, typeHandlerClass); } } else { typeHandlerRegistry.register(typeHandlerClass); } } } } }
if和else中的程式碼邏輯對應(yīng)了typeHandler的兩種設(shè)定方式.最後都會呼叫?
TypeHandlerRegistry,Configuration,BaseTypeHandler之間的關(guān)係.2.設(shè)定參數(shù)
設(shè)定參數(shù)時先呼叫ParameterHandler.setParameters(),然後在setParameters()裡取得對應(yīng)的typeHandler,最後呼叫typeHandler.setParameter()
再來看看BaseTypeHandler的setParameter方法
當(dāng)parameter不為null時調(diào)用的是setNonNullParameter,也就是說子類需要實現(xiàn)setNonNullParameter
BigIntegerTypeHandler的源碼c.

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

iBatis與MyBatis:你該選擇哪一個?簡介:隨著Java語言的快速發(fā)展,許多持久化框架也應(yīng)運而生。 iBatis和MyBatis是兩個備受歡迎的持久化框架,它們都提供了一個簡單而高效的資料存取解決方案。本文將介紹iBatis和MyBatis的特點和優(yōu)勢,並給出一些具體的程式碼範(fàn)例,幫助你選擇合適的框架。 iBatis簡介:iBatis是一個開源的持久化框架

JPA和MyBatis:功能與效能比較分析引言:在Java開發(fā)中,持久化框架扮演著非常重要的角色。常見的持久化框架包括JPA(JavaPersistenceAPI)和MyBatis。本文將對這兩個框架的功能和效能進(jìn)行比較分析,並提供具體的程式碼範(fàn)例。一、功能對比:JPA:JPA是JavaEE的一部分,提供了一個物件導(dǎo)向的資料持久化解決方案。它透過註解或X

MyBatis動態(tài)SQL標(biāo)籤解讀:Set標(biāo)籤用法詳解MyBatis是一個優(yōu)秀的持久層框架,它提供了豐富的動態(tài)SQL標(biāo)籤,可以靈活地建構(gòu)資料庫操作語句。其中,Set標(biāo)籤是用來產(chǎn)生UPDATE語句中SET子句的標(biāo)籤,在更新作業(yè)中非常常用。本文將詳細(xì)解讀MyBatis中Set標(biāo)籤的用法,以及透過具體的程式碼範(fàn)例來示範(fàn)其功能。什麼是Set標(biāo)籤Set標(biāo)籤用於MyBati

MyBatis中實現(xiàn)批量刪除語句的幾種方式,需要具體程式碼範(fàn)例近年來,由於資料量的不斷增加,批量操作成為了資料庫操作的一個重要環(huán)節(jié)之一。在實際開發(fā)中,我們經(jīng)常需要批量刪除資料庫中的記錄。本文將重點介紹在MyBatis中實作批量刪除語句的幾種方式,並提供相應(yīng)的程式碼範(fàn)例。使用foreach標(biāo)籤實作批量刪除MyBatis提供了foreach標(biāo)籤,可以方便地遍歷一個集

MyBatis快取機(jī)制詳解:一文讀懂快取儲存原理引言在使用MyBatis進(jìn)行資料庫存取時,快取是一個非常重要的機(jī)制,能夠有效減少對資料庫的訪問,提高系統(tǒng)效能。本文將詳細(xì)介紹MyBatis的快取機(jī)制,包括快取的分類、儲存原理和具體的程式碼範(fàn)例。一、快取的分類MyBatis的快取主要分為一級快取和二級快取兩種。一級緩存一級緩存是SqlSession級別的緩存,當(dāng)在

iBatis和MyBatis是兩個主流的ORM(Object-RelationalMapping)框架,它們在設(shè)計和使用上有著許多相似之處,也存在一些細(xì)微的差別。本文將詳細(xì)比較iBatis和MyBatis的異同,並透過具體的程式碼範(fàn)例來說明它們的特點。一、iBatis與MyBatis的歷史與背景iBatis是ApacheSoftwareFoundat

MyBatisGenerator是MyBatis官方提供的程式碼產(chǎn)生工具,可以幫助開發(fā)人員快速產(chǎn)生符合資料庫表結(jié)構(gòu)的JavaBean、Mapper介面以及XML映射檔。在使用MyBatisGenerator進(jìn)行程式碼產(chǎn)生的過程中,配置參數(shù)的設(shè)定是至關(guān)重要的。本文將從配置參數(shù)的角度出發(fā),深入探討MyBatisGenerator的

MyBatis是一款流行的Java持久層框架,廣泛應(yīng)用於各種Java專案。其中,批次插入是常見的操作,可以有效提升資料庫操作的效能。本文將深入探討MyBatis中批量的Insert實作原理,並結(jié)合具體的程式碼範(fàn)例進(jìn)行詳細(xì)解析。 MyBatis中的批次Insert在MyBatis中,批量Insert操作通常使用動態(tài)SQL來實作。透過建構(gòu)一條包含多個插入值的S
