MyBatis 源码入坑整体-下

50 阅读2分钟

接上文:MyBatis 源码入坑整体-上

核心处理层

实现了 MyBatis 核心处理流程。

  • 配置解析

对应 builder 和 mapping 模块,前者是配置解析过程,后者是 SQL 操作解析后的映射。

在 MyBatis 初始化过程中,会加载 mybastis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的配置信息,里面会形成相应的对象,比如:SqlSource、Mapped Statement 等保存到 Configuration 对象中,Configuration 是贯穿整个 MyBatis 框架的。

  • sql 解析

对应 scripting 模块。

主要是为了解决拼凑 SQL 的问题,里面实现了很多动态标签,比如 、、 等。

一般使用接收参数表达式都是 #{} ,可以防止 SQL 注入。里面还有 ognl 引用的处理

  • sql 执行

executor 和 cursor :前者对应执行器,后者对应执行结果的游标。

其中比较重要的是: Executor、StatementHandler、ParameterHandler、ResultSetHandler 。

这四个也是 MyBatis 可以对外让用户自定义插件的接口。

Executor:主要负责维护一级缓存和二级缓存,并提供事务相关操作。它会将数据库相关操作委托给 StatementHandler 完成。

  • 插件层

对应 plugin 模块。

主要的核心内容就是 Java 动态代理。提供插件接口,使得用户可以添加自定义插件的方式对 MyBatis 进行扩展。比如:PageHelper 就是实现了 Executor#query 方法,对 SQL 进行分页处理。

接口层

对应 session 模块。

其核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API ,是与上层应用交互的桥梁。

接口层在接收到请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

一般测试的时候主要分为三步:

  1. 通过 mybatis-config.xml 以及 mapper.xml 或者 mapper 接口中的注解来初始化得到 sqlSessionFactory。再通过 sqlSessionFactory 工厂获取 SqlSession 对象。
  2. 获取映射器对象:这里会同通过 MapperProxy 去创建代理对象。
  3. 接口调用方法的时候就会去执行代理对象生成的方法,从而进入 MyBatis 的后续处理逻辑。
    // 1. 从SqlSessionFactory中获取SqlSession
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config-datasource.xml"));
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 2. 获取映射器对象
        IActivityDao dao = sqlSession.getMapper(IActivityDao.class);

        // 3. 测试验证
        Activity res = dao.queryActivityById();

总结

这里面也是涉及很多设计模式:模板方法模式、代理模式等等。 当然还有一些'边角料'的东西,比如:cache 模块,涉及一级缓存、二级缓存,里面运用了适配器模式。 整体来说:MyBatis 现在对我来说还是个庞然大物,还需要深入学习,特别还有一些设计模式需要更加深入的学习,不然源码读不懂咯。 路虽远,行则将至