mybatis源码解析(零) MyBatis简单介绍

mybatis源码解析(零) 项目结构概览

mybatis源码解析系列源码基于 3.5.2-SNAPSHOT 版本,截至笔者开始写第一篇源码解析时这是官方的最新master分支。

写文章的过程中参考了很多大佬的文章和思路,以及一些为了解释清楚所必须的图。如有侵权,请联系删除。

参考内容:芋道源码博客 《MyBatis技术内幕》以及其他很多文章及书籍,以及开源项目,不一一列举。

在真正开始梳理MyBatis源码之前,需要先简单概述一下mybatis的执行流程,防止在解析过程中被源码绕晕。MyBtatis的插件很多,但是万变不离其宗。虽然实际开发中并不需要知道一些理论知识,但在这一篇里还是先理一理这些容易记混的点,加深一下自己的印象,也帮助那些不熟悉框架的同学快速建立一个对mybatis的认识。


1.什么是ORM,常见的ORM框架有哪些

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的开发方法出现的。都知道Java是面向对象的编程语言,在Java的世界里万物皆对象。但是数据库里并不是这样的,表与表之间并不存在什么封装,继承,多态。要想用面向对象的思维操作数据库,就需要一个工具来帮我们实现这件事。这时远方飘来一句话——“计算机领域所有的问题都可以通过加一个中间层来解决”。所以就有了ORM框架来帮我们做这件事,简单说就是完成对象到数据库表之间的映射关系。在此基础上又提供了一些诸如会话管理,SQL预编译等方便开发的功能。

常见的ORM框架有Hibernate,JPA(底层还是使用的Hibernate),MyBatis。这里就不去比较之间的差别了,感兴趣的同学可以自己去百度或者Google一下。


2.MyBatis执行一条SQL的过程是什么样的

  1. 解析 mybatis-config.xml 配置文件,通过 SqlSessionFactoryBuilder 构造 SqlSessionFactory 对象;
  2. SqlSessionFactory 通过 openSession() 方法获取 SqlSession 对象;
  3. 通过 SqlSession 获得 mapper 代理对象
  4. 通过 mapper 代理对象执行数据库操作
  5. 执行成功,使用 SqlSession 提交事务,执行失败,使用 SqlSession 回滚事务
  6. 关闭会话

以上的几个步骤就是mybatis执行一次数据库操作的步骤,在后续的解析中会针对每一个步骤进行详细的解析。其中几个关键步骤在mybtais源码中提供的测试方法中有提供,感兴趣的可以直接上手debug一遍。这里贴一下 AutoConstructorTest 的代码

@BeforeAll
  static void setUp() throws Exception {
    // create a SqlSessionFactory
    //基于 mybatis-config.xml 创建 SqlSessionFactory 对象
    try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/autoconstructor/mybatis-config.xml")) {
      sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }

    // populate in-memory database
    //将 CreateDB.sql 初始化数据到内存数据库
    BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),
        "org/apache/ibatis/autoconstructor/CreateDB.sql");
  }

  @Test
  void fullyPopulatedSubject() {
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
      final AutoConstructorMapper mapper = sqlSession.getMapper(AutoConstructorMapper.class);
      final Object subject = mapper.getSubject(1);
      assertNotNull(subject);
    }
  }


你懂的

你可能感兴趣的:(Mybatis,源码解析)