mybatis执行流程分析

news2025/4/6 14:18:00

mybatis全局配置文件

mybatis全局配置文件中涉及的标签如下图所示
在这里插入图片描述

配置文件解析

  public static void main(String[] args) throws IOException {// 读取配置文件InputStream is = Resources.getResourceAsStream("org/apache/ibatis/builder/MapperConfig1.xml");// 创建SqlSessionFactory工厂SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = sqlSessionFactoryBuilder.build(is);// 使用工厂生产SqlSession对象SqlSession session = factory.openSession();//使用SqlSession创建Dao接口的代理对象AuthorMapper authorMapper = session.getMapper(AuthorMapper.class);List<Author> authors = authorMapper.selectAllAuthors();//释放资源session.close();is.close();}

下面我们来进行源码分析。

配置文件的解析&创建SqlSessionFactory

配置文件的解析主要涉及到的类如下:XMLConfigBuilder、XPathParser、XPath、XNode,其中XPath、XNode是对
1、build方法内部首先会根据输入流等信息创建XMLConfigBuilder类的实例对象,然后调用XMLConfigBuilder实例的parse方法对配置文件进行解析;这里需要注意的是parse方法最后返回的是一个Configuration对象
在这里插入图片描述

2、parse方法则是调用了XPath对象的evalNode方法对配置文件中的configuration节点进行解析,会把节点内容放在XNode对象中然后返回;
在这里插入图片描述

3、parseConfiguration方法会对configuration节点解析出来的内容再进行解析,会把解析出来的内容放在configuration对象中;实际上配置文件中的内容解析出来后都会存到Configuration中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjYs8014-1685886063612)(Pasted%20image%2020230223222648.png)]

4、parseConfiguration方法中主要做的事如下:

  • 解析 properties节点
      /*** 解析 properties节点*     <properties resource="mybatis/db.properties" />*     解析到org.apache.ibatis.parsing.XPathParser#variables*           org.apache.ibatis.session.Configuration#variables*/// issue #117 read properties firstpropertiesElement(root.evalNode("properties"));
  • 解析settings节点
      /*** 解析我们的mybatis-config.xml中的settings节点* 具体可以配置哪些属性:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings* <settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/>..............</settings>**/Properties settings = settingsAsProperties(root.evalNode("settings"));
  • 解析
      /*** 基本没有用过该属性* VFS含义是虚拟文件系统;主要是通过程序能够方便读取本地文件系统、FTP文件系统等系统中的文件资源。Mybatis中提供了VFS这个配置,主要是通过该配置可以加载自定义的虚拟文件系统应用程序解析到:org.apache.ibatis.session.Configuration#vfsImpl*/loadCustomVfs(settings);
  • 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
      /*** 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。* SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING* 解析到org.apache.ibatis.session.Configuration#logImpl*/loadCustomLogImpl(settings);
  • 解析别名
      /*** 解析别名* <typeAliases><typeAlias alias="Author" type="cn.tulingxueyuan.pojo.Author"/></typeAliases><typeAliases><package name="cn.tulingxueyuan.pojo"/></typeAliases>解析到oorg.apache.ibatis.session.Configuration#typeAliasRegistry.typeAliases*/typeAliasesElement(root.evalNode("typeAliases"));
  • 解析插件
      /*** 解析我们的插件(比如分页插件)* mybatis自带的* Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler (prepare, parameterize, batch, update, query)解析到:org.apache.ibatis.session.Configuration#interceptorChain.interceptors*/pluginElement(root.evalNode("plugins"));
  • 设置settings
      // 设置settings 和默认值settingsElement(settings);
  • 解析mybatis环境
      /*** 解析mybatis环境<environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="root"/><property name="password" value="Zw726515"/></dataSource></environment><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>*  解析到:org.apache.ibatis.session.Configuration#environment*  在集成spring情况下由 spring-mybatis提供数据源 和事务工厂*/// read it after objectFactory and objectWrapperFactory issue #631environmentsElement(root.evalNode("environments"));
  • 解析数据库厂商
      /*** 解析数据库厂商<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver"/><property name="DB2" value="db2"/><property name="Oracle" value="oracle" /><property name="MySql" value="mysql" /></databaseIdProvider>*  解析到:org.apache.ibatis.session.Configuration#databaseId*/databaseIdProviderElement(root.evalNode("databaseIdProvider"));
  • 解析类型处理器
      /*** 解析我们的类型处理器节点* <typeHandlers><typeHandler handler="org.mybatis.example.ExampleTypeHandler"/></typeHandlers>解析到:org.apache.ibatis.session.Configuration#typeHandlerRegistry.typeHandlerMap*/typeHandlerElement(root.evalNode("typeHandlers"));
  • 解析mapper文件
      /*** 解析mapper文件(SQL映射文件)*resource:来注册我们的class类路径下的url:来指定我们磁盘下的或者网络资源的class:若注册Mapper不带xml文件的,这里可以直接注册若注册的Mapper带xml文件的,需要把xml文件和mapper文件同名 同路径--><mappers><mapper resource="mybatis/mapper/EmployeeMapper.xml"/><mapper class="com.tuling.mapper.DeptMapper"></mapper><package name="com.tuling.mapper"></package>--></mappers>* package 1.解析mapper接口 解析到:org.apache.ibatis.session.Configuration#mapperRegistry.knownMappers2.*/mapperElement(root.evalNode("mappers"));

到这里配置文件就解析完了,mybatis会根据configuration对象创建SqlSessionFactory类的对象。

获取SqlSession

调用openSession()方法获取SqlSession

在这里插入图片描述

创建Executor的对象,这里会根据类型去创建对应的Executor
在这里插入图片描述

最后一行的代码:interceptorChain.pluginAll(executor)的作用是会调用所有拦截器对象的plugin方法


最后执行到Plugin类的wrap方法对executor进行包装

执行getMapper方法

实际上调用的是configuration对象的getMapper方法
在这里插入图片描述

而configuration对象则是调用了mapperRegistry对象的getMapper方法;
在这里插入图片描述

MapperRegistry简介

  • MapperRegistry实质上是一个Map,里面注册了启动过程中解析的各种mapper.xml;
  • MapperRegistry的key是接口的Class类型,MapperRegistry的value是MapperProxyFactory,用于生成对应的MapperProxy(动态代理类);
  • 由于Mybatis中的Mapper接口没有实现类,所以MapperProxy这个代理对
    象中没有委托类,也就是说MapperProxy干了代理类和委托类的事情
    在这里插入图片描述

接着往下看;mapperRegistry的getMapper方法则是调用了mapperProxyFactory的newInstance方法
在这里插入图片描述
MapperProxyFactory介绍

  • 在通过sqlSession获取Mapper时,其实先获取到的是这个工厂,然后通过这个工厂创建Mapper的动态代理类

MapperProxyFactory中的newInstance方法如下:
在这里插入图片描述

这里用到了动态代理,最后会调用MapperProxy中重写的的invoke方法
在这里插入图片描述
在这里插入图片描述

execute方法如下:
在这里插入图片描述

接着会调用executeForManay方法
在这里插入图片描述

selectList方法如下:
在这里插入图片描述

接着会执行exector中的query方法
在这里插入图片描述
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lTPACoy-1685886501778)(Pasted%20image%2020230321214105.png)]

可以看到最后使用的还是JDBC中的Statement,最后把查询到的结果返回查询流程就结束了。
在这里插入图片描述

下面mybatis总的一个处理流程:
在这里插入图片描述

mybatis一个大致的执行流程分析就到这里结束了,后面会继续详细讲解执行流程中涉及到的相关内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python多种颜色——提升SEO排名的技巧

Python多种颜色——提升SEO排名的技巧 在网站设计中&#xff0c;使用多种颜色可以提高用户体验和页面美观度。但你是否知道使用多种颜色还可以提高SEO排名呢&#xff1f;本文将介绍如何在Python代码中使用多种颜色来提高你的SEO排名。 什么是SEO&#xff1f; SEO的全称为“S…

chatgpt赋能python:Python备份文件夹:保障数据安全的最佳方法

Python备份文件夹&#xff1a;保障数据安全的最佳方法 数据备份是确保所有重要信息安全的关键部分。对于IT专业人士和计算机爱好者而言&#xff0c;文件夹备份是一项必不可少的任务。而Python是备份文件夹最流行的语言之一&#xff0c;因为它易于学习和使用。 在这篇文章中&am…

stable-diffusion基础问题记录

一、windows安装 1、启动 如果自己是anaconda&#xff0c;python版本不是3.10.6 conda create -n python_3_10_6 python3.10.6&#xff0c;创建一个这样的环境 修改webui-user.bat set PYTHOND:/software/Anaconda3/envs/python_3_10_6/python&#xff0c;把python换成这个…

【走进Linux的世界】Linux---基本指令(3)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 date指令cal指…

12代CPU启用SR-IOV vGPU,实现一台电脑当七台用

背景 虚拟桌面基础设施&#xff08;VDI&#xff09;技术一般部署在服务器&#xff0c;可以实现多个用户连接到服务器上的虚拟桌面。随着桌面计算机性能的日益提升&#xff0c;桌面计算机在性能在很多场景下已经非常富余&#xff0c;足够同时满足多个用户同时使用的需求。实际项…

Redis的持久化详解

目录 一、Redis的持久化二、RDB&#xff08;Redis DataBase&#xff09;1、RDB快照原理2、RDB配置3、redis.conf 其他一些配置4、RDB的备份恢复5、RDB优缺点 三、AOF&#xff08;Append Of File&#xff09;1、AOF原理2、AOF配置3、AOF的备份恢复4、重写流程5、AOF优缺点 四、A…

MySQL | Windows服务器部署ZIP免安装版MySQL8.0+数据库笔记

Windows服务器部署ZIP免安装版MySQL8.0数据库笔记 文章目录 Windows服务器部署ZIP免安装版MySQL8.0数据库笔记下载MySQL压缩包编写配置文件环境变量初始化数据库安装MySQL服务安装错误&#xff1a;VCRUNTIME140_1.dll 登录 MySQL 下载MySQL压缩包 打开官网的下载页面&#xff…

POI报表的入门

POI报表的入门 理解员工管理的的业务逻辑 能够说出Eureka和Feign的作用 理解报表的两种形式和POI的基本操作熟练使用POI完成Excel的导入导出操作 员工管理 需求分析 企业员工管理是人事资源管理系统中最重要的一个环节&#xff0c;分为对员工入职&#xff0c;转正&#xff0c;离…

chatgpt赋能python:Python如何处理AI文件

Python如何处理AI文件 什么是AI文件&#xff1f; AI文件是Adobe Illustrator的标准文件格式。它包含了图形设计师所创建的矢量图形&#xff0c;这些矢量图形可以根据需要进行缩放和文件大小的调整。AI文件是专业印刷和设计领域中最常用的格式之一。 为什么要处理AI文件&…

深入ReentrantReadWriteLock

ReentrantReadWriteLock出现的原因 首先synchronized和ReentrantLock都是互斥锁&#xff0c;一个线程在获取锁资源之后另一个线程只能等待假设有一种情况是读多写少&#xff0c;并且确保线程安全。可以使用ReentrantReadWriteLock实现ReentrantReadWriteLock的特点是读读不互斥…

基于随身wifi的Tiny linux debian搭建教程

基于随身wifi的Tiny linux debian搭建教程 基于随身wifi的Tiny linux debian搭建教程基本信息进9008miko备份Qualcomm Premium Tool全分区备份 开adb刷debianssh连接扩展应用原版镜像测速ServerBox自动登录校园网 bug 基于随身wifi的Tiny linux debian搭建教程 基本信息 12芯…

Java8环境安装及配置

Java8环境安装及配置 一、下载JDK8二、安装三、环境变量配置四、验证 一、下载JDK8 本教程使用的是8u202版本&#xff0c;若需要其他版本可点击下方链接跳转下载。 Oracle下载&#xff0c;点击跳转选择版本 如下图所示&#xff0c;选择自己需要的版本下载 点击8u202版本 下载…

JavaSE进阶(day14,复习自用)

XML、XML解析、设计模式等 XMLXML概述XML的创建、语法规则XML文档约束方式一-DTD约束[了解]XML文档约束方式二-schema约束[了解] XML解析技术XML解析技术概述Dom4J解析XML文件Dom4J解析XML文件-案例实战 XML检索技术&#xff1a;Xpath设计模式&#xff1a;工厂模式设计模式&am…

C++算法:排序之一(插入、冒泡、快速排序)

C算法&#xff1a;排序 排序之一&#xff08;插入、冒泡、快速排序&#xff09; 文章目录 C算法&#xff1a;排序前言一、十大排序法性能二、各算法实现1、插入排序2、冒泡排序3、快速排序 原创文章&#xff0c;未经许可&#xff0c;严禁转载 前言 排序算法很多&#xff0c;一…

chatgpt赋能python:Python备份一个列表:最简单的方式和最佳实践

Python备份一个列表&#xff1a;最简单的方式和最佳实践 在Python编程中&#xff0c;经常需要将数据存储在列表中。但是&#xff0c;由于数据的重要性&#xff0c;我们需要确保数据不会丢失或损坏。因此&#xff0c;备份列表是我们需要考虑的一件事情。在这篇文章中&#xff0…

chatgpt赋能python:Python实现文件夹备份:让你的数据永不丢失

Python实现文件夹备份&#xff1a;让你的数据永不丢失 数据备份对于每个人都非常重要。如果你有很多个人或工作文件保存在计算机上&#xff0c;那么定期备份可以保证你的数据不会因为计算机出现故障而丢失。Python作为一种强大的编程语言&#xff0c;可以帮助你轻松地实现文件…

Linux开发工具gcc/g++篇

文章目录 &#x1f347;0. 前言&#x1f348;1. 背景知识&#x1f349;2. gcc/g使用&#x1f34a;2.1 预处理操作&#x1f34b;去注释&#x1f34b;头文件展开&#x1f34b;条件编译 & 宏展开 &#x1f34a;2.2 编译操作&#x1f34a;2.3 汇编操作&#x1f34a;2.4 链接 &a…

chatgpt赋能python:Python多段分段函数的介绍

Python多段分段函数的介绍 在Python编程中&#xff0c;有许多种不同类型的函数&#xff0c;其中之一是多段分段函数。多段分段函数的特点在于&#xff0c;在输入域上&#xff0c;函数定义被划分为不同的段&#xff0c;每个段都求值并返回结果。在本文中&#xff0c;我们将深入…

Java性能权威指南-总结5

Java性能权威指南-总结5 垃圾收集入门垃圾收集概述分代垃圾收集器 垃圾收集入门 很多时候没有机会重写代码&#xff0c;又面临需要提高Java应用性能的压力&#xff0c;这种情况下对垃圾收集器的调优就变得至关重要。 现代JVM的类型繁多&#xff0c;最主流的四个垃圾收集器分别…

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED 开发环境HelloWorld!闪烁 LED 灯代码 由于比较简单就放在一起写了 开发环境 软件&#xff1a;Thonny HelloWorld! 要想使串口打印HelloWorld&#xff01; 只需要一行代码 print("HelloWorld!")保…