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 firstpropertiesElement(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 #631environmentsElement(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>标签来开启

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

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

相关文章

初识volatile

volatile&#xff1a;可见性、不能保证原子性(数据不安全)、禁止指令重排 可见性&#xff1a;多线程修改共享内存的变量的时候&#xff0c;修改后会通知其他线程修改后的值&#xff0c;此时其他线程可以读取到修改后变量的值。 指令重排&#xff1a;源代码的代码顺序与编译后字…

基于STM32开发的智能空气质量监控系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 目录 引言环境准备智能空气质量监控系统基础代码实现&…

三十七篇:大数据架构革命:Lambda与Kappa的深度剖析

大数据架构革命:Lambda与Kappa的深度剖析 1. 引言 在这个数据驱动的时代,我们面临着前所未有的挑战和机遇。随着数据量的爆炸性增长,传统的数据处理方法已无法满足现代业务的需求。大数据处理不仅涉及数据量的增加,还包括数据类型的多样化、数据来源的广泛性以及对实时数据…

Policy-Based Reinforcement Learning(1)

之前提到过Discount Return&#xff1a; Action-value Function &#xff1a; State-value Function: &#xff08;这里将action A积分掉&#xff09;这里如果策略函数很好&#xff0c;就会很大&#xff1b;反之策略函数不好&#xff0c;就会很小。 对于离散类型&#xff1a; …

深度学习之文本分类模型-基于transformer

1、transformer transformer就是大名鼎鼎的论文《Attention Is All You Need》[1]&#xff0c;其在一些翻译任务上获得了SOTA的效果。其模型整体结构如下图所示 encoder和decoder 其整体结构由encoder和decoder组成&#xff0c;其中encoder由6个相同的block组成&#xff0c;…

【设计模式】结构型-桥接模式

当抽象与实现&#xff0c;各自独立&#xff0c; 桥接模式&#xff0c;如彩虹桥&#xff0c;连接两岸。 文章目录 一、类爆炸与代码重复二、桥接模式三、桥接模式的核心组成四、运用桥接模式五、桥接模式的应用场景六、小结推荐阅读 一、类爆炸与代码重复 场景假设&#xff1a…

单片机嵌入式计算器(带程序EXE)

单片机嵌入式计算器 主要功能&#xff1a;完成PWM占空比计算&#xff0c;T溢出时间&#xff08;延时&#xff09;&#xff1b; [!NOTE] 两个程序EXE&#xff1b; [!CAUTION] 百度网盘链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1VJ0G7W5AEQw8_MiagM7g8A?pwdg8…

代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0 )return true;if(t.size()0)return false;vector<vector<int>> dp(s.size(…

为什么选择海外服务器?

如何选择跨境电商服务器&#xff1a;详细指南 选择合适的服务器是跨境电商企业成功的基础。服务器的性能和稳定性直接影响着网站的访问速度、用户体验和安全性&#xff0c;进而影响着企业的销量和利润。那么&#xff0c;跨境电商企业该如何选择服务器呢&#xff1f; ​​​​​…

Jenkins构建 Maven项目(微服务)并自动发布

前面讲了docker 安装Jenkins和gitlab代码管理工具&#xff0c;接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins&#xff0c;其自带有jdk&#xff0c;…

oracle 12.1 rac to rac adg(maa)搭建保姆级教程

目录 资源配置 一、主库集群操作 1.主库增加standbylog 2.主库开启force logging及归档 3.主库配置参数 4.生成参数文件并将参数文件、密码文件拷贝至备库 4.1参数文件处理 4.2密码文件处理 二、备库操作 1.备库修改参数文件 1.1创建adump目录并在参数文件修改&#…

02-JAVA面向对象编程

一、面向对象编程 1、面向过程编程思想&#xff08;Process Oritented Programming&#xff09; 将实现一个功能的一组指令组合在一起&#xff0c;成为一个函数。这个函数就能实现这一个功能&#xff0c;是对功能实现的一种抽象。通过这种抽象方式&#xff0c;将代码实现复用。…

代码随想录算法训练营第三十一天| 455.分发饼干,376. 摆动序列 ,53. 最大子序和

455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g); //递增Arrays.sort(s); int result 0;//遍历&#xff0c;先满足小的int i0,j0;for(;i<g.length && j<s.length;i){…

视觉大模型(VLLM)学习笔记

视觉多模态大模型&#xff08;VLLM&#xff09; InternVL 1.5 近日&#xff0c;上海人工智能实验室 OpenGVLab 团队、清华大学、商汤科技合作推出了开源多模态大语言模型项目InternVL 1.5&#xff0c;它不仅挑战了商业模型巨头例如 GPT-4V 的霸主地位&#xff0c;还让我们不禁…

golang基础

Go安装及配置环境 下载最新的 zip 文件: go#.#.#.windows-amd64.zip &#xff0c;这里的 #.#.# 是 Go 的最新版本号。 解压缩 go#.#.#.windows-amd64.zip 文件到你选择的位置。比如D:\Go 在系统中设置两个环境变量&#xff1a;GOROOT和GOPATH GOPATH 指向的是你的工作目录。…

树莓派4B 零起点(三) 树莓派 VNC 远程桌面配置(2) 配置X11模式

目录 一、配置 VNC Server为X11 1、关闭已启动的VNC Server (如之前未开启&#xff0c;此步可以忽略) 2、切换 VNC Server的模式为 X11 二、开启 X11 VncServer 三、修改树莓派VNC Server的连接模式 1、切换到 root 账号 2、修改VNC Server X11的配置 3、设置VNC密码…

引人入胜的教育视频

对于一家专注于数字自动化和能源管理的跨国公司&#xff0c;我们制作了引人入胜的教育视频&#xff0c;帮助房主选择适合他们需求的电气产品。我们的团队审查并定稿文本&#xff0c;录制并编辑配音&#xff0c;选择背景音乐&#xff0c;设计图形&#xff0c;并制作了演示如何安…

MYSQL基础_02_MySQL环境搭建

第02章_MySQL环境搭建 1. MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现…

Springboot校园美食推荐系统的开发-计算机毕业设计源码44555

摘要 随着人们生活水平的提高&#xff0c;人们对美食的要求也越来越高&#xff0c;对各类美食信息需求越来越大。因此&#xff0c;结合计算机快速发展、普及&#xff0c;在此基础上制作一个页面简单、美观,功能实用的校园美食推荐系统势在必行&#xff0c;满足用户分享美食的需…

前端nvm的安装和使用nodejs多版本管理2024

nvm的安装和使用 1、简介 nvm是一个管理nodejs版本的工具。在实际的开发中&#xff0c;项目的开发依赖需要的nodejs版本运行环境不同&#xff0c;此时我们就需要使用nvm来进行不同nodejs版本的切换。其实就是一个方便的node版本管理工具。 注意&#xff1a;如果有安装过node&a…