溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

手寫Mybatis,徹底搞懂框架原理

發布時間:2020-08-26 21:33:11 來源:網絡 閱讀:3106 作者:wx5d78c87dd0584 欄目:編程語言

mybatis的前身是iBatis,其源于“Internet”和“abatis”的組合,是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。mybatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集,它可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJO映射成數據庫中的記錄。
手寫Mybatis,徹底搞懂框架原理

Mybatis的架構設計

手寫Mybatis,徹底搞懂框架原理
Mybatis的功能架構分為三層:

  • 接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層接收到調用請求就會調用數據處理層來完成具體的數據處理。
  • 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
  • 框架支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。
  • 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。再看看正版的代碼結構吧。
手寫Mybatis,徹底搞懂框架原理

考慮到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的核心組件如下
  • SqlSession。作為MyBatis工作的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能。
  • Executor。MyBatis執行器,是MyBatis調度的核心,負責SQL語句的生成和查詢緩存的維護。
  • StatementHandler。封裝了JDBC Statement操作,負責對JDBCstatement的操作,如設置參數、將Statement結果集轉換成List集合。
  • ParameterHandler。負責對用戶傳遞的參數轉換成JDBC Statement 所需要的參數。
  • ResultSetHandler。負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合。
  • TypeHandler 負責java數據類型和jdbc數據類型之間的映射和轉換。
  • MappedStatement。MappedStatement維護了一條<select|update|delete|insert>節點的封裝。
  • SqlSource。負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,并返回。
  • BoundSql。表示動態生成的SQL語句以及相應的參數信息。
  • Configuration。MyBatis所有的配置信息都維持在Configuration對象之中。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女