Mybatis运行原理(带你三步走)

Mybatis运行原理(带你三步走)

官网地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html

第一步:初始化阶段,解析并加载到Configuration实例中。

  • 读取xml配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化工作。

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

源码解读入口:

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

其中:
XMLConfigBuilder:解析mybatis-config.xml文件。
XMLMapperBuilder:解析所有的*mapper.xml文件。
XMLStatementBuilder:解析SQL语句(select|insert|update|delete)。

以上解析的文件均加载到Configuration实例中。

第二步:代理阶段
使用jdk动态代理,封装IBatis编程模型,找到访问数据库时对应的方法及传参

  • 创建SqlSession响应请求
  • 动态代理封装iBatis的编程模型
  • 使用mapper接口访问数据库

源码解析入口:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

翻译过程:

在这里插入图片描述

找到session中对应的方法执行 <<<----- MapperMethod.SqlCommand.type + MapperMethod.MethodSignature.returnType
找到命名空间和方法名 <<<----- MapperMethod.SqlCommand.name
传递参数 <<<----- MapperMethod.MethodSignature.convertArgsToSqlCommandParam

第三步:数据读写阶段
遵循jdbc规范,通过SqlSession完成SQL的解析,参数的映射,SQL的执行、结果的解析过程。
Mybatis的四大对象:
Executor:通过对SimpleExecutor doQuery()方法的解读发现,Executor是调度器。
StatementHandler:它的作用是使用数据库的Statement或PrepareStatement执行操作,起承上启下作用。
ParameterHandler:对预编译的SQL语句进行参数设置。
ResultSetHandler:对数据库返回的结果集(ResultSet)进行封装,返回用户指定的实体类型。

TransactionalCache:二级缓存
PerpetualCache:一级缓存
注:数据查询时,先从二级缓存取数据,若取不到则再从一级缓存中取数据(这是MySQL规定),若一级缓存中再获取不到,则从数据库中取数据。

Executor内部运作过程:
在这里插入图片描述

以上只是梳理Mybatis大致处理流程,像Mybatis缓存机制等还未整理,后期会补上这块。

猜你喜欢

转载自blog.csdn.net/IT_Lynn/article/details/85065996