MyBatis 流程梳理

MyBatis 流程梳理

MyBatis 原理图:

MyBatis原理图
SqlSession:MyBatis最核心的就是创建一个SqlSession对象去获取要我们要操作的mapper并执行CRUD操作,SqlSession对象就好比是JDBC中的Connection对象,它是线程不安全的,每次使用都需要开启一个新的SqlSession对象,使用完毕正常关闭。但是SqlSession是一个接口,那我们如何去创建SqlSession对象呢?

SqlSessionFactory:该对象中有一个openSession()方法用来返回SqlSession对象,但是SqlSessionFactory也是一个接口,我们不能直接去通过new创建该接口的对象,那要如何获取SqlSessionFactory的对象呢?

SqlSessionFactoryBuilder:MyBatis用来构建SqlSessionFactory对象的建造类,通过SqlSessionFactory build(Reader reader)构造器去创建对象,需要给它传入一个输入流对象,读取MyBatis配置文件。
至此,MyBatis通过读取MyBatis-config.xml核心配置文件成功创建SqlSession对象,官方建议我们封装一个工具类来获取SqlSession对象,代码如下:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybaitsUtils {

    static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream  inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static SqlSession getSqlSession(){
       return sqlSessionFactory.openSession();
    }

}

从SqlSessionFactoryBuilder().build(inputStream)方法点进去可以看到,这里用了一个XMLConfigBuilder类去解析MyBatis核心配置文件。

XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());

Executor(执行器):SqlSession本身并不能直接操作数据库,这时就需要Executor来完成,负责SQL语句的生成和查询缓存的维护,该接口有两个实现类:
缓存执行器与基本执行器(下图一个是源文件一个是字节码文件)
在这里插入图片描述
MappedStatement(映射语句):封装执行语句时的信息,如SQL、输入参数,输出结果。

更加底层的执行流程图:
在这里插入图片描述
StatementHandler:语句处理器,封装了JDBC的DML、DQL操作、参数设置
ParameterHandler:参数处理器,把用户传入参数装换为JDBC需要的参数值
ResultSetHandler:结果集处理器,把结果集中的数据封装到List集合
TypeHandler:类型转换器,负责把Java中类型和JDBC类型相互转换
Configuration:MyBatis全局配置对象,封装了所有的配置信息
SqlSource:SQL源,根据用户传入的参数生成SQL语句,并封装到BoundSql中
BoundSql:SQL绑定,封装SQL语句和对应的参数信息

再搭配MyBatis架构图,来加深对MyBatis的理解:
在这里插入图片描述


版权声明:本文为qq_47482077原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。