MyBatis参数传递(提供ParamNameResolver类来进行参数封装)源码分析

news2024/11/25 1:47:34

MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式。

单个参数:实体类、Map集合、Collection、List、Array以及其他类型。

多个参数:Param注解定义的名称要与sql语句中参数占位符中的名称相同。

 这里就引入了一个问题:为什么需要Param注解,以及使用Param注解时参数是如何进行传递的?那么就需要对MyBatis底层对于这些参数进行不同的封装处理方式进行深刻的理解。

MyBatis提供了ParamNameResolver类来进行参数封装参数封装,下面进入源码进行分析:

1.首先先看一下多个参数是如何进行传递的:

先准备一个UserMapper类的查询方法:

UserInfo select(@Param("username") String username, @Param("password") String password);

准备一个UserMapper.xml中的sql:

<select id="select" resultType="model.UserInfo">
    select * from tb_user where username=#{username} and password = #{password}
</select>

关于多个参数的传递,其实是封装为Map集合的:

map.put(“arg0”,参数值1);

map.put(“param1”,参数值1);

map.put(“arg1”,参数值2);

map.put(“param2”,参数值2);

其实也就是说在sql中我们可以通过arg0、arg1、param1、param2等来获取对应的参数。

首先,不加param注解的时候,这个时候运行会报错,但是我们可以看到一些提示信息:

意思就是说,当前传递的参数没有获取到,目前能够获取的参数有[arg1, arg0, param1, param2]这四个。接下来把sql中占位符的参数改成arg0和arg1,此时运行成功。同理,占位符的参数改成param1和param2,也是能够运行成功的。 

 接下来,我们看一下ParamNameResolver类的源码,里面有一个getNamedParams方法:通过断点调试的方法我们能够清晰看到整个过程:(这里具体过程不赘述,只看结果)

 分析结果就是,咱们其实是可以用arg0、arg1、param1、param2等来获取对应的参数,但是不推荐,因为当多个参数进行传递时,使用这种方式会让代码可读性非常差。推荐使用@Param注解来定义参数名称。使用@Param注解其实就是替换了map集合中的arg的键名,param的键名是不变的,下面代码演示能够说明问题。

 

 

2.现在看一下单个参数是如何进行传递的:

1.实体类

可以直接使用,属性名和参数占位符保持一致就可以。

2.Map集合

可以直接使用,键名和参数占位符保持一致就可以。

3.其他类型

可以直接使用。比如int id,sql中占位符写什么都是可以的。示例:

 4.Collection(list/array)

准备传入一个集合参数:

通过断点调试还是会进入getNamedParams方法,然后进入wrapToMapIfCollection方法: 

 

小结:

传入的collection集合,那么会封装为Map集合:

map.put(“arg0”,collection集合);

map.put(“collection”,collection集合);

传入的list集合,那么也会封装为Map集合:

map.put(“arg0”,list集合);

map.put(“collection”,list集合);

map.put(“list”,list集合);

传入的array数组,那么也会封装为Map集合:

map.put(“arg0”,array数组);

map.put(“array”,array数组);

3.总结

在实际开发中当传入多个参数、collection集合、list集合和array数组等的时候,要尽量避免使用这种默认的参数,最好使用@Param注解来替换Map集合中的默认键名,并使用修改后的名称来获取值,这样会使代码可读性更高。

 

 

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

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

相关文章

RDD缓存有哪些特点?

RDD之间进行相互迭代计算(Transformation的转换)&#xff0c;当执行开启后&#xff0c;新RDD的生成&#xff0c;代表老RDD的消失。RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见了。这个特性可以最大化的利用资源&#xff0…

【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

Binarybomb 实验&#xff08;phase_1-6secret_phase&#xff09; 实验内容 一个“binary bombs”&#xff08;二进制炸弹&#xff0c;下文将简称为炸弹&#xff09;是一个Linux可执行C程序&#xff0c;包含了7个阶段&#xff08;phase1~phase6和一个隐藏阶段&#xff09;。炸…

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。 无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互 层的信息,这…

不懂就问:年薪百万的程序员是怎么做到的?

很多人对程序员的第一反应就是“工资高”。 从行业平均薪酬来看&#xff0c;“程序员”相关专业的收入确实更高一点。 但是&#xff0c;“程序员”内部薪资却存在着很大的差异&#xff0c;多数人月薪在1-2万&#xff0c;一线城市可以达到3-5万&#xff0c;而顶级程序员&#…

探索Java面向对象编程的奇妙世界(六)

⭐ 多态(polymorphism)⭐ 对象的转型(casting)⭐ 抽象类⭐ 接口 interface ⭐ 多态(polymorphism) 多态指的是同一个方法调用&#xff0c;由于对象不同可能会有不同的行为。现实生活中&#xff0c;同一个方法&#xff0c;具体实现会完全不同。 比如&#xff1a;同样是调用人“吃…

回归方程的显著性检验——F检验

回归方程的显著性检验——F检验 9.2 回归方程的显著性检验 (edu-edu.com.cn) 概念 记号&#xff1a; y i y_i yi​&#xff1a;真实值&#xff0c;观测值 y ˉ \bar{y} yˉ​&#xff1a;真实值的平均值 y ^ \hat{y} y^​&#xff1a;估计值&#xff0c;预测值 几个差&#x…

Activiti、Flowable与CCFlow的选型对比

前言 工作流是什么&#xff0c;这个问题我们就不在此进行解释了&#xff0c;这里我们主要讲解一下Activiti、Flowable和CCFlow三款工作流的对比&#xff0c;为大家选型时做一些参考。 Activiti和Flowable大家可能多少都听说过&#xff0c;都是国外的工作流引擎&#xff0c;都…

Axure教程—单色面积图(中继器)

本文将教大家如何用AXURE制作单色面积图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://icg26y.axshare.com/ 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87837919?spm1001.2014.3001.5503 二、功能介绍 简单填写中继器内容即…

软件设计师总结-含括学习方法和学习过程,可参考

目录 考前备战宏观    心路历程-感受    学习阶段-计划的安排 微观一、课本和视频的学习    本阶段的目的:    侧重点    涉及的学习方法&#xff08;最后有如何使用这些方法&#xff09;    学习结果 二、32小时通关辅助前面的知识点    本阶段的…

提升企业管理效率的利器——ADManager Plus

在当今信息时代&#xff0c;企业的规模和复杂性不断增长&#xff0c;管理各个方面变得愈发具有挑战性。而在企业管理中&#xff0c;活跃目录&#xff08;Active Directory&#xff09;起着至关重要的作用。它是一种用于组织内部的用户、计算机、组和其他对象进行集中管理的目录…

javascript中的this与函数讲解

前言 javascript中没有块级作用域&#xff08;es6以前&#xff09;&#xff0c;javascript中作用域分为函数作用域和全局作用域。并且&#xff0c;大家可以认为全局作用域其实就是Window函数的函数作用域&#xff0c;我们编写的js代码&#xff0c;都存放在Window函数内&#x…

Hack The Box-Redeemer关卡

TASK 1 任务 1 Which TCP port is open on the machine? 计算机上打开了哪个 TCP 端口&#xff1f; 6379TASK 2 任务 2 Which service is running on the port that is open on the machine? 计算机上打开的端口上运行哪个服务&#xff1f; redisTASK 3 任务 3 What typ…

java学习——java学习进度一String类1(学习记录——供回溯)

String 分割字符串 split( ) String s "1,2,3,4"; //未使用split分割前 System.out.println(s.length());//使用split分割后 String[] ssplit s.split(","); System.out.println(ssplit.length);split( , ) //两个参数都有的时候&#xff0c;第一个为用…

视频编辑软件:迅捷视频工具箱

这是一款功能强大、易于使用的视频编辑工具&#xff0c;支持视频剪辑、视频转换、音频转换、视频压缩、视频水印、字幕贴图等实用功能&#xff0c;可以帮助你制作出高质量的视频作品。&#xff08;传送门&#xff1a;https://www.xunjiepdf.com/xjspgjx&#xff09; 功能简介 …

Linux:CentOS:进程查看和控制

查看 ps 查看静态的进程统计信息top查看动态的进程排名信息pgrep根据特定条件查询进程 PID 信息pstree以树形结构列出进程信息 S ---休眠 R ---运行 Z ---僵死&#xff08;应予以手动终止&#xff09; < ---高优先级 N ---低优先级 …

FrameLayout+LinearLayout实现首页底部菜单

1.布局样式 2.main.xml代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_par…

Socket(二)

文章目录 1. Socket地址2. 代理服务器3. 获取Socket的信息4. 关闭还是连接5. toString() 1. Socket地址 SocketAddress类表示一个连接端点&#xff0c;这个一个空的抽象类&#xff0c;除了一个默认构造函数外&#xff0c;没有其他方法。当前只支持TCP/IP Socket&#xff0c;实…

在云服务器上部署简单的聊天机器人网站(源1.0接口版)

诸神缄默不语-个人CSDN博文目录 又不是不能用.jpg http://47.113.197.198:8000/chat 集成代码可参考&#xff1a;花月与剑/scholar_ease 之所以先用源1.0&#xff0c;一是因为我API都申请了&#xff0c;不用白不用&#xff1b;二是因为源1.0可以直接用国内网络连接&#xf…

终极AI工具包【第一章 如何学习ChatGPT(基础知识)】

第1章&#xff1a;如何学习ChatGPT&#xff08;基础知识&#xff09; 1、什么是ChatGPT ChatGPT是OpenAI开发的一种人工智能&#xff08;AI&#xff09;语言模型。它是在一个称为GPT&#xff08;生成预训练变压器&#xff09;的架构下构建的&#xff0c;目的是理解和生成人类语…

商城配置-shorp

商城配置 说明 商城配置主要分为三块&#xff0c;基础配置&#xff0c;平台配置&#xff0c;支付配置,所有配置请都检查配置一下&#xff0c;文档中只对部分配置进行说明 基础配置 基础配置说明 基础配置包括&#xff0c;商城信息&#xff0c;会员配置&#xff0c;分享配置&am…