mybatis的前身是iBatis,其源于“Internet”和“abatis”的組合,是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。mybatis避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集,它可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJO映射成數(shù)據(jù)庫中的記錄。
Mybatis的架構(gòu)設(shè)計(jì)
Mybatis的功能架構(gòu)分為三層:
mybatis的運(yùn)行流程
1.加載配置:配置來源于兩個(gè)地方,配置文件和注解。將SQL的配置信息加載成為MappedStatement對象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲在內(nèi)存中。
2.SQL解析:當(dāng)API接口層接收到調(diào)用請求時(shí),會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會根據(jù)SQL的ID找到對應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對象對MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。
3.SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。
4.結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。
手寫mybatis的目錄
來看下筆者的手寫mybatis的文件目錄。查看Bootstrap文件上說明,然后運(yùn)行該文件,斷點(diǎn)調(diào)試即可一步步了解mybatis框架的原理了。(很多地方都注解了,方便初學(xué)者更多了解框架細(xì)節(jié))
代碼地址請查看,https://github.com/y277an/java-you-need-know。再看看正版的代碼結(jié)構(gòu)吧。
考慮到transaction對理解框架原理產(chǎn)生干擾,所以代碼全部刪掉
mybatis目錄結(jié)構(gòu)及內(nèi)容
以下目錄對照的是mybatis-3.5.1的源碼。
- annotations。注解目錄。包括所有的注解,如@SELECT,@UPDATE等。
- binding。Mapper類的實(shí)例反射生成工具目錄。
- builder。主要是注解,mapper和SqlSource的構(gòu)造器及轉(zhuǎn)換器。
- cache。Mybatis內(nèi)部緩存接口。實(shí)現(xiàn)了一些特定的緩存策略,F(xiàn)ifoCache、LruCache、BlockingCache、LoggingCache等。
- dataSource。數(shù)據(jù)源工廠類及實(shí)現(xiàn)。實(shí)現(xiàn)類包括JndiDataSourceFactory、PooledDataSourceFactory和UnpooledDataSourceFactory。數(shù)據(jù)源實(shí)現(xiàn)類:UnpooledDataSource和PooledDataSource。
- exceptions。Mybatis自定義的異常類,都繼承自RuntimeException。
- executor。執(zhí)行器相關(guān)包。包括Key生成器、加載器(包括Cglib、Javassist的代理,結(jié)果加載器)、參數(shù)處理器接口、結(jié)果處理器、結(jié)果集(resultSet)處理器、Statement處理器(實(shí)現(xiàn)類:BaseStatementHandler、CallableStatementHandler、PreparedStatementHandler、RoutingStatementHandler、SimpleStatementHandler)、執(zhí)行器(SimpleExecutor、ReuseExecutor、CachingExecutor、BatchExecutor、BaseExecutor)。
- io。主要是定義的幾個(gè)VFS(VFS、DefaultVFS、ClassLoaderWrapper)。
- jdbc。與Sql相關(guān)的操作。如Sql運(yùn)行器,腳本運(yùn)行器和Sql封裝類等。
- logging。各個(gè)類型的日志適配器,都實(shí)現(xiàn)了Log接口。StdOutImpl、Slf4jImpl、NoLoggingImpl、Log4j2Impl、Log4jImpl、Jdk14LoggingImpl、BaseJdbcLogger和JakartaCommonsLoggingImpl。
- mapping。主要是接口參數(shù),sql和返回結(jié)果的映射類,主要類包括:MappedStatement、ParameterMap、ParameterMapping、ResultMap、ResultMapping、BoundSql和SqlSource等類。
- parsing。變量解析,如解析${},#{}等。
- plugin。主要包含插件的定義接口。如Interceptor、Plugin和InterceptorChain等。
- reflection。主要是一些反射操作的工具方法和對象工廠類,以及一些常用的包裝類,如BaseWrapper、BeanWrapper、CollectionWrapper、MapWrapper和ObjectWrapper。
- scripting。執(zhí)行驅(qū)動(dòng)和動(dòng)態(tài)Sql解析的處理器。
- session。主要是SqlSession和SqlSessionFactory。
- transaction。主要是mybatis簡單封裝的jdbc事務(wù)操作類。
- type。各個(gè)類型數(shù)據(jù)的處理器。用于動(dòng)態(tài)的設(shè)置參數(shù)和轉(zhuǎn)換數(shù)據(jù),如IntegerTypeHandler用來處理Integer類型的值的set和get操作。除了八大基本類型,還有常用的集合及Map類型,還增加了各種時(shí)間類型的處理器。
MyBatis的核心成員和職責(zé)
從MyBatis代碼實(shí)現(xiàn)的角度來看,MyBatis的核心組件如下
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。