Mybatis的体系结构与核心工作原理

从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。

一、体系结构

1.三层划分介绍

Mybatis的整体架构从宏观上可分为三层,分别是基础支持层、核心处理层和接口层。如下图:

mybatis plus架构_java


Mybatis主要工作流程图:

mybatis plus架构_mybatis plus架构_02


在Mybatis主要工作流程里,不同的功能由很多不同的类协作完成,它们分布在Mybatis的不同的Package里面。

mybatis plus架构_源码_03

1.1 接口层

接口层的核心是SqlSession,它是上层应用和Mybatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到请求时,会调用核心处理层的各个模块来完成具体对数据库的操作。

1.2 核心处理层

核心处理层完成对数据库的所有操作。

核心处理层主要做了这几件事:

1.把接口中传入的参数解析并且映射成JDBC类型;

2.解析xml文件中的SQL语句,包括插入参数,和动态SQL生成;

3.执行SQL语句;

4.处理结果集并映射成Java对象;

插件也属于核心层,这是因为它的工作方式是拦截核心处理层的四大对象。

1.3 基础支持层

基础支持层主要是为了让一些通用的功能实现复用,用来支持核心处理层工作。比如数据源、缓存、日志、xml解析、反射、事务等。

二、核心流程

// 1.获取配置文件
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    // 2.加载解析配置文件并获取SqlSessionFactory对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    // 3.根据SqlSessionFactory对象获取SqlSession对象
    SqlSession sqlSession = factory.openSession();
    // 4.通过SqlSession中提供的API方法来操作数据库
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> list = mapper.selectUserList();
    for (User user : list) {
        System.out.println(user);
    }
    // 5.关闭会话
    sqlSession.close();

上面我们用5个步骤实现了一个Mybatis查询数据库的操作,下面按照这5个步骤来分析Mybatis的运行原理。

2.核心对象的生命周期

2.1 SqlSessionFactoryBuilder

SqlSessionFactoryBuilder顾名思义它是用来构建SqlSessionFactory的,SqlSessionFactory我们只需要一个,所以只要构建了SqlSessionFactory,它也就没有存在的意义了。所以它的生命周期只存在于方法的局部。

2.2 SqlSessionFactory

SqlSessionFactory是用来创建SqlSession的,每次应用程序访问数据库操作,都需要创建一个会话。因为我们一直有创建会话的需求,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。为了不造成浪费资源,SqlSession只需要一个实例对象来创建,所以我们要采用单例模式。

2.3 SqlSession

一个Sqlsession是一次会话,它的生命周期存在于一次请求会话中。因为它不是线程安全的,不能在线程间共享,所以我们在请求开始的时候创建一个SqlSession对象,在请求结束或者方法执行完毕的时候,要及时的关闭它。

2.4 Mapper

Mapper通过源码分析它实际上是一个代理对象,是从SqlSession中获取的。

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

它的作用是发送SQL来操作数据库的数据,它的作用域在一个SqlSession事务方法之内。