Mybatis 源碼(一)總攬

整體架構(gòu)

Mybatis 整體架構(gòu)

這只是MySql的一個邏輯劃分架構(gòu)。

  • 接口層:通SqlSession類提供對數(shù)據(jù)庫訪問能力,隱藏了后續(xù)復(fù)雜的處理邏輯。
  • 核心處理層:主要負(fù)責(zé)執(zhí)行SQL,并返回結(jié)果。
  • 基礎(chǔ)支撐層:對一些基礎(chǔ)功能進(jìn)行封裝,為核心處理層提供服務(wù)。

代碼結(jié)構(gòu)

Mybatis 代碼結(jié)構(gòu).png

Mybatis的代碼結(jié)構(gòu)非常工整,堪稱完美的java編程規(guī)范教科書,當(dāng)我們深入源碼我們會發(fā)現(xiàn),Mybatis的注釋量相當(dāng)少,那是因為基本上我們可以通過名稱就能明白其中的含義。

Mybatis中的設(shè)計模式

如果想學(xué)習(xí)設(shè)計模式在代碼中的應(yīng)用,閱讀Mybatis源碼也是一個不錯的選擇,如:

  • SqlSession使用門面模式
  • 日志模塊使用了適配器模式
  • 數(shù)據(jù)源模塊使用工廠模式
  • 數(shù)據(jù)連接池使用策略模式
  • 緩存模塊使用了裝飾器模式
  • Executor模塊使用了模板方法模式
  • Builder模塊使用了建造者模式
  • Mapper接口使用了代理模式
  • 插件模塊使用責(zé)任鏈模式

Mybatis 快速入門

public class MybatisTest extends BaseTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource = "config/mybatis-config.xml";
        try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
            // 1.讀取mybatis配置文件創(chuàng)SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
    }

    @Test
    // 測試自動映射以及下劃線自動轉(zhuǎn)化駝峰
    public void quickStart() throws Exception {
        // 2.獲取sqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            initH2dbMybatis(sqlSession);

            // 3.獲取對應(yīng)mapper
            PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
            // 4.執(zhí)行查詢語句并返回結(jié)果
            Person person = mapper.selectByPrimaryKey(1L);
            System.out.println(person.toString());
        }
    }
}

Mybatis執(zhí)行流程

Mybatis 執(zhí)行流程.png
  1. new SqlSessionFactoryBuilder().build(inputStream);:讀取mybatis配置文件構(gòu)建SqlSessionFactory。
  2. sqlSessionFactory.openSession();:獲取sqlSession資源
  3. sqlSession.getMapper(PersonMapper.class);:獲取對應(yīng)mapper
  4. mapper.selectByPrimaryKey(1L);:執(zhí)行查詢語句并返回結(jié)果
  5. 關(guān)閉資源

上圖是Mybatis的執(zhí)行流程,由此我們可以看出Mybatis的核心類有4個,分別是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、SQL Mapper。

  • SqlSessionFactoryBuilde:讀取配置信息(XML文件),創(chuàng)建SqlSessionFactory,建造者模式,方法級別生命周期;
  • SqlSessionFactory:創(chuàng)建Sqlsession,工廠單例模式,存在于程序的整個應(yīng)用程序生命周期;
  • SqlSession:代表一次數(shù)據(jù)庫連接,可以直接發(fā)送SQL執(zhí)行,也可以通過調(diào)用Mapper訪問數(shù)據(jù)庫;線程不安全,要保證線程獨享,方法級生命周期;
  • SQL Mapper:由一個Java接口和XML文件組成,包含了要執(zhí)行的SQL語句和結(jié)果集映射規(guī)則。方法級別生命周期;

Mybatis核心流程三大階段

從上面的執(zhí)行流程可以看出,Mybatis核心流程主要分為以下三個階段:

  • 初始化階段:讀取XML配置文件和注解中的配置信息,創(chuàng)建配置對象,并完成各個模塊的初始化的工作;
  • 代理階段:封裝iBatis的編程模型,使用mapper接口開發(fā)的初始化工作;
  • 數(shù)據(jù)讀寫階段:通過SqlSession完成SQL的解析,參數(shù)的映射、SQL的執(zhí)行、結(jié)果的解析過程;

示例源碼

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-mybatis工程

Mybatis 源碼中文注釋

https://github.com/xiaolyuh/mybatis

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容