MyBatis总结(2)- MyBatis实现原理(一)

Mybatis实现原理:

概括一句话:约定配置参数mybatis-config.xml,映射关系JavaBean-mapper.xml,用SqlSessionFactoryBuilder构建应用程序运行期间需要的SqlSessionFactory实例对象,当请求或方法需要执行CURD操作时,通过SqlSessionFactory创建一个SqlSession对象,来进行对数据库的操作。

核心类

  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession

Mybatis核心类作用:

SqlSessionFactoryBuilder:

- 作用?
  • 只做一件事情:用来构建SqlSessionFactory实例
- 基于什么构建?
  • mybatis-config xml配置,抑或是自定义Configuration实例对象
- 生命周期?
  • 构建完Factory实例,即可销毁,作用域一般在方法中作为局部变量使用

SqlSessionFactory:

- 作用?
  • 用来“加工生产”SqlSession实例对象
- 基于什么构建?
  • 基于SqlSessionFactoryBuilder在建造时解析出来的Configuration对象(会包含environment, properties, setting, mappers映射关系等)
    在这里插入图片描述
    • 而这个Configuration对象就是在SqlSessionFactoryBuilder构造build时,通过XmlConfigBuilder将我们定义好的mybatis-config.xml配置文件解析成程序对象,具体是通过这个方法org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration处理的:

      • 从这里可以看出,在xml中的xml标签(properties, typeAliases等等),这就理解了设置标签时的规则【Q1】:
private void parseConfiguration(XNode root) {
    try {
      // issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfsImpl(settings);
      loadCustomLogImpl(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginsElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlersElement(root.evalNode("typeHandlers"));
      mappersElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }
- 生命周期?
  • 一旦被构建,应该在程序运行期间一直存在,且一般情况下,都是以单例存在,不需要创建多个。作用域应该为应用作用域。

SqlSession

- 作用?
  • 用来处理执行sql CURD操作,事务管理,以及缓存功能
- 基于什么构建?
  • 每当SqlSessionFactory对象调用openSession方法时,就会创建一个DefaultSqlSession实例对象;
  • 该SqlSession对象会有一个属性为Executor对象,而这个Executor对象是基于Environment配置中定义的transactionManager 类型type创建起来的(一般情况下是:JdbcTransaction)。最终的代码逻辑为:
    • 获取JavaBean Mapper对象,通过SqlSession的Configuration对象中获取预先定义好的mappers,根据映射id,找到MappedStatement;

    • 执行CURD操作,通过SqlSession的Executor【Q2】对象来受理数据库操作,最终是交给JDBCTransaction事务对象完成的
      在这里插入图片描述

    • 拿到JavaBean的Mapper对象后,根据method方法名查找mapper映射信息:
      在这里插入图片描述

    • 在mapper映射中创建一个个CURD,都会被解析成一个个以 id 为key,以MappedStatement为value的map.entry对象:
      在这里插入图片描述

    • 而这里的MappedStatement对象:属于Prepared类型的,且将我们在mapper定义的信息加载出来,在这里可以理解为是一个信息库,供后续sql交互时使用:
      在这里插入图片描述

    • 最终执行sql时,还是回到了熟悉的JDBC配方:
      这个SimpleExecutor继承了我们SqlSession的Executor对象,通过transaction去创建Connection,去创建preparedStatement,得到结果集ResultSet:
      在这里插入图片描述在这里插入图片描述

  • 画个图更清晰些:
    Mybatis核心原理

- 生命周期?

  • 每个线程都应该有它自己的 SqlSession 实例。一般情况下,作用域是请求或方法作用域,一次Http请求,或一个方法的CURD操作。注意一点的是,这里需要显式的事务管理,缺省值autocommit为false。另外一点的是,用完需要关闭资源。

【Q1】: 这里标签的编写是有顺序要求的:

  • 必须按照要求的顺序来:
The content of element type "configuration" must match
 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

【Q2】: 这里Excutor,在OpenSqlSession创建时,就可以看到:(具体会在后续总结到)

  • SqlSession -> Executor = CachingExecutor(在Cache中查询信息)
  • CachingExecutor -> Delegate(委托代理) = BaseExecutor(真正去DB操作的执行器对象)
    • 这里就涉及到Mybatis的缓存功能:
      • Mybatis分为:
        • 一级缓存: 默认开启,SqlSession级别;
        • 二级缓存:Mapper级别,需要在mapper映射上定义<cache>标签来开启

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab使用教程(92)—流线图、流带图和流管图

1.使用向量数据显示流线图 MATLAB 向量数据集 wind 代表北美地区的气流。本示例结合使用了几种方法&#xff1a; 利用流线跟踪风速 利用切片平面显示数据的横截面视图 利用切片平面上的等高线提高切片平面着色的可见性 1.1确定坐标的范围 加载数据并确定用来定位切片平面…

TypeScript系列之-- 带你深层次理解对象类型回归本质探究原理

描述对象的数据类型&#xff1a; 使用class/constructor描述用type或interface描述 使用class/constructor描述 const a: Date ()> console.log(1) // Error 会报错缺少日期的一些属性 const a: Function ()> console.log(1) // Ok class Person { name: string …

行心科技中禄松波携手,开启智能健康新时代

在2024年第34届健博会暨中国大健康产业文化节的盛大舞台上&#xff0c;广州市行心信息科技有限公司&#xff08;以下简称“行心科技”&#xff09;与浙江中禄松波生物工程有限公司&#xff08;以下简称“中禄松波”&#xff09;宣布达成战略合作&#xff0c;共同推动医康养产业…

企业建站响应式网站建设平台版源码系统 海量模版可选择 带完整的安装代码以及搭建教程

系统概述 企业建站响应式网站建设平台版源码系统是一款集创新性、实用性和便捷性于一体的建站解决方案。它旨在为用户提供一站式的网站建设服务&#xff0c;无论你是新手还是经验丰富的开发者&#xff0c;都能通过该系统轻松实现网站的构建与部署。 该系统采用先进的技术架构…

数据结构——算法和算法效率的度量

目录 一、引言 二、算法 1 算法的基本概念 2 算法的复杂度 2.1 时间复杂度 2.1.1 概念 2.1.2 大O的渐进表示 3 算法的空间复杂度 3.1 概念 3.2 实例 4 实例分析 5 结论 一、引言 大家在写代码的时候有没有发现写同样功能的代码有多种不同的写法&#xff0c;而不同的代…

Lab_ Finding and exploiting an unused API endpoint

https://portswigger.net/web-security/learning-paths/api-testing/api-testing-identifying-and-interacting-with-api-endpoints/api-testing/lab-exploiting-unused-api-endpoint# 查看功能点&#xff1a; 在Burp的HTTP history中发现 /api路径 我们先尝试一下将API请求…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮几何对象

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮对象 核心代码完整代码&#xff1a;在线示例 在研究 ArcGIS JSAPI RenderNode 高亮&#xff08;highlights&#xff09;FBO 的时候&#xff0c;实现了一下框选高亮几何对象&#xff0c;这里分享一下。 …

Python Pygments库:代码高亮的利器

更多Python学习内容&#xff1a;ipengtao.com Pygments是一个用于Python的强大语法高亮库。它支持多种编程语言和标记格式&#xff0c;能够将源代码转换为高亮格式的文本&#xff0c;使代码在阅读和展示时更加清晰易懂。Pygments广泛应用于博客、文档、代码编辑器和IDE中&#…

视频会员干货收藏

这个文章绝对价值几百块&#xff0c;可以省去你不少视频会员的钱。但还是建议大家支持正版。。。 只推荐货真价实的好东西&#xff0c;谁用谁知道。无论电影还是电视剧更新速度还是很快的&#xff0c;而且最重要的一点&#xff0c;你连注册都不用注册&#xff0c;直接看&#x…

宝兰德应用服务器软件通过保险业信息技术应用创新攻关实验室产品适配测试认证

近期&#xff0c;宝兰德中间件核心产品「应用服务器软件 V9.5.5」&#xff08;以下简称&#xff1a;应用服务器软件&#xff09;顺利通过了保险业信息技术应用创新攻关实验室产品适配测试。标志着宝兰德应用服务器软件符合信息技术产品适配要求&#xff0c;能够全面支持金融保险…

【网络基础1】

文章目录 学习目标一、网络基础11.网络的重要性2.osi7层模式3.协议和osi7层模型的关系4.数据的封装和解封装5.tcp的三次握手6.Ddos攻击讲解7.Tcp的四次挥手 二、网络基础21.文字编码2.IP地址的划分3.子网掩码4.同网段ip才能直接通信5.DNS解析6.DNS解析命令7.短域名为什么值钱8.…

项目工具|git相关

本博客暂时只作为个人资料&#xff0c;后续会进行完善&#xff0c;主要内容来自&#xff1a; 【【Git第一讲】&#xff1a;git分区与两个盒子的故事】 理解暂存区和未暂存区 git为什么要多一个暂存区&#xff1f;难道不能我把代码写完后就是未暂存区&#xff0c;然后直接提交…

mysql设置允许外部ip访问,局域网IP访问

&#xff08;支持MYSQL8版本&#xff09; 1. 登录进入mysql&#xff1b;mysql -uroot -p输入密码进入 2. 输入以下语句&#xff0c;进入mysql库&#xff0c;查看user表中root用户的访问 use mysql; select host,user from user; 3. 更新user表中root用户域属性&#xff0c…

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC&#xff08;Analogto-Digital Converter&#xff09;模拟数字转换器&#xff0c;是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号&#xff0c;单片机无法直接采集&#xff0c;此时需要ADC先将短租两端的电…

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…

SVNCloud 与 Navicat和IDEA的连接

文章目录 SVNCloud 配置Navicat访问云端数据库与IDEA Java jdbc 的连接 SVNCloud 配置 访问网址&#xff1a;SVN注册账号&#xff0c;进入mysql区域&#xff1a; 数据库管理->创建数据库&#xff0c;输入数据库名称和密码&#xff0c;注意&#xff0c;这里的数据库名称实际…

vue 如何制作一个跟随窗口大小变化而变化的组件

vue 如何制作一个跟随窗口大小变化而变化的组件 像下图中展示的那些统计数件就是跟随窗口变化而变化的&#xff0c;而且是几乎等比缩放的。 实现原理 只简略说一下原理。 pinia 中记录一个窗口变化的高度值给要变化的组件添加一个高度值组件内部所有关于长度距离的值都通过这…

笔记 | 软件工程04:软件项目管理

1 软件项目及其特点 1.1 什么是项目 1.2 项目特点 1.3 影响项目成功的因素 1.4 什么是软件项目 针对软件这一特定产品和服务的项目努力开展“软件开发活动",&#xff08;理解&#xff1a;软件项目是一种活动&#xff09; 1.5 软件项目的特点 1.6 军用软件项目的特点 2 …

水库安全监测系统:智慧水文动态监测系统

TH-SW2水库安全监测系统&#xff0c;作为一款智慧水文动态监测系统&#xff0c;其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术&#xff0c;为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…

matplotlib绘制三维曲面图时遇到的问题及解决方法

在使用 Matplotlib 绘制三维曲面图时&#xff0c;可能会遇到一些常见的问题。今天我将全程详细讲解下遇到问题并且找到应对方法的全部过程&#xff0c;希望能帮助大家。 1、问题背景 在使用 matplotlib 绘制三维曲面图时&#xff0c;遇到了一个问题。代码如下&#xff1a; im…