一、Mybatis的介绍

Mybatis作为Java常用的访问数据库层的框架,其工作主要交给创建的Sqlsession对象完成,那么Sqlsession对象是如何创建的?它又是去如何去对数据库进行操作?

如图所示,是我们常用的使用mybatis进行数据库访问的方式,现在我们按照上面得步骤来一次分析整个数据库访问的流程及其原理。

mybatisplus配置mysql连接 mybatis连接数据库的原理_对象创建

二、Mybatis的原理及其工作流程

  1. 读取mybatis全局配置文件
    将定义好的mybatis全局配置文件进行读取,并包装称为一个InputStream对象。这个比较简单,就不详细分析
  2. 解析配置文件
    由SqlSessionFactoryBuilder类的bulid方法驱动,对包装好的XML文件进行解析。很容易看到,其具体的解析任务是交给XMLConfigBuilder对象完成,
  3. mybatisplus配置mysql连接 mybatis连接数据库的原理_对象创建_02

  4. 并将读取的数据存入Configuration的对象中
  5. mybatisplus配置mysql连接 mybatis连接数据库的原理_配置文件_03

  6. Configuration作为解析配置文件过程中,最重要的一个类,它的作用主要如下:
    a.读入配置文件
    b.提供单例,为后续创建SessionFactory服务提供配置参数
    c. 初始化配置信息
    Mybatis的几乎所有配置文件信息都是存储在由XMLConfigBuilder构建的Configuration对象中,那么它是如何去构建的,如下:
  7. mybatisplus配置mysql连接 mybatis连接数据库的原理_配置文件_04

    mybatisplus配置mysql连接 mybatis连接数据库的原理_对象创建_05

  8. 到此,Configuration对象创建并注入完成。
  9. SqlSessionFactory对象的创建
    让我们继续回到
  10. mybatisplus配置mysql连接 mybatis连接数据库的原理_数据库_06

  11. 由前文知道,parser.parser()会返回构建并注入好的Configuration对象,可见SqlSessionFactory对象与Configuration有着必然的关联。
  12. mybatisplus配置mysql连接 mybatis连接数据库的原理_数据库_07

  13. SqlSessionFactory对象由DefaultSessionFactory根据Configuration的信息去创建。
  14. SqlSession的对象的创建
    由于前面所创建的SqlSessionFactory是一个接口,因此SqlSession对象的创建交给了SqlSessionFactory的实现类DefalutSqlSessionFactory完成。
  15. mybatisplus配置mysql连接 mybatis连接数据库的原理_数据库_08

  16. 这里同样适用到了前面所创建的Configuration对象的配置信息,继续往下
  17. mybatisplus配置mysql连接 mybatis连接数据库的原理_配置文件_09

  18. 这里我们需要重点关注的是Executor对象,这是SqlSession对象去访问数据库的执行器,每一个SqlSession对象都维持着这样一个Executor。到此SqlSession对象创建完成,可以开始对数据库进行访问了。
  19. SqlSession的执行过程
    由于SqlSession同样是一个接口,因此具体的任务交给它的实现类DefaultSqlSession完成
  20. mybatisplus配置mysql连接 mybatis连接数据库的原理_配置文件_10

  21. 这里同样用到了Configuration对象的信息。继续往下:
  22. mybatisplus配置mysql连接 mybatis连接数据库的原理_配置文件_11

  23. 这里采用了动态代理技术,继续往下:
  24. mybatisplus配置mysql连接 mybatis连接数据库的原理_数据库_12

  25. 代理类的具体操作封装在invoke()方法之中,由此可见,SqlSession对结果进行了缓存,并封装在一个HashMap之中,其中key为sql语句,value为查询结果。到此整个流程执行完成。