引言
在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹(参考:《MyBatis————基础知识》)。但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代码生成,到基本使用,我们甚至不需要动手写一句SQL就可以完成一个简单应用的全部CRUD操作。从原生mybatis到mybatis-spring,到mybatis-plus再到mybatis-plus-spring-boot-starter。spring在发展,mybatis同样在随之发展。

万变的外表终将迷惑人们的双眼,只要抓住核心我们永远不会迷茫!

工作原理原型图
用最直观的图,来征服你的心!

工作原理解析
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);

然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

详细流程如下:

1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。

e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

mybatis层次图:

原图:https://blog.csdn.net/xudan1010/article/details/53435018

参考文章:

《Mybatis实现原理深入解析》

《Mybatis之工作原理》

《mybatis加载顺序》

---------------------
作者:圣斗士Morty
来源:CSDN
原文:https://blog.csdn.net/u014745069/article/details/80788127
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. centos 7.0 编译安装php 7.0.3
  2. Objective-C三方库: ZXEasyCoding
  3. 设置ubuntu12.04桌面版开机进入命令行模式
  4. Socket编程基本流程实践
  5. Python——目录操作
  6. wap资费页面
  7. 我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身
  8. oraclede chuangjian yu dajian(zhuan)
  9. The J1850 Core
  10. CentOS(Linux) - SVN使用笔记(二) - 创建SVN仓库及下载仓库到本地
  11. Windows 8本地化多语言支持
  12. cookie使用随笔
  13. 四则运算4(Android版)
  14. Python常用模块-时间模块
  15. 个人笔记本安装多个jdk(jdk1.7,jdk1.8,jdk1.9,jdk10.0)出现的问题
  16. Flask蓝图
  17. Software Engineer Title Ladder
  18. 介绍一个axios调试好用的工具:axios-mock-adapter
  19. WIN7系统有些文本乱码怎么办
  20. Eclipse新建tld文件

热门文章

  1. shell运算方式
  2. go 发送post请求(键值对、上传文件、上传zip)
  3. Appium自动化(5) - 如何获取android app 的Activity 和 Package
  4. 微信小程序开发正常,真机预览模式错误
  5. XML解析——Jsoup解析器
  6. python库--tensorflow--scope命名方式
  7. 在 vue-cli 项目中 使用elementUI 的“自定义主题”功能
  8. Jmeter扩展组件开发(7) - 自定义java请求的开发
  9. Java项目常用的统一返回跟统一异常处理
  10. 制作ppt最少必要知识