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的理解: