【MyBatis持久层框架】MyBatis参数传递详细解读

news2024/12/25 22:27:07

文章目录

  • 1. 前言
  • 2. MyBatis 参数传递
  • 3. 多个参数
  • 4. 单个参数
    • 4.1 POJO类
    • 4.2 Map集合类
    • 4.3 Collection集合类型
    • 4.4 List集合类型
    • 4.5 Array类型
    • 4.6 其他类型
  • 5. 总结

1. 前言

前面在使用配置文件实现增删改查一文中,我们说到,使用 MyBatis 的 Mapper 代理开发时首先要定义一个 Mapper 接口,后面会使用该接口的代理对象来执行 sql,而执行 sql 的方法就定义在该 Mapper 接口中。

在这里插入图片描述

在查询数据详情时,我们往方法中传入了 一个整数类型的值,用户接收需要查询的数据的主键 id ,然后根据这个 id 来查询数据库中的信息。

那么,你有没有思考过,在 MyBatis 的接口方法中可以接收哪些类型的参数呢?具体的是怎么实现的呢?这篇文章我们详细探讨 MyBatis 参数传递。

2. MyBatis 参数传递

MyBatis 的接口方法可以接收各种各样的参数,大概可以分为以下几类:

在这里插入图片描述

下面分类做详细的探讨。

3. 多个参数

在 MyBatis 开发中,如果接口方法中需要定义多个参数,则每个参数都要使用 @param 注解,例如:

User select(@Param("username") String username,@Param("password") String password);
<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{username}
    	and password=#{password}
</select>

为什么在接口方法中有多个形参时要使用注解呢?这里与 MyBatis 底层处理逻辑有关。

我们在接口方法中定义多个参数,MyBatis 会将这些参数封装为 Map 集合对象,其值就是参数值,而键在没有使用 @param 注解时有自己的默认命名规则,其每个参数都有两个对应的不同的键,如下:

  • 以 arg 开头:arg0,arg1…
  • 以 param 开头:param1,param2…

示例:在接口方法中传入两个参数时:

User select(String username,String password);

第一种方式:

<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{arg0}
    	and password=#{arg1}
</select>

第二种方式:

<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{param1}
    	and password=#{param2}
</select>

如果使用了 @param 注解,则可以直接使用注解中的命名。

所以,在接口方法中定义多个参数时,尽量使用 @param 注解的方式,这个具有更高的代码可读性。

4. 单个参数

4.1 POJO类

POJO 类作为接口方法的形参时,可以直接使用,但是要求实体类对象的属性名和参数占位符名称一致。例如:

void add(Student student);
<insert id="add">
     insert into student (name, gender, score_english, score_math)
     values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
</insert>

4.2 Map集合类

Map 集合类作为接口方法的形参时,可以直接使用,但是要保证 Map 集合的键名和参数占位符名称一致。例如:

void add(Map map);
<insert id="add">
     insert into student (name, gender, score_english, score_math)
    values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
</insert>

4.3 Collection集合类型

使用 Collection 集合类型做为接口方法形参时,MyBatis 会将集合封装到 Map 集合中,例如:

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

使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.4 List集合类型

使用 List 集合类型作为接口方法的形参时,Mybatis 会将集合封装到 Map 集合中,如下:

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

使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.5 Array类型

使用数组作为接口方法的形参时,Mybatis 会将数组封装到 Map 集合中,如下:

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

同样地,使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.6 其他类型

除了上面几种类型的参数,接口方法中还可以定义很多类型的参数,例如 int 类型,使用单个 int 类型的参数时,参数占位符的命名没有约束,但是要尽量满足 Java 标识符命名见名知意的规则。

例如:

void deleteById(int id);
<delete id="deleteById">
    delete from student where id=#{key};
</delete>

5. 总结

Mapper 接口方法中可以接收各种各样的参数,不同参数的使用方式并不相同。在使用例如 int 类型的参数时,参数占位符可以是任何名称,但是尽量保证见名知意。

使用 Collection ,List 类的集合或者数组时,其会被封装为 Map 集合对象,在该 Map 集合中,每种类型都有对应的默认键名,但是这种方式在开发中并不方便,我们可以使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

如果参数是 Map 集合类型,则可以直接使用,前提是要保证 Map 集合的键名和参数占位符一致,同样地,参数是 POJO 实体类时,也可以直接使用,但是要保证实体类对象的属性和参数占位符名称一致。

感谢点赞三连,下期见。

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

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

相关文章

glibc memcpy内部机制学习记录

判断需要拷贝的字节数是否大于临界值&#xff08;16或8&#xff09;。如果小于&#xff0c;直接按照one byte by one byte来拷贝。如果大于&#xff1a; 1、先进行内存对齐。假设要拷贝的目的地址如下所示 其中start为拷贝目的地的起始地址 &#xff0c;end为拷贝目的地的结束…

企业的内部文档太杂乱,有什么好用的文档管理软件?

企业内部文档的管理&#xff0c;是一个老生常谈的问题。 有些企业的文档管理比较混乱&#xff0c;很难做好企业内部的信息管控。 我们可以先从以下几个方面入手&#xff1a; 企业内部文档杂乱分散&#xff0c;集中式的管理&#xff1b;信息更新不及时、错误频繁&#xff0c;通过…

大数据NiFi(十六):处理器Connection连接

文章目录 处理器Connection连接 一、查看队列中的FlowFile 二、查看FlowFile自定义属性值

【数据结构初阶】第一节.初识时间和空间复杂度

文章目录 前言 一、认识数据结构 二、时间复杂度 2.1 时间复杂度的概念 2.2 计算时间复杂度 2.2.1 大O的渐进表示法 2.3 常见时间复杂度计算举例 三、空间复杂度 3.1 空间复杂度的概念 3.2 计算空间复杂度 3.3 常见空间复杂度计算举例 四、常见复杂度的对比&#xff1…

CVE-2022-26937 Windows NFS 栈溢出漏洞分析

简介 NFS全称Network File System&#xff0c;即网络文件系统&#xff0c;用于服务器和客户机之间文件访问和共享的通信&#xff0c;从而使客户机远程访问保存在存储设备上的数据。 CVE-2022-26937是微软5月份修复的Windows NFS中一个对NLM响应处理不当的栈溢出漏洞&#xff…

OAuth2(1)

目录 一、什么是OAuth2.0 二、OAuth2中的角色 三、认证流程 四、生活中的OAuth2思维 五、令牌的特点 六、OAuth2授权方式 1.授权码 2.隐藏方式 3.密码方式 4.凭证方式 一、什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用户授权第三方应用…

红宝书学习

第一章 认识js js的组成部分有哪些&#xff1f; ①ecma 核心语法 api ②dom 提供与网页内容交互的方法和接口 ③bom 浏览器对象模型&#xff0c;提供了和浏览器交互的接口 use strict 是什么&#xff1f; use strict 是一种 ECMAscript5 添加的&#xff08;严格模式&#xff…

玩了半年NFT,一心进军Web3的Prada到底要怎么玩?

图片来源&#xff1a;无界AI绘画工具生成2022年1月&#xff0c;奢侈品品牌Prada与阿迪达斯玩了一把“联合营销”&#xff0c;玩法是这样的&#xff1a;首先&#xff0c;两个品牌邀请粉丝上传个人照片&#xff0c;然后&#xff0c;品牌抽取3000名粉丝的作品&#xff0c;交由数字…

【Rust】12. 自动化测试

12.1 编写测试 12.1.1 测试函数 测试函数&#xff1a;在一个函数前加上一行 #[test] 注解将普通函数变成测试函数 12.1.2 assert! 宏 12.1.3 assert_eq! 与 assert_ne! assert_eq!(left, right) 与 assert_eq!(left, right) 在失败时会返回 left 与 right 两个值&#xff0c…

Python学习-----起步1

目录 Python的下载&#xff08;解释器&#xff09; IDLE进入Python解释器 交互模式 脚本模式 注释 单行注释&#xff1a; 多行注释 Python的下载&#xff08;解释器&#xff09; 百度网盘链接&#xff1a; https://pan.baidu.com/s/1WEmOAGGHtHc1fxZzNGKu6A?pwd5356 …

web3小白入门:区块链的了解

记录web3学习的过程&#xff0c;从小白开始所有的web3相关的学习内容都会更新在github&#xff0c;github地址这篇文章主要说明区块链的一些概念为什么要了解区块链&#xff1f;Web3 是以区块链技术为核心,构建新一代的去中心化互联网组件,再基于它们来构建我们想要提供的服务、…

HTTP状态码301和302区别

Http 状态码 301 和 302 定义&#xff1a; 1、什么时候使用301&#xff1f; 你将永久更改网页的 URL时。你将永久迁移到新域名时。当你从 HTTP 切换到 HTTPS 时。你希望修复非 www / www 重复内容问题时。永久合并两个或多个页面或网站时。你将永久更改网站的 URL 结构时。 …

万字详解递归与递推

秋名山码民的主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平有限&#xff0c;如发现错误&#xff0c;还请私信或者评论区留言&#xff01; &#x1f44d;目录前言递归斐波那契数列问题的递归爬楼梯问题力扣递归实现…

js 点击图片实现查看大图

js 点击图片实现查看大图 点击图片放大缩小&#xff08;遮罩&#xff09; 截图&#xff1a;点击放大&#xff0c;并显示ico放大镜 代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>点击图片放大缩…

buu 浪里淘沙 1

题目描述&#xff1a; 题目分析&#xff1a; 看了这一大串字符串&#xff0c;发现里面都是由16个字母组成&#xff0c;即 “tonight success notice we example crypto should back space sublim found system morning user the enter ”&#xff0c;并且这16个字母在第一行中…

【Kotlin】DSL 领域特定语言 ① ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 泛型扩展匿名函数 )

文章目录一、apply 标准库函数分析1、apply 函数展示2、apply 函数原型分析函数原型参数和返回值分析3、匿名函数类型分析4、扩展函数回顾5、泛型扩展函数函数类型6、泛型扩展匿名函数7、apply 标准库函数参数分析泛型扩展函数匿名函数 与 普通匿名函数 对比apply 函数参数不是…

登高望远,一文解答 2023 年你最关心的前端热点问题

动手点关注干货不迷路本文预计阅读 25 min&#xff0c;建议先收藏后观看~一、刀光剑影的 2022时光荏苒&#xff0c;这绝不平淡的 2022 年已经走上历史的黄页&#xff0c;新的一年也逐渐看不到故人回首的光影。感谢你对前端技术领域持续关注&#xff0c;我们一直在这里等你。① …

致敬2202年,这些优秀的裁缝们

文 | 鹰钩鼻涕虫2202年过去了&#xff0c;不知道小伙伴们是否和我一样&#xff0c;绝大多数时间处于迷茫之中&#xff0c;除去其他因素不谈&#xff0c;在最后一个月到来之前&#xff0c;NLP 学界的表现似乎不如前几年那样“精彩”&#xff0c;甚至可说是“寡淡”&#xff0c;翻…

spring事务执行流程分析_5(注解形式 advisor等前置对象的生成)

调用beanFactory处理器 依旧进入刷新refresh方法AbstractApplicationContext#refresh -> 在上一篇文章spring事务执行流程分析_4(注解形式 EnableTransactionManagement的作用) 解析EnableTransactionManagement注解就是在此方法进行的,也就是在会注册 名字&#xff1a;i…

简单模拟vue实现数据劫持-视图更新双向绑定-2

接上&#xff0c; new一个实例对象&#xff0c;vc&#xff0c;构造函数动态绑定一个空对象&#xff0c;并在构造函数上绑定静态方法 $on进行事件的注册&#xff0c;$emit抛出执行事件 function observe() {// 利用策略模式-可以快速根据特定的事件&#xff0c;执行多个函数th…