当前位置:首页 > 经验 >

mybatis原理通俗易懂(my batis的工作原理)

来源:原点资讯(www.yd166.com)时间:2022-10-29 11:56:10作者:YD166手机阅读>>

近来想写一个Mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了。

核心部件:

  • SqlSession
  • executor
  • StatementHandler
  • ParameterHandler
  • ResultSetHandler
  • TypeHandler
  • MappedStatement
  • Configuration

mybatis原理通俗易懂,my batis的工作原理(1)

在分析工作原理之前,首先看一下我的mybatis全局配置文件

第一步:创建一个sqlSessionFactory

在了解如何创建sqlSessionFactory之前,先看一下mybatis是如何加载全局配置文件,解析xml文件生成Configuration的

在上面的第二段代码中有一句

刚好我们的全局配置文件中有一个mapper的配置,由此可见,mapperElemet()方法是解析mapper映射文件的,具体代码如下

根据以上代码可以分析,在写mapper映射文件的地址时不仅可以写成resource,还可以写成url和mapperClass的形式,由于我们用的是resource,所以直接进入第一个判断,最后解析mapper映射文件的方法是

其中具体解析每一个sql语句节点的是

进入这个方法一层层深究,最后到这里可以知道MappedStatement是由builderAssistant(即MapperbuildAssistant)创建的。

最后进入方法addMappedStatement(),mappedStatement最后以id为键保存在了Configuration中的一个map变量mappedStatements中。

最后回到我们的创建sqlSessionFactory上,之前的一切都是为了生成一个sqlSessionFactory服务的

从上面的代码可以看出最后是通过以Configuration为参数build()方法生成DefautSqlSessionFactory。

mybatis原理通俗易懂,my batis的工作原理(2)

第二步:创建sqlSession

executor在这一步得到创建,具体的使用在下一步。

第三步:执行具体的sql请求

在我的代码里执行的是

具体到里面的方法就是

在这里通过statementId拿到了我们在第一步存在map里面的MappedStatement。在这里引用参考博客的一句话:

SqlSession根据Statement ID, 在mybatis配置对象Configuration中获取到对应的MappedStatement对象,然后调用mybatis执行器来执行具体的操作。

再继续看query()和queryFromDatabase()这两个方法

在这两个方法里面会为当前的查询创建一个缓存key,如果缓存中没有值,直接从数据库中读取,执行查询后将得到的list结果放入缓存之中。

紧接着看doQuery()在SimpleExecutor类中重写的方法

Statement连接对象就是在这里创建的,因此Executor的作用之一就是创建Statement了,创建完后又把Statement丢给StatementHandler返回List查询结果。

接下来再看一下这里的两个方法prepareStatement()和query()的具体实现

prepareStatement()是创建Statement的具体实现方法,调用parameterize()对创建的Statement对象设置参数,即为我们设为占位符的地方赋上指定的参数,parameterize()方法再深入进去就是调用ParameterHandler的setParameters()方法具体赋值了。

这里的query()是调用了ResultSetHandler的handleResultSets(Statement) 方法。作用就是把ResultSet结果集对象转换成List类型的集合。

mybatis原理通俗易懂,my batis的工作原理(3)

总结以上步骤就是:

  1. 根据具体传入的参数,动态地生成需要执行的SQL语句,用BoundSql对象表示
  2. 为当前的查询创建一个缓存Key
  3. 缓存中没有值,直接从数据库中读取数据
  4. 执行查询,返回List 结果,然后 将查询的结果放入缓存之中
  5. 根据既有的参数,创建StatementHandler对象来执行查询操作
  6. 将创建Statement传递给StatementHandler对象,调用parameterize()方法赋值
  7. 调用StatementHandler.query()方法,返回List结果集
总结

以上三个步骤所有流程大体可以用一张图来总结

mybatis原理通俗易懂,my batis的工作原理(4)

最后

欢迎大家一起交流,喜欢文章记得关注我点赞转发哟,感谢支持!

栏目热文

mybatis源码深度解析(mybatis源码详细讲解)

mybatis源码深度解析(mybatis源码详细讲解)

一、前言1、mybatis框架图如上为mybatis的框架图,在这篇文章中通过源码来重点看下数据处理层中的参数映射,SQ...

2022-10-29 12:00:28查看全文 >>

mybatisplus优缺点(mybatis优缺点)

mybatisplus优缺点(mybatis优缺点)

在之前发表的文章中有说过mybatis,没看过的可以去看一看,今天来说一说他的升级版本,简而言之,就是mybatis-p...

2022-10-29 11:54:17查看全文 >>

mybatis基础知识整理(mybatis初学者基础知识)

mybatis基础知识整理(mybatis初学者基础知识)

Mybatis简介原始jdbc操作(查询数据)原始jdbc操作(插入数据)原始jdbc操作的分析原始jdbc开发存在的问...

2022-10-29 12:07:42查看全文 >>

mybatis一级缓存和二级缓存(mybatis一级缓存和二级缓存的关系)

mybatis一级缓存和二级缓存(mybatis一级缓存和二级缓存的关系)

mybatis缓存机制mybatis包含缓存机制,恶意方便的配置和定制。默认定义了一级缓存和二级缓存。默认情况下,只有一...

2022-10-29 11:57:14查看全文 >>

mybatis通俗讲解(mybatis中的基础知识和快速入门)

mybatis通俗讲解(mybatis中的基础知识和快速入门)

版权声明:本文为CSDN博主「$码出未来」的原创文章原文链接:https://blog.csdn.net/yuansha...

2022-10-29 11:48:11查看全文 >>

mybatis基本工作流程(mybatis中的基础知识和快速入门)

mybatis基本工作流程(mybatis中的基础知识和快速入门)

1、首先是读取Mybatis的核心配置文件Mybaits-config.xml,该文件主要是配置了数据库的连接信息、用户...

2022-10-29 11:42:24查看全文 >>

mybatis简单示例(mybatis例子)

mybatis简单示例(mybatis例子)

Spring之所以能打败其他所有同类型Java开发框架屹立不倒的重要原因之一就是提供很多扩展点,让其他组件和框架很容易就...

2022-10-29 11:54:56查看全文 >>

mybatis菜鸟教程(mybatis学习手册)

mybatis菜鸟教程(mybatis学习手册)

mybatis基本配置及执行使用了mybatis首先需要两个配置文件,一个是mybatis-config.xml,是my...

2022-10-29 11:29:14查看全文 >>

mybatis工作原理通俗理解(mybatis真实原理)

mybatis工作原理通俗理解(mybatis真实原理)

作者:vivo互联网服务器团队-Zhang Peng一、MyBatis 完整示例这里,我将以一个入门级的示例来演示 My...

2022-10-29 11:27:50查看全文 >>

mybatis插入时间参数(mybatis接收日期参数)

mybatis插入时间参数(mybatis接收日期参数)

介绍MyBatis Generator的作用就是根据数据库中的表结构,帮我们自动生成和表结构相同的实体类,mapper接...

2022-10-29 12:02:57查看全文 >>

文档排行