Mybatis源碼研究分析最透徹的文章

1、What is mybatis?

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.java

翻譯成中文: MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。mysql

一、源碼下載到本地 從github下載mybatis源碼到idea中。 git

在這裏插入圖片描述
在這裏插入圖片描述

二、快速開始程序員

  1. 構建mybatis-config.xml文件
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
     <mapper resource="mybatis/UserMapper.xml"/>
    </mappers>
</configuration>
複製代碼
  1. usermapper.xml文件
<mapper namespace="bat.ke.qq.com.mybatis.UserMapper">
    <select id="selectUser"  resultType="bat.ke.qq.com.mybatis.User">
        select * from user where id = #{id}
    </select>
</mapper>
複製代碼

三、建立POJO類github

@ToString
@Getter
@Setter
public class User implements Serializable{

  private Integer id;
  private String username;
  private  Integer age;
  private String phone;
  private  String desc;

複製代碼

四、建立測試類sql

/**
 * 源碼學院-Monkey
 * 只爲培養BAT程序員而生
 * http://bat.ke.qq.com
 * 往期視頻加羣:516212256 暗號:6
 */
@Slf4j
public class MybatisTest {

   public static void main(String[] args) throws Exception {
      String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession session = sqlSessionFactory.openSession();
      try {
         User user = session.selectOne("bat.ke.qq.com.mybatis.UserMapper.selectUser", 1);
         log.info("user:{}", user);
      } finally {
         session.close();
      }
   }
複製代碼

五、效果 數據庫

ok !大功告成

2、How is mybatis?

經過剛纔的demo咱們能夠用java》mybatis》mysql能夠查詢數據庫想要的內容,那如今問題來了?其底層的實現原理是什麼? 做爲一名高級工程師或者是架構師,咱們要知其然知其因此然。 那咱們如今分析下mybatis的技術本質是什麼 apache

在這裏插入圖片描述

從這個圖來講,咱們能夠看得出mybatis是一個「gui公」,專門拉皮條的,那它爲什麼能作到了?我以爲至少有着三個狀況 緩存

在這裏插入圖片描述
那這三項包含什麼了?
在這裏插入圖片描述
只有mybatis知道鏈接那個數據庫源而後執行什麼sql語句,誰去執行,這三個條件達到了我們才能把這個事情給辦了。 這個就比如我們晚上約一個妹子作拍拍的事情,完成這個事情必須是有賓館、有女孩有TT...你懂得
在這裏插入圖片描述

3、Check is mybatis!

經過上面咱們分析,咱們如今去看看mybatis的源碼,看看是否是這樣作的。bash

一、找到程序的入口

在這裏插入圖片描述

一、mybatis是如何獲取數據庫源的 org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream) org.apache.ibatis.builder.xml.XMLConfigBuilder.parse org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement org.apache.ibatis.builder.BaseBuilder.resolveClass org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.getDataSource org.apache.ibatis.session.Configuration.setEnvironment 這個是咱們的源碼分析過程,具體步驟能夠關注下個人公衆號或者羣號能夠觀看視頻。

在這裏插入圖片描述

二、mybatis是如何獲取sql語句

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>
   >org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
    >org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
     >org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
      >org.apache.ibatis.builder.xml.XMLMapperBuilder
       >org.apache.ibatis.builder.xml.XMLMapperBuilder.parse    >org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode  >org.apache.ibatis.builder.xml.XMLStatementBuilder
           >org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
             >org.apache.ibatis.session.Configuration.addMappedStatement
複製代碼

這個是咱們的源碼分析過程,具體步驟能夠關注下個人公衆號或者羣號能夠觀看視頻。

在這裏插入圖片描述

三、mybatis是如何執行的

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()>
  >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
    >org.apache.ibatis.session.defaults.DefaultSqlSession
      >org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
       >org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
         >org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
          >org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
          這個是咱們的源碼分析過程,具體步驟能夠關注下個人公衆號或者羣號能夠觀看視頻。
複製代碼

在這裏插入圖片描述

總結

經過mybatis的源碼分析咱們能夠得出mybatis訪問數據庫確實如從,其中比較核心的幾個點我列出來給你們。

名稱 意義
Configuration 管理mysql-config.xml全局配置關係類
SqlSessionFactory Session管理工廠接口
Session SqlSession是一個面向用戶的接口。提供了不少操做數據庫的方法
Executor 執行器是一個接口(基本執行器、緩存執行器)
做用:SqlSession內部經過執行器操做數據庫
MappedStatement 底層封裝對象
做用:對操做數據庫存儲封裝,包括 sql語句、輸入輸出參數
StatementHandler 具體操做數據庫相關的handler接口
ResultSetHandler 具體操做數據庫返回結果的handler接口

在這裏插入圖片描述
總體認識mybatis源碼包

├─annotations   ->註解相關 好比select insert
                ├─binding       -> mapper相關
                ├─builder       ->解析xml相關
                ├─cache        ->緩存
                ├─cursor       -> 返回結果resultset
                ├─datasourcer   ->數據管理 
                ├─exceptionsr       -> 異常
                ├─executorr       -> 執行器
                ├─io              ->classloader
                ├─jdbc              ->jdbc
                ├─lang              ->jdk7 jdk8
                ├─logging              ->日誌相關
                ├─mapping              ->mapper相關的封裝
                ├─parsing              ->xml相關解析
                ├─plugin              ->攔截器
                ├─reflection              ->反射相關
                ├─scripting              ->數據廠家
                ├─session              ->sessiomn
                ├─transaction            ->事務
                └─type                  ->返回類型對應
複製代碼

須要瞭解更多mybatis的內容能夠關注下個人公衆號

在這裏插入圖片描述
視頻獲取 連接: pan.baidu.com/s/1wMkL3PNL… 提取碼:5htb
相關文章
相關標籤/搜索