本文介绍mybatis访问数据库的流程以及其插件原理。

一、myBatis的使用

1、mybatis配置文件如下

2、sql文件

3、访问数据库代码如下

二、下面是配置文件解析流程

构建DefaultSqlSessionFactory对象

new SqlSessionFactoryBuilder().build(reader);

使用XMLConfigBuilder进行配置文件解析

解析sql配置文件

XMLMapperBuilder解析sql文件

org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement

构建以 namespace+”.”+sqlId 为key、MappedStatement为value的map。存储在Configuration对象的mappedStatements中。

创建dao代理工厂

MapperRegistry.addMapper将代理工厂存入configuration.mapperRegistry.knownMappers中(以class对象为key,代理工厂对象为value)

MapperProxyFactory代理工厂创建代理对象的方法

MapperProxy代理执行invoke方法

至此,通过解析配置文件,BaseBuilder.configuration对象中已经保存了sql信息、dao接口的代理信息。

三、下面是sql的执行过程

sessionFactory.openSession()
此方法获取sqlSession对象,包含了前面解析的配置信息以及Executor执行器。其中Executor的代理对象封装了插件逻辑

sqlSession.getMapper(IncomeRouterDao.class)
通过dao接口的class对象从knownMappers中获取其代理工厂并创建代理对象

MapperProxy.invoke()
通过代理对象的invoke方法执行sql

DefaultSqlSession.selectList()
查询单条/多条数据最终执行都是执行selectList方法
从configuration.mappedStatements获取到statement对象后,使用executor代理(默认SimpleExecutor+BaseWExecutor/开启二级缓存CachingExecutor)实际执行sql

CachingExecutor.query()
先从缓存获取,缓存没有从db查询。此缓存为mappedStatement(configuration.mappedStatements / namespace)级别的缓存,又称二级缓存。二级缓存为全局namespace级别缓存,不同sqlsession会话可共用。

BaseExecutor.query()
未开启二级缓存/二级缓存未获取到,则从一级缓存或DB中查询。
一级缓存对象localCache是executor的成员变量。而从executor(SimpleExecutor)的创建过程可以看出,每次sessionFactory.openSession()都会new一个executor对象。因此每次openSession()都是使用新的一级缓存对象,即一级缓存是sqlsession级别的缓存。

SimpleExecutor.doQuery()
后续即是使用jdbc进行数据库查询,不再继续深入

四、总结

1、通过解析mybatis-config.xml及sqlMapper.xml文件,保存以namespace+sqlId为key、mappedStatement为value的Map(configuration.mappedStatements);保存以namespace的class对象为key、MapperProxyFactory代理工厂为value的Map(configuration.mapperRegistry.knownMappers)。

2、opensession()开启会话时创建实际执行的Executor代理对象,封装一级二级缓存、插件逻辑。

3、执行时通过dao接口(namespace)以及执行方法(sqlId)从knownMappers中拿到代理工厂创建代理对象执行sql语句。

4、开启二级缓存的情况下查询顺序为:二级缓存(namespace级别)-->一级缓存(sqlsession级别)-->数据库。

5、后续会继续补充mybatis的插件执行流程,待续。。

参考:聊聊MyBatis缓存机制 - 美团技术团队

使用myBatis访问数据库原理相关推荐

  1. IDEA 中 使用 MyBatis 访问数据库时 报错 Table ‘xxx.t_xxx‘ doesn‘t exist

    报错 与 xml 文件如下: 解决方法 在 xml 文件中修改 SQL 语句,在要查询的表前面加上 数据库名称. 也就是: <?xml version="1.0" encod ...

  2. 第6章 数据库编程---数据库原理及应用

    第6章 数据库编程 1.理解ODBC连接数据库的方法 2.掌握数据库连接技术(JDBC) 3.掌握JavaWeb数据库编程 4.掌握数据库存储过程原理与编程 5.掌握数据库触发器原理与编程 6.掌握数 ...

  3. jsp学习 jdbc访问数据库

    因为我目前在学校有一门课程叫做javaweb,其中涉及到JavaScript中进行数据库访问的测试,经过学习发现与我们之前通过配置数据源结合spring提供的模板以及mybatis提供的方法进行数据库 ...

  4. MyBatis基本工作原理

    MyBatis框架是SqlSessionFactoryBuilder从mybatis-config配置文件来构建SqlSessionFactory, 然后的实例SqlSessionFatory的实例开 ...

  5. Mybatis源码分析之(四)mapper访问数据库的底层原理(代理方法中具体访问数据库的细节)

    从之前的文章,我们知道了其实mapper真正执行的方法就下面的最后两行.(以下所有的分析都基于一次mybatis的一次select查询. MapperProxy类中的invoke函数 public O ...

  6. springboot整合mysql5.7_springboot整合mybatis访问mysql,数据库

    讲解如何在springboot下整合mybatis,并访问数据库. 引入依赖 在pom文件引入mybatis-spring-boot-starter的依赖: org.mybatis.spring.bo ...

  7. Mybatis零基础教程,Java访问数据库核心操作,详解Spring-boot整合Mybatis持久层!

    1.前言 持久层是JavaEE中访问数据库的核心操作,Mybatis是一款优秀的持久层框架,诞生于2010年,2013年迁移至Github.它支持定制化 SQL.存储过程以及高级映射.MyBatis ...

  8. mybatis 传入id_想深入理解MyBatis架构及原理实例分析 把握这些就够了

    前言 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询 ...

  9. Mybatis简介与原理

    转载自  Mybatis简介与原理 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到 ...

最新文章

  1. webpack打开项目命令_配置webpack中dev.env.js、prod.env.js,解决不同命令下项目启动和打包到指定的环境...
  2. mysql 事务id_[转]MySQL 5.6 全局事务 ID(GTID)实现原理(一)
  3. java数据结构 队列_Java数据结构之队列
  4. python string类型_Python的基本数据类型——String
  5. 谷歌放弃C++语言,Python将要一统江湖了?
  6. Error in nextTick
  7. 功放前级的左右_TDG Audio达芬奇:什么是前级,后极?
  8. Node.js模块化开发(非常详细,满满的干货)
  9. ubuntu + pycharm + anaconda + pyqt4 + tools 配置
  10. WayOs内置智能重启:自动计算UTC时间为本地时间,可以调整为几时重启
  11. 【2022最详细--SVN客户端安装教程】
  12. Eclipse-cpp-2022-03下载地址
  13. 【锂电池】关于4.2V锂电池充电IC的一些记录
  14. 关于Windows 7操作系统进行磁盘碎片整理时提示“已使用其他程序计划了磁盘碎片整理程序”的解决办法
  15. 设备信息管理系统(C语言)
  16. 分享111个HTML医疗保健模板,总有一款适合您
  17. 智子观测宣布和数榜签约合作,强化大数据采集技术
  18. VBScript里msgbox出现中文乱码的解决办法
  19. linux设备驱动归纳总结(十一):简单的看门狗驱动
  20. 高德地图API实现区域立体效果

热门文章

  1. 2016阿里巴巴校园招聘测试开发工程师笔试附加题(含部分答案)
  2. java前方交会_JAVA:角度前方交会算法GUI实现
  3. 删除vlan 华为s5720_小白一个!向大神请教华为S5720S配置问题(已解决) - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  4. 自动化测试的主要类型有哪几种?
  5. 民工14辆三轮摩托风餐露宿3000公里艰辛返乡(图)
  6. 注塑模具行业主要存在哪些问题?
  7. 反NP监视原理并有实例说明
  8. 计算机网络按规模传输距离,计算机网络按距离如何分类
  9. Epic Games和虚拟引擎
  10. 2019年前端求职面试题-主攻react