执行增删改查时获取SQL语句

news2024/11/24 22:47:34

查询为例
查询方法由SqlSessionTemplate中创建DefaultSqlSession,然后执行DefaultSqlSession的selectList方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后继续执行查询方法
执行executor.query方法,executor为CachingExecutor类型。

在这里插入图片描述

如果引入了pagehelper依赖,这里执行前会进入分页拦截器
在这里插入图片描述
关键方法是这个getBoundsql,就是通过这个方法获取到sql的。
在这里插入图片描述
BoundSql

public class BoundSql {
    // 一个完整的 SQL 语句,可能会包含问号 ? 占位符
    private final String sql;
    // 参数映射列表,SQL 中的每个 #{xxx} 占位符都会被解析成相应的 ParameterMapping 对象
    private final List<ParameterMapping> parameterMappings;
    // 运行时参数,即用户传入的参数,比如 Article 对象,或是其他的参数
    private final Object parameterObject;
    // 附加参数集合,用于存储一些额外的信息,比如 datebaseId 等
    private final Map<String, Object> additionalParameters;
    // additionalParameters 的元信息对象
    private final MetaObject metaParameters;
}

getBoundSql方法

  public BoundSql getBoundSql(Object parameterObject) {
  	//获取BoundSql 
    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
    //获取参数映射
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    if (parameterMappings == null || parameterMappings.isEmpty()) {
      boundSql = new BoundSql(configuration, boundSql.getSql(), parameterMap.getParameterMappings(), parameterObject);
    }

    // check for nested result maps in parameter mappings (issue #30)
    for (ParameterMapping pm : boundSql.getParameterMappings()) {
      String rmId = pm.getResultMapId();
      if (rmId != null) {
        ResultMap rm = configuration.getResultMap(rmId);
        if (rm != null) {
          hasNestedResultMaps |= rm.hasNestedResultMaps();
        }
      }
    }

    return boundSql;
  }

这里如果参数是${}这样的,就会走DynamicSqlSource类的getBoundSql
在这里插入图片描述
然后执行MixedSqlNode类apply方法把 ${}的内容替换成真实数据
传入的是原始sql
在这里插入图片描述
TextSqlNode类的apply方法
在这里插入图片描述
GenericTokenParser类的parse方法
在这里插入图片描述
关键方法
在这里插入图片描述
TextSqlNode类的handleToken方法
从context拿到值,根据传进来的key
在这里插入图片描述
这时拿到的sql就是完整的sql了
在这里插入图片描述

如果是#{}
则会走StaticSqlSource类的getBoundSql方法
在这里插入图片描述
执行完参数还是 问号?
在这里插入图片描述
然后继续执行查询方法,应该是在最终查询时将实际数据传入的。
继续CachingExecutor的query方法
在这里插入图片描述
然后执行BaseExecutor类的query方法
没有缓存的话去数据库查询

在这里插入图片描述
继续BaseExecutor类的queryFromDatabase方法
先把key放入缓存,然后继续执行doQuery方法

在这里插入图片描述
SimpleExecutor类的doQuery方法
在这里插入图片描述
关键方法 prepareStatement() 方法
SimpleExecutor类的prepareStatement方法
在这里插入图片描述
关键方法parameterize
就是这个方法给 ?赋的值
RoutingStatementHandler类的parameterize方法
在这里插入图片描述
DefaultParameterHandler类的setParameters方法

  public void setParameters(PreparedStatement ps) {
    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
    //从boundSql拿到参数的标识
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    if (parameterMappings != null) {
      for (int i = 0; i < parameterMappings.size(); i++) {
        ParameterMapping parameterMapping = parameterMappings.get(i);
        if (parameterMapping.getMode() != ParameterMode.OUT) {
          Object value;
          //拿到属性名
          String propertyName = parameterMapping.getProperty();
          if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
            value = boundSql.getAdditionalParameter(propertyName);
          } else if (parameterObject == null) {
            value = null;
          } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            value = parameterObject;
          } else {
          	//parameterObject就是传入的值
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            //根据key拿到value 这样就拿到了我们传入的值
            value = metaObject.getValue(propertyName);
          }
          TypeHandler typeHandler = parameterMapping.getTypeHandler();
          JdbcType jdbcType = parameterMapping.getJdbcType();
          if (value == null && jdbcType == null) {
            jdbcType = configuration.getJdbcTypeForNull();
          }
          try {
            // 由类型处理器 typeHandler 向 ParameterHandler 设置参数
            typeHandler.setParameter(ps, i + 1, value, jdbcType);
          } catch (TypeException | SQLException e) {
            throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
          }
        }
      }
    }
  }

至此,${} 和#{}的赋值就完成了,还需要分析的是《where》这种标签是怎么解析的,最后就是执行最终的查询了。
在这里插入图片描述
todo 查询后对结果进行解析

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

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

相关文章

【Android -- 开源库】数据库 Realm 的基本使用

简介 Realm 是一个 MVCC &#xff08;多版本并发控制&#xff09;数据库&#xff0c;由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库&#xff0c;目标是取代 SQLite。Realm 本质上是一个嵌入式数据库&#xff0c;他并不是基于 SQLit…

论文笔记:Model-ContrastiveFederatedLearning

0 简介 论文&#xff1a;Model-ContrastiveFederatedLearning 代码&#xff1a;https://github.com/QinbinLi/MOON 相关链接&#xff1a;本文主要是将SimCLR对比学习的思想迁移到联邦学习中&#xff0c;关于SimCLR的介绍见https://blog.csdn.net/search_129_hr/article/detail…

云计算主要学些什么技术内容?零基础能学会吗?

云计算主要学些什么技术内容&#xff1f;零基础能学会吗&#xff1f; 随着信息技术的不断发展&#xff0c;云计算作为一种新兴的技术&#xff0c;在当今社会中起到了越来越重要的作用&#xff0c;尤其是在数字化发展领域&#xff0c;不管是传统企业还是新经济领域&#xff0c;人…

Arthas--ognl表达式

背景 arthas执行ognl表达式&#xff0c;获取对应的jvm对象数据。ognl学习&#xff0c;可以查看上篇&#xff1a;https://xiaopanjia.blog.csdn.net/article/details/130425414 基本语法 ognl express -c {hashCode} --classLoaderClass {当前的全路径 ClassLoader 信息} -x …

windbg查看64位dump文件踩过的坑:没有二进制文件导致堆栈异常

项目上线了64位的软件&#xff0c;发现dump解析时堆栈不全&#xff0c;很多奇怪的地址&#xff1a; 64位只有pdb&#xff0c;没有二进制文件&#xff1a; 64位有pdb&#xff0c;也有二进制文件&#xff1a; 64位的这个问题把二进制文档和pdb放在一起就正常了。32位的发现没有…

不停机修复mysql主从数据同步错误导致服务器磁盘占满问题

事情的现象&#xff1a; 线上生产环境mysql服务器采用主从结构。突然告警从库服务器磁盘占用高。经过磁盘空间检查&#xff0c;主要是/mysql/data目录使用100%&#xff08;直接占满了&#xff09;&#xff0c;进入目录后发现被文件slave-relay-bin.*系列文件占满了。常理数据不…

28.Mybatis的入门

目录 一、Mybatis。 &#xff08;1&#xff09;Mybatis的简介。 &#xff08;2&#xff09;Mybatis的快速入门。 &#xff08;2.1&#xff09;快速入门。 &#xff08;2.2&#xff09;UserMapper.xml文件。 &#xff08;2.3&#xff09;sqlMapConfig.xml文件。 &#…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(一)

3.1 系统需求分析 3.1.1 系统功能设计要求 本硬件处理平台的主要任务有三类&#xff0c;一是数据采集&#xff0c;包括采集惯性测量元件 的输出信号&#xff0c;接收外部系统校正信息&#xff0c;如 GPS 信息等&#xff1b;二是数据处理与计算&#xff0c;包 括惯性测量…

分享一个CSS的垂帘效果

先上效果图&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>html, body, canvas {-webkit-user-select: none;-moz-user-select…

[JAVA]前后端分离智慧校园电子班牌系统源码微信带小程序

1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 后端框架&#xff1a;Spring boot 4. 前端框架&#xff1a;VUE2 5. 电子班牌&#xff1a; Android 7.1 6. 小程序&#xff1a;原生语言开发 7. 多学校Saas 模式 在大数据平台下&#xff0c;对应用系统进行统…

研报精选230428

目录 【行业230428华安证券】环保行业框架分析 【个股230428华西证券_视源股份】收入表现优于行业&#xff0c;平板盈利提升 【个股230428中银证券_长海股份】23Q1业绩承压&#xff0c;行业库存、出口现好转信号 【个股230428国信证券_星宇股份】一季度归母净利润环比增长9%&am…

Web3 游戏全景图:各类玩家群像解读

作者&#xff1a;lesleyfootprint.network 主要观点 即使市场深陷寒冬&#xff0c;但 web3 游戏每天依然有八十万的用户。 Web3 游戏正在逐步完善&#xff0c;从 DeFi 演变出的 Web3 游戏 &#xff0c;到增强了叙事的 X2E&#xff0c;再到 AAA 游戏和元宇宙。 未来&#xff…

同为科技(TOWE)科普与雷电相关的基本知识

前 言 雷电是伴有闪电和雷鸣的放电现象&#xff0c;壮观而又有点令人生畏。雷电一般产生于对流发展旺盛的积雨云中&#xff0c;常伴有强烈的阵风和暴雨&#xff0c;有时还伴有冰雹和龙卷风。夏季雷电时有发生&#xff0c;虽然常见&#xff0c;但你真的了解雷电吗&#xff1f;这…

停车场管理系统的设计与实现_kaic

目 录 1 概 述 1.1研究背景 1.2研究现状 1.3研究内容 2 相关技术简介 2.1 JSP技术 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 3 系统需求分析 3.1 系统可行性分析 3.1.1 操作可行性 3.1.2 经济可行性 3.1.3 技术可行性 3.2 系统性能分析 3.3系统流程分析 3.3.1注册流程 3.3.…

关于Prompt Engineering你该了解啥?OpenAI应用研究负责人帮你梳理了

‍来源 | 机器之心 微信号&#xff1a;almosthuman2014 随着 ChatGPT、GPT-4 等模型的兴起&#xff0c;人们对如何创建提示以获得想要的输出越来越感兴趣。研究者对特定提示的响应可能很难预测&#xff0c;并且会因模型的不同而不同。本文来自 OpenAI 的翁丽莲&#xff08;Lili…

【C语言】深度剖析数据在内存中的存储

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 数据类型介绍 1.1 类型的基本归类 2.整型在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 练习 2.3.1 练习1 2.3.2 练习2 3.2.3 练习3 2.3.4 练习4 2.3.5 练习5 2.3.6 练习6 2.3.7 练习7 …

linux jstat 简介

本文目录一览&#xff1a; 1、Linux使用jstat命令查看jvm的GC情况2、linux怎么监控 jvm内存 jstat3、Linux系统监控要用到哪些命令4、linux上如何安装jstatd服务 Linux使用jstat命令查看jvm的GC情况 Linux 使用jstat命令查看jvm的GC情况 命令格式 jstat命令命令格式&#…

【Linux】3. 基本权限与文件指令

1. 用户概念 sudo提权配置 2. 权限的定义 3. 文件权限 角色和文件属性是一一对应的关系&#xff1a; 拥有者-所属组-其他人 rwx - rwx - rwx 4. 文件类型 5. chmod 修改文件属性 6. chown/chgrp 修改文件所属角色 7. umask 8. file指令 9. 目录的权限 10. 粘滞位 首先要明确…

Arduino ESP8266 基于本地搭建MQTT服务运行

Arduino ESP8266 基于本地搭建MQTT服务运行 📌相关篇《Arduno ESP8266接入OneNET实时显示DHT11数据》 🔨本地架设MQTT服务端软件:EMQX:https://www.emqx.io/zh/downloads?os=Windows - 🔧MQTT本地客户端软件:mqttx:https://mqttx.app/ 📺服务端接收设备段上传的数据…

人群计数:技术难点、商业产品化成功案例、现状、传统做法、硬件设备、

现状&#xff1a; 比较成熟了&#xff0c;准确率已经很高了&#xff08;有多高&#xff0c;后面我搞懂metrics高到什么程度&#xff0c;再汇报过来&#xff09; 商业公司基本把这个领域做的很透彻了&#xff0c;performance基本到了一一个无法提高的位置了&#xff08;和图像…