Mybatis源码分析:MapperMethod中内部静态类MethodSignature的作用

2023-11-13

MethodSignature分析

  MethodSignature为MapperMethod类提供了三个作用,获取待执行方法中的参数和@Param注解标注的参数名,获取标注有@MapKey的参数(@Mapkey作用在后续会讲到),方法的返回类型,获取SELECT操作时必要的标志位。以下是MethodSignature的所有属性。

  • private final boolean returnsMany;//是否多值查询
  • private final boolean returnsMap;//是否map查询
  • private final boolean returnsVoid;//是否void查询
  • private final boolean returnsCursor;//是否游标查询
  • private final Class<?> returnType; //返回类型
  • private final String mapKey;//获取mapKey的值
  • private final Integer resultHandlerIndex;
  • private final Integer rowBoundsIndex;
  • private final ParamNameResolver paramNameResolver; //参数解析器

  观察下列的代码,构造器首先获取返回类型,这个值通过类型参数解析器来获取入参mapperInterface本身及所有的父类和所有的接口来查找所要返回的类型,Mybatis提供了三种类型实现ParameterizedType,TypeVariable,GenericArrayType。通过返回的类型值来判定后续的SElECT将要做哪种查询,void查询,Map查询,游标查询,多值查询,这里就会给相关的属性进行打标,在mapperMethod执行exeute()方法时便会进行判断。构造器还会检查待执行的Mapper方法是否标注有@Mapkey的注解,如果有这意味着返回的结果类型是一个Map。

 1    public MethodSignature(Configuration configuration, Class<?> mapperInterface, Method method) {
 2         //解析返回的类型 ParameterizedType,TypeVariable,GenericArrayType
 3       Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, mapperInterface);
 4       if (resolvedReturnType instanceof Class<?>) {
 5         this.returnType = (Class<?>) resolvedReturnType;
 6       } else if (resolvedReturnType instanceof ParameterizedType) {
 7         this.returnType = (Class<?>) ((ParameterizedType) resolvedReturnType).getRawType();
 8       } else {
 9         this.returnType = method.getReturnType();
10       }
11       this.returnsVoid = void.class.equals(this.returnType);
12       //是否是集合或者数组类型
13       this.returnsMany = configuration.getObjectFactory().isCollection(this.returnType) || this.returnType.isArray();
14       //判断是否是游标类型
15       this.returnsCursor = Cursor.class.equals(this.returnType);
16       //获取MapKey注解
17       this.mapKey = getMapKey(method);
18       //判断mapkey是否不为NULL
19       this.returnsMap = this.mapKey != null;
20       this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class);
21       this.resultHandlerIndex = getUniqueParamIndex(method, ResultHandler.class);
22       //初始化参数名解析器
23       this.paramNameResolver = new ParamNameResolver(configuration, method);
24     }

 

转载于:https://www.cnblogs.com/zhengzuozhanglina/p/11223568.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis源码分析:MapperMethod中内部静态类MethodSignature的作用 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • 初识Node.js与内置模块

    目录 1 初识 Node js 1 1 回顾与思考 1 2 Node js 简介 1 3 Node js 环境的安装 2 fs 文件系统模块 2 1 什么是 fs 文件系统模块 2 2 读取指定文件中的内容 2 3 向指定的文件中写入内容
  • MyCAT简易入门

    MyCAT简易入门 MyCAT是mysql中间件 前身是阿里大名鼎鼎的Cobar Cobar在开源了一段时间后 不了了之 于是MyCAT扛起了这面大旗 在大数据时代 其重要性愈发彰显 这篇文章主要是MyCAT的入门部署 一 安装java 因
  • 印度 SaaS 的崛起

    引言 云创新作为全球范围的努力已超过二十年 改变了整个行业 现在 印度正在成为一个新兴的全球领导者 推动了技术创新和显著的企业家精神 SaaS在全球范围内继续加速发展 因为各行业和企业都在向云上转移 随着数字化持续增长 印度成立的SaaS初
  • qgis 3.30 python二次开发环境搭建,一遍过教程

    qgis 3 30 python二次开发环境搭建 一遍过教程 1 使用mamba加速conda下载qgis 2 创建qgis虚拟环境 3 设置环境变量 4 测试代码 5 qgis库代码提示 6 参考链接和推荐链接 1 使用mamba加速co
  • JVM 字节码从入门到精通

    小册介绍 也许你写了无数行代码 会用很多炫酷的语法糖和高级的框架 但你未必了解这些高级语言背后的执行过程 即使对于一名经验丰富的 Java 程序员 在阅读 Java 字节码的时候也会感到很枯燥 我们为什么需要深入了解如此底层的信息呢 0x0
  • 《数智碳中和》白皮书发布以数智技术助力关键相关方实现碳达峰碳中和

    实现碳达峰 碳中和是一场广泛而深刻的经济社会系统性变革 促进能源转型升级成为实现双碳战略目标所需的重要一环 政府监管部门 能源生产企业 能源输送企业 能源消费用户及金融投资机构是实现双碳目标的关键力量 也是参与全国碳市场的重要主体 他们将以
  • Visual Studio 出现warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。 解决方案 转载的文章

    问题 Visual Studio 出现warning C4819 该文件包含不能在当前代码页 936 中表示的字符 请将该文件保存为 Unicode 格式以防止数据丢失 解决方案 1 修改字符编码格式 推荐 Visual Studio提供高
  • 从类声明中探索Qt的UI组合开发模式-组合模式

    引言 在使用Qt的的的的的开发引用程序的时候 有的会用UI设计师来设计UI界面 有的则的英文直接在代码中写 那么那种好呢 笔者认为使用UI设计师是最好的 尽管会生成许多多余的代发 Qt的的组合开发模式 Qt的这样的设计是一种MVC的逻辑 可
  • 关于iostat中await的理解

    关于iostat中await的理解 await 每个I O平均所需的时间 rd ticks wr ticks rd ios wr ios 不仅包括硬盘设备处理I O的时间 还包括了在kernel队列中等待的时间 rd ticks 读操作消耗
  • linux 6中4T磁盘识别并分区格式化挂接

    存储端划分4T的LUN后 主机端操作如下 1 主机识别 本例中hba卡的端口是host11和host12 root db1 echo gt sys class scsi host host11 scan root db1 echo gt s
  • Netlink 内核实现分析(一):创建

    http blog csdn net luckyapple1028 article details 50839395 Netlink 是一种IPC Inter Process Commumicate 机制 它是一种用于内核与用户空间通信的机
  • Resnet 18网络模型

    1 残差网络 Resnet 残差块 让我们聚焦于神经网络局部 如图左侧所示 假设我们的原始输入为x 而希望学出的理想映射为f x 作为上方激活函数的输入 左图虚线框中的部分需要直接拟合出该映射f x 而右图虚线框中的部分则需要拟合出残差映射
  • Canalys 2020Q2报告:百度智能云稳坐第一阵营 AI打造差异化竞争力

    在AI新基建领域的持续布局下 百度智能云站稳中国云市场第一阵营 9月9日消息 据英国调研机构Canalys发布的2020年第二季度中国基础云市场报告显示 中国云计算市场整体规模达43亿美金 同比增长70 突破新纪录 其中 头部四家厂商市场占
  • 手机热点总是正在连接服务器,电脑连接手机热点无法上网的三种解决方法

    电脑连接手机热点无法上网的三种解决方法 方法一 网络诊断 右键点击通知栏的网络图标 打开网络和共享中心 如图所示 在网络和共享中心 找到所连接的手机网络热点并点击它 如图所示 点击 诊断 功能 诊断网络无法连接的问题 如图所示 系统的网络诊
  • 网络分层模型

    OSI七层模型 物数网传会表应 物理层 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流 就是由1 0转化为电流强弱来进行传输 到达目的地后再转化为1 0 也就是我们常说的数模转换与
  • 性能综述方法论

    性能问题和Bug不同 后者的分析和解决思路更清晰 很多时候从应用日志 文中的应用指分布式服务下的单个节点 即可直接找到问题根源 而性能问题 其排查思路更为复杂一些 对应用进行性能优化 是一个系统性的工程 对工程师的技术广度和技术深度都有所要
  • fiery服务器不显示,fiery服务器打印设置

    fiery服务器打印设置 内容精选 换一换 在创建数据库连接之后 才能使用它来执行SQL语句操作数据 JDBC提供了三个方法 用于创建数据库连接 DriverManager getConnection String url DriverMa
  • 矩阵的秩与行列式的几何意义

    这里首先讨论一个长期以来困惑工科甚至物理系学生的一个数学问题 即 究竟什么是面积 以及面积的高维推广 体积等 1 关于面积 一种映射 大家会说 面积 不就是长乘以宽么 其实不然 我们首先明确 这里所讨论的面积 是欧几里得空间几何面积的基本单
  • spring boot jar部署 控制台 日志 乱码

    spring boot jar部署 控制台 日志 乱码 问题描述 spring boot jar包部署 通过java jar 命令运行 jar文件 代码中通过变量log输出到控制台的中文 乱码 但是仅仅是在运行jar时才乱码 而在用ecli
  • Mybatis源码分析:MapperMethod中内部静态类MethodSignature的作用

    MethodSignature分析 MethodSignature为MapperMethod类提供了三个作用 获取待执行方法中的参数和 Param注解标注的参数名 获取标注有 MapKey的参数 Mapkey作用在后续会讲到 方法的返回类型