【MyBatis】源码学习 02 - Java 元注解以及 MyBatis @Param 注解分析
文章目录
- 前言
- 参考目录
- 学习笔记
- 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的基础上进行了简单改造。
与上篇一样,需要说明的是,书中使用的框架版本和本文(本专栏)使用的版本不一样。
| 名称 | 书中版本 | 专栏版本 |
|---|---|---|
| MyBatis | 3.5.2 | 3.5.11+ |
| Spring Boot | 2.X | 3.X |
| JDK | 8 | 17+ |
随着版本的升级迭代,会有一些内容不尽相同,需要结合着进行学习。
学习笔记
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 的执行过程,对于其他方法会在后续的章节中再展开说明。
(完)
相关文章:
【MyBatis】源码学习 02 - Java 元注解以及 MyBatis @Param 注解分析
文章目录前言参考目录学习笔记1、Java 注解1.1、Java 元注解1.2、Java ElementType 枚举值1.3、自定义注解2、Param 注解分析2.1、Param 注解2.2、测试方法2.3、流程分析(重点:ParamNameResolver)前言 本文内容对应的是书本第 7 章的内容&am…...
贪心算法-蓝桥杯
一、贪心算法的优缺点优点:1.容易理解:生活常见。2.操作简单:在每一步都选局部最优。3.效率高: 复杂度常常是O(1)的。缺点:1.局部最优不一定是全局最优。二、例子: 最少硬币问题硬币面值1、2、5。支付13元,要求硬币数量最少。贪心法: (1) 5元…...
zookeeper 复习 ---- chapter03
zookeeper 复习 ---- chapter03如何创建 zookeeper 对象 要求: 1:知道这几个构造参数 2:知道每一个参数的含义 ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) ZooKeeper(String connectString, int sessionTimeout…...
1.PostgreSQL
文章目录LIMITWITH 和RECURSIVEPostgreSQL 约束PostgreSQL AUTO INCREMENT(自动增长)PostgreSQL PRIVILEGES(权限)GRANT语法LIMIT SELECT * FROM COMPANY LIMIT 3 OFFSET 2;WITH 和RECURSIVE WITH RECURSIVE t(a,b) AS (VALUES (…...
buu [UTCTF2020]basic-crypto 1
题目描述: 01010101 01101000 00101101 01101111 01101000 00101100 00100000 01101100 01101111 01101111 01101011 01110011 00100000 01101100 01101001 01101011 01100101 00100000 01110111 01100101 00100000 01101000 01100001 01110110 01100101 00100000 0…...
火山引擎数智平台的这款产品,正在帮助 APP 提升用户活跃度
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 你有没有关注过 APP 给你推送的消息? 出于提升用户活跃度的考虑,APP 会定期在应用内面向用户进行内通推送,推送形式既包括 APP …...
记录每日LeetCode 2341.数组能形成多少数对 Java实现
题目描述: 给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤: 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数,形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标…...
Ant Design Chart词云图
什么是词云图?词云图,也叫文字云,是对网络文本中出现频率较高的“关键词”予以视觉上的突出,出现越多,显示的字体越大,越突出,这个关键词也就越重要。让浏览者通过词云图一眼就可以快速感知最突…...
mysql索引
索引 mysql索引: 在MySQL中,索引是存储引擎实现的,所以没有统一的索引标准,不同存储引擎的索引工作方式也不一样,也不是所有的存储引擎都支持所有类型的索引即使是多个存储引擎都支持同一种类型的索引,他…...
Java中怎样将数据对象序列化和反序列化?
程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化。对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序…...
ffmpeg filter的理解
ffmpeg filter的理解 filter的简介 从整体看,filte rgraph包含filter chain,而filter chain又包含了filter,所以可以分为是三个层次去理解。 filterfilter chainfilter graph filter graph是链接多个filter的有向图。它可以包含循环&#…...
炔活化的生物素化试剂773888-45-2,Alkyne-Biotin,炔基生物素
【产品描述】炔活化的生物素化试剂,可通过铜催化的点击反应与叠氮化物反应,产生稳定的三唑键,生物素炔烃在结构上与生物素炔烃相同。用于通过点击化学制备各种生物素化共轭物的生物素炔烃。Alkyne activated biotinylation reagents can prod…...
了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?
进行系统安全安排的专业人员非常了解“僵尸网络”一词。通常用于被劫持的计算机/系统链,如果指示恢复性和健壮的系统,则应很好地理解“僵尸网络”一词,因为它们的错误使用会导致巨大的混乱。 文章目录前言一、僵尸网络定义僵尸网络如何工作&a…...
大学生博主-14天学习挑战赛活动-CSDN
还在为写文没有流量发愁吗?还沉浸在假期中无法恢复状态吗?赶快来参与面向CSDN的大学生博主而举办的活动吧!本次活动为了避免刷量行为,也为了保持公平性,能够选出最优秀的文章,特意邀请了五位在C站具有一定影…...
如何自学芯片设计?
众所周知,芯片设计自学还是比较困难的,更不存在速成的。这里简单说一下学习的规划。 学会相应的知识 无论是科班毕业,还是理工科专业,想要入行IC,那就一定要具备相关的基础知识。尤其是在学校里,学习的很…...
通过中断控制KUKA机器人暂停与再启动的具体方法示例
通过中断控制KUKA机器人暂停与再启动的具体方法示例 中断程序的基本介绍: 当出现例如输入信号变化等事先定义的事件时,机器人控制器中断当前程序,并处理一个已定义好的子程序 由中断而调用的子程序称为中断程序 最多允许同时声明32个中断 同一时间最多允许有16个…...
pandas基本操作
df.head()/tail() 查看头/尾5条数据;df.info 查看表格简明概要;df.dtypes 查看字段数据类型;df.index 查看表格索引;df.columns 查看表格列名;df.values 以array形式返回指定数据的取值;list(dt.groupby(&q…...
论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
NeRF使用神经网络来表示场景。给定一个场景,输入该场景稀疏的视角图片,NeRF可以合成该场景新的视角的图片。 神经辐射场 神经辐射场(neural radiance field,NeRF)使用5D的向量值函数表示一个场景。 输入是连续的5D坐…...
花3个月面过京东测开岗,拿个20K不过分吧?
背景介绍 计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比较短(小于两个月),于是找的实习是在…...
Leetcode DAY 35:柠檬水找零and根据身高重建队列 and用最少数量的箭引爆气球
860.柠檬水找零 class Solution { public:bool lemonadeChange(vector<int>& bills) {int five 0;int ten 0;for(int i 0; i < bills.size(); i) {if(bills[i] 5) {five;} else if(bills[i] 10) {ten;five--;if(five < 0){return false;}} else {if(ten …...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...



