【MyBatis】源码学习 02 - Java 元注解以及 MyBatis @Param 注解分析

news2024/11/16 23:34:51

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1、Java 注解
      • 1.1、Java 元注解
      • 1.2、Java ElementType 枚举值
      • 1.3、自定义注解
      • 2、`@Param` 注解分析
      • 2.1、`@Param` 注解
      • 2.2、测试方法
      • 2.3、流程分析(重点:`ParamNameResolver`)

前言

本文内容对应的是书本第 7 章的内容,主要是关于Java 元注解以及 @Param 注解的分析。

参考目录

  • 《通用源码阅读指导书:MyBatis源码详解》
    本文主要内容来自 第7章 annotations包与lang包
  • 《通用源码阅读指导书——MyBatis源码详解》配套示例
    书中涉及的 Demo 示例,本文示例在 Demo1 的基础上进行了简单改造。

与上篇一样,需要说明的是,书中使用的框架版本和本文(本专栏)使用的版本不一样。

名称书中版本专栏版本
MyBatis3.5.23.5.11+
Spring Boot2.X3.X
JDK817+

随着版本的升级迭代,会有一些内容不尽相同,需要结合着进行学习。

学习笔记

1、Java 注解

1.1、Java 元注解

在这里插入图片描述

两处划红色虚线的位置是我做了想法标注,由于作者使用的 JDK 版本并不是最新的,因此和现在的有差异,下面来说明一下。

Java中一共有 七个 元注解,分别是@Documented@Target@Retention@Inherited@Repeatable@Native@ContentType

  • @Native:这个注解用于标记一个方法是本地方法(native method)。本地方法是由非 Java 代码实现的方法,通常是用 C 或 C++ 等语言编写的。使用本地方法可以实现与Java虚拟机之外的底层系统或资源的交互。在声明本地方法时需要使用该注解,同时还需要在本地方法中使用 JNI(Java Native Interface)来和非 Java 代码交互。
  • @ContentType:用于指定注解所表示的内容类型,例如时间跨度或频率。

在这里插入图片描述

在这里插入图片描述

1.2、Java ElementType 枚举值

这里是引用

在 JDK 17 中,又多了两种枚举值 MODULE 以及 RECORD_COMPONENT

具体查看源码可知:
在这里插入图片描述

在这里插入图片描述

和 ChatGPT 唠了一下关于这两者:
在这里插入图片描述

1.3、自定义注解

关于自定义注解,书中有进行举例说明。

结合前面学习的内容,本文以前几篇文章中分析 RuoYi-Vue-Plus 框架中的自定义注解 @Translation 为例对元注解的使用进行简单说明:
在这里插入图片描述

2、@Param 注解分析

完成了对 Java 注解的基本了解之后,书中对 MyBatis 自定义注解 @Param 注解进行了分析,并结合代码分析了关于 Mapper 接口中定义的参数进行解析的过程。

2.1、@Param 注解

在这里插入图片描述

2.2、测试方法

参照书中的举例,结合 Demo1 进行了一些改造,其他不变,重点是观察 Mapper 接口的参数解析过程。

在这里插入图片描述

2.3、流程分析(重点:ParamNameResolver

Debug 过程如下:
在这里插入图片描述

在这里插入图片描述

MapperProxy#invoke
在这里插入图片描述

此方法是最终执行 SQL 查询的主要方法。参数的解析方法在第一步 cachedInvoker(method) 时完成。

MapperProxy#cachedInvoker
在这里插入图片描述

MapperMethod#MapperMethod
在这里插入图片描述

创建映射方法,创建 SQL 命令以及方法签名 MethodSignature

MethodSignature#MethodSignature
在这里插入图片描述

该方法的最后会创建一个参数名称解析器 ParamNameResolver,也是@Param 注解能够生效的原因所在。

ParamNameResolver#ParamNameResolver
在这里插入图片描述

这里是引用

由于测试方法中第二个参数没有标注注解,来看下它的参数名实际上是什么:
在这里插入图片描述

在这里插入图片描述

最终完成三个参数参数名称的解析:
在这里插入图片描述

所有的名称会被存在 names 中:
在这里插入图片描述

回到上一级完成了方法签名的创建:
在这里插入图片描述

最终返回到 invoke 方法执行 SQL 语句。
在这里插入图片描述

本章节的重点是分析参数名称解析器 ParamNameResolver 的执行过程,对于其他方法会在后续的章节中再展开说明。

(完)

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

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

相关文章

Java文件操作和I/O

Java 流(Stream)、文件(File)和IOJava.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源…

Python 自己简单地造一个轮子.whl文件

造轮子引言准备文件原始文件打包轮子文件运行验证引言 平时使用的python第三方库很顺手,这第三方库一般都是大家一起努力的结果,那我们是不是也可以贡献一点力量呢?首先从造一个本地的.whl文件开始。 在python中,引用第三方库时…

AI算法创新赛-人车目标检测竞赛总结02

源码目录--AI0000026/ --models/ #存放原始模型文件 --scripts/ #存放模型编译、量化所用到的命令脚本,标签格式转换的脚本。 --data/ #存放B榜数据集102张图片 --bmodel/ #存放编译或量化生成的xxx.bmodel --test/ #存放执行推理的代码,会调用bmodel/中…

CAD二次开发 添加按钮Ribbon

这篇文章是教大家怎样子创建自己的Ribbon按钮界面(如下图),以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮(如下图) 理解Ribbon、Panel、Tab的关系(如下图)&#xff…

输入任意多个整数, 把这些数据保存到文件data.txt中.(按ctrl + z)

#pragma once #include <iostream> #include <fstream> using namespace std; /* 输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl z) [每行最多保存10个整数] */ int main() { …

Kafka的日志同步

首先介绍下LEO和HW LEO&#xff1a; 即LogEndOffset&#xff0c;表示该副本下次日志记录的偏移量HW&#xff1a;即HighWatermark&#xff0c;高水位线&#xff0c;是所有ISR副本集合中的LEO最小值上图中&#xff0c;如果此时三个副本都在ISR集合中&#xff0c;那么此时他们的LE…

三次握手和四次挥手

文章目录TCP三次握手为什么要三次握手三次握手可以携带数据吗&#xff1f;三次握手失败&#xff0c;服务端会如何处理?ISN代表什么&#xff0c;意义&#xff0c;何要动态随机什么是半连接队列第2次握手传回了ACK&#xff0c;为什么还要传回SYN&#xff1f;为什么要四次挥手TCP…

DeepSort:论文翻译

文章目录摘要1、简介2、利用深度关联度量进行排序2.1、轨迹处理和状态估计2.3、匹配的级联2.4、深度外观描述符3、实验4、结论论文链接&#xff1a;https://arxiv.org/pdf/1703.07402.pdf摘要 简单在线实时跟踪(SORT)是一种实用的多目标跟踪方法&#xff0c;专注于简单、有效的…

PFU扫描仪将于2023年4月切换至理光品牌上

目前&#xff0c;株式会社PFU (以下简称“PFU”)在村上清治社长的带领下&#xff0c;正将其在全球拥有庞大市场份额的图像扫描仪从富士通品牌变更为理光品牌&#xff0c;涉及产品线包括fi系列、SP系列和ScanSnap系列。2022年9月1日完成公司股权转让后&#xff0c;PFU正式加入理…

【STM32笔记】低功耗模式下GPIO省电配置避坑实验(闲置引脚配置为模拟输入其实更耗电)

【STM32笔记】低功耗模式下GPIO省电配置避坑实验&#xff08;闲置引脚配置为模拟输入其实更耗电&#xff09; 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用、低功耗模式无法烧录解…

ReportBuilder Enterprise Edition 22.0 Crack

Report Builder 的主要目的是为用户和开发人员提供全面的覆盖范围以及现有的替代方案。这个目标被认为是通过提供视觉、无障碍的答案来实现的&#xff0c;它是所有可用的四个区域。Report Builder 和报表设计器的屏幕截图能够表明它具有的用户界面符合人体工程学的布局。与 Rep…

WebDAV之π-Disk派盘+Piktures

Piktures支持WebDAV方式连接π-Disk派盘。推荐一款简单易用&#xff0c;功能超级强大的智能相册应用。Piktures智能相册是一款简单易用&#xff0c;功能超级强大的智能相册应用&#xff0c;它不仅可以访问本地和云照片&#xff0c;还可以照片编辑器&#xff0c;而且它同时还是一…

Mysql常用函数大全

本篇文章讲解是是MySQL的函数方法&#xff0c;涵盖所有的MySQL常见的方法。下面是本篇文章的目录结构&#xff0c;可以根据自己需求点击右方目录查找&#xff1a; 目录 &#xff08;一&#xff09;数字函数 &#xff08;二&#xff09;字符串函数 &#xff08;三&#xff0…

[ vulhub漏洞复现篇 ] Drupal<7.32 Drupalgeddon SQL注入漏洞(CVE-2014-3704)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Redis常用数据结构及应用场景

1.总体结构 Redis中的数据&#xff0c;总体上是键值对&#xff0c;不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型&#xff0c;它是key对应的一个单一值。二进制安全&#xff0c;不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…

【JMeter】【Mac】如何在Mac上打开JMeter

平常我们在Windows电脑里打开JMeter&#xff0c;只要双击JMeter.bat即可打开&#xff0c;那我换了Mac后&#xff0c;该怎么打开JMeter呢 一、命令行打开JMeter 1、打开JMeter路径 cd /Users/work/apache-jmeter-5.2/bin 2、运行JMeter sh jmeter 3、如果涉及到一些权限无…

企业多会场视频直播(主会场、分会场直播)实例效果

阿酷TONY 2023-2-16 长沙 活动直播做多会场切换功能&#xff08;主会场、分会场、会场一、会场二、会场三自由切换&#xff09; 企业多会场视频直播&#xff08;主会场、分会场直播&#xff09;实例效果 特点&#xff1a;支持PC端&#xff0c;也支持移动端观看&#xff0c;会…

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ESP32-C2开发板

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…

react-redux

Redux 是js容器&#xff0c;用于进行全局的 状态管理它可以用在react, angular, vue等项目中, 但基本与react配合使用三大核心&#xff1a; 单一数据源 整个应用的state被存储在一棵 object tree中&#xff0c;并且这个 object tree只存在于一个唯一的 store 中 State是只读的…