mybatis的前身是iBatis,其源于“Internet”和“abatis”的組合,是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。mybatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集,它可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJO映射成數據庫中的記錄。
10年積累的成都網站設計、網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有沾化免費網站建設讓你可以放心的選擇與我們合作。
Mybatis的架構設計
Mybatis的功能架構分為三層:
mybatis的運行流程
1.加載配置:配置來源于兩個地方,配置文件和注解。將SQL的配置信息加載成為MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
2.SQL解析:當API接口層接收到調用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數據類型),Mybatis會根據SQL的ID找到對應的MappedStatement,然后根據傳入參數對象對MappedStatement進行解析,解析后可以得到最終要執行的SQL語句和參數。
3.SQL執行:將最終得到的SQL和參數拿到數據庫進行執行,得到操作數據庫的結果。
4.結果映射:將操作數據庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,并將最終結果返回。
手寫mybatis的目錄
來看下筆者的手寫mybatis的文件目錄。查看Bootstrap文件上說明,然后運行該文件,斷點調試即可一步步了解mybatis框架的原理了。(很多地方都注解了,方便初學者更多了解框架細節)
代碼地址請查看,https://github.com/y277an/java-you-need-know。再看看正版的代碼結構吧。
考慮到transaction對理解框架原理產生干擾,所以代碼全部刪掉
mybatis目錄結構及內容
以下目錄對照的是mybatis-3.5.1的源碼。
- annotations。注解目錄。包括所有的注解,如@SELECT,@UPDATE等。
- binding。Mapper類的實例反射生成工具目錄。
- builder。主要是注解,mapper和SqlSource的構造器及轉換器。
- cache。Mybatis內部緩存接口。實現了一些特定的緩存策略,FifoCache、LruCache、BlockingCache、LoggingCache等。
- dataSource。數據源工廠類及實現。實現類包括JndiDataSourceFactory、PooledDataSourceFactory和UnpooledDataSourceFactory。數據源實現類:UnpooledDataSource和PooledDataSource。
- exceptions。Mybatis自定義的異常類,都繼承自RuntimeException。
- executor。執行器相關包。包括Key生成器、加載器(包括Cglib、Javassist的代理,結果加載器)、參數處理器接口、結果處理器、結果集(resultSet)處理器、Statement處理器(實現類:BaseStatementHandler、CallableStatementHandler、PreparedStatementHandler、RoutingStatementHandler、SimpleStatementHandler)、執行器(SimpleExecutor、ReuseExecutor、CachingExecutor、BatchExecutor、BaseExecutor)。
- io。主要是定義的幾個VFS(VFS、DefaultVFS、ClassLoaderWrapper)。
- jdbc。與Sql相關的操作。如Sql運行器,腳本運行器和Sql封裝類等。
- logging。各個類型的日志適配器,都實現了Log接口。StdOutImpl、Slf4jImpl、NoLoggingImpl、Log4j2Impl、Log4jImpl、Jdk14LoggingImpl、BaseJdbcLogger和JakartaCommonsLoggingImpl。
- mapping。主要是接口參數,sql和返回結果的映射類,主要類包括:MappedStatement、ParameterMap、ParameterMapping、ResultMap、ResultMapping、BoundSql和SqlSource等類。
- parsing。變量解析,如解析${},#{}等。
- plugin。主要包含插件的定義接口。如Interceptor、Plugin和InterceptorChain等。
- reflection。主要是一些反射操作的工具方法和對象工廠類,以及一些常用的包裝類,如BaseWrapper、BeanWrapper、CollectionWrapper、MapWrapper和ObjectWrapper。
- scripting。執行驅動和動態Sql解析的處理器。
- session。主要是SqlSession和SqlSessionFactory。
- transaction。主要是mybatis簡單封裝的jdbc事務操作類。
- type。各個類型數據的處理器。用于動態的設置參數和轉換數據,如IntegerTypeHandler用來處理Integer類型的值的set和get操作。除了八大基本類型,還有常用的集合及Map類型,還增加了各種時間類型的處理器。
MyBatis的核心成員和職責
從MyBatis代碼實現的角度來看,MyBatis的核心組件如下