MyBatis——MyBatis 参数处理

一、单个简单类型参数

简单类型包括:

  • byte short int long float double char

  • Byte Short Integer Long Float Double Character

  • String

  • java.util.Date

  • java.sql.Date

parameterType 属性:告诉 MyBatis 参数的类型

MyBatis 自带类型自动推断机制,所以大部分情况下 parameterType 属性可以不写

对于部分类型 MyBatis 内置已经起了别名,可以直接使用别名

参考文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases

<select id="selectById" resultType="Account" parameterType="java.lang.String">select * from t_act where actno = #{actno};
</select>

二、Map 参数 

这种方式是手动封装 Map 集合,将每个条件以 key 和 value 的形式存放到集合中。

在使用的时候通过 #{map集合的key} 来取值。

/**
* 根据name和age查询
* @param paramMap
* @return
*/
List<Student> selectByParamMap(Map<String,Object> paramMap);
@Test
public void testSelectByParamMap(){// 准备MapMap<String,Object> paramMap = new HashMap<>();paramMap.put("nameKey", "张三");paramMap.put("ageKey", 20);List<Student> students = mapper.selectByParamMap(paramMap);// students.forEach(student -> System.out.println(student));students.forEach(System.out::println);
}
<select id="selectByParamMap" resultType="student">select * from t_student where name = #{nameKey} and age = #{ageKey}
</select>

三、实体类参数 

这里需要注意的是:#{} 里面写的是属性名字。这个属性名其本质上是:set/get 方法名去掉 set/get 之后的名字。  

/*** 保存学生数据* @param student* @return*/
int insert(Student student);
<insert id="insert">insert into t_student values(null,#{name},#{age},#{height},#{birth},#{sex})
</insert>
@Test
public void testInsert(){Student student = new Student();student.setName("李四");student.setAge(30);student.setHeight(1.70);student.setSex('男');student.setBirth(new Date());int count = mapper.insert(student);SqlSessionUtil.openSession().commit();
}

四、多参数 

/*** 根据name和sex查询* @param name* @param sex* @return*/
List<Student> selectByNameAndSex(String name, Character sex);
@Test
public void testSelectByNameAndSex(){List<Student> students = mapper.selectByNameAndSex("张三", '女');// students.forEach(student -> System.out.println(student));students.forEach(System.out::println);
}
<select id="selectByNameAndSex" resultType="student">select * from t_student where name = #{name} and sex = #{sex}
</select>

执行结果:

异常信息描述了:name 参数找不到,可用的参数包括 [arg1, arg0, param1, param2]

修改 StudentMapper.xml 配置文件:尝试使用 [arg1, arg0, param1, param2] 取参数

<select id="selectByNameAndSex" resultType="student"><!--select * from t_student where name = #{name} and sex = #{sex}-->select * from t_student where name = #{arg0} and sex = #{arg1}
</select>

执行结果:

再次尝试修改 StudentMapper.xml 文件  

<select id="selectByNameAndSex" resultType="student"><!--select * from t_student where name = #{name} and sex = #{sex}--><!--select * from t_student where name = #{arg0} and sex = #{arg1}--><!--select * from t_student where name = #{param1} and sex = #{param2}-->select * from t_student where name = #{arg0} and sex = #{param2}
</select>

通过测试可以看到:

  • arg0 是第一个参数

  • param1 是第一个参数

  • arg1 是第二个参数

  • param2 是第二个参数

实现原理:实际上在 mybatis 底层会创建一个 map 集合,以 arg0/param1 为 key,以方法上的参数为 value

// mybatis 部分源码
Map<String,Object> map = new HashMap<>();
map.put("arg0", name);
map.put("arg1", sex);
map.put("param1", name);
map.put("param2", sex);// 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2}
// 其本质就是 #{map集合的key}

注意:使用 mybatis 3.4.2 之前的版本时:要用 #{0} 和 #{1} 这种形式。

五、@Param 注解(命名参数) 

map 集合的 key 可以自定义:使用使用 @Param 注解即可  

@Param("这里填写的其实就是 map 集合的 key")

使用注解之后 arg0 arg1 失效了,但是 param1 param2 还可以用  

/*** 根据name和age查询* @param name* @param age* @return*/
List<Student> selectByNameAndAge(@Param(value="name") String name, @Param("age") int age);
@Test
public void testSelectByNameAndAge(){List<Student> stus = mapper.selectByNameAndAge("张三", 20);// stus.forEach(student -> System.out.println(student));stus.forEach(System.out::println);
}
<select id="selectByNameAndAge" resultType="student">select * from t_student where name = #{name} and age = #{age}
</select>

六、@Param 源码分析 

MyBatis 框架中的 @Param 注解主要用于在 SQL 语句中传递参数,并且可以指定参数的名称,以便在 SQL 语句中引用

下面是 @Param 注解的核心原理解析:

  • 参数绑定: 当使用 @Param 注解时,MyBatis 会将注解中指定的参数名与参数值进行绑定,这样在 XML 映射文件或者注解中就可以通过参数名引用对应的参数值。

  • 构建参数Map: 在处理带有 @Param 注解的方法参数时,MyBatis 会将这些带有 @Param 注解的参数构建成一个参数 Map,在执行 SQL 语句时,会将这个参数 Map 传递给 SQL 语句,以便提供参数值。

  • 参数替换: MyBatis 在解析 SQL 语句时,会检测到带有 @Param 注解的参数,并将参数值替换到 SQL 语句中对应的位置,从而构建最终可执行的 SQL 语句。

  • 参数处理: MyBatis 在执行 SQL 语句时,会根据参数 Map 中的参数名和值来替换 SQL 语句中的参数占位符,从而执行 SQL 查询操作。

  • 参数传递: 使用 @Param 注解可以明确指定参数的名称,避免参数不明确导致的错误,同时也可以方便地在 SQL 语句中引用具体的参数值。

总的来说,@Param 注解的核心原理是通过将带有注解的参数与参数值进行绑定,并构建参数 Map,以便在 SQL 语句中引用参数值并执行查询操作。这样可以提高代码的可读性和准确性。

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

LLM应用-prompt提示:生成搜索相关问题、生成回答格式包含参考资料

参考: https://isou.chat/ (AI回答与相关问题都是根据问题的搜索引擎结果结合大模型生成的) prompt参考: https://github.com/yokingma/search_with_ai/blob/6d32aa8f05f5f6ee12b5204787035b3f7797c22a/src/prompt.ts#L8 ##rag 根据搜索结果知识回答RagQueryPrompt = ` …

程控水冷阻性负载主要工作方式

程控水冷阻性负载是一种先进的电力设备&#xff0c;主要用于电力系统的测试和研究。它的主要工作方式是通过控制水冷系统的温度&#xff0c;来模拟不同的阻性负载条件&#xff0c;从而对电力设备进行各种性能测试。 首先&#xff0c;我们需要了解什么是阻性负载。阻性负载是指那…

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集 文章目录 代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集01背包问题理论基础一、01背包问题二、…

Redis教程——哨兵

在上篇文章我们学习了Redis教程——主从复制&#xff0c;这篇文章我们学习Redis教程——哨兵监控。 在主从复制中如果主机发生宕机&#xff0c;从机Redis会一直等到主机的恢复&#xff0c;这样会导致只能进行读操作&#xff0c;不能进行写操作&#xff0c;这大大降低了系统的高…

资料同化 | 搭建docker环境-1

Community Gridpoint Statistical Interpolation (GSI) system DTC 是一个分布式设施&#xff0c;NWP 社区可以在这里测试和评估用于研究和操作的新模型和技术。 DTC的目标包括&#xff1a; 链接研究和操作社区 研究成果转化为实际操作的速度 加快改善天气预报 开发和测试有…

Cocos Creator 3.8.x 透明带滚动功能的容器

ScrollView 是一种带滚动功能的容器 1、删除ScrollView下Sprite组件的SpriteFrame 2、ScrollView下scrollBar的Sprite组件的Color设为&#xff1a;FFFFFF00 3、ScrollView下view的Graphics组件的FillColor设为&#xff1a;FFFFFF00

IP代理如何帮助SEO进行优化?

IP代理在SEO优化中扮演着重要的角色&#xff0c;它通过多种方式帮助提升网站的搜索排名和可见性。以下是IP代理如何帮助SEO进行优化的详细阐述&#xff1a; 第一点&#xff0c;数据采集与分析&#xff1a;在SEO过程中&#xff0c;大量的数据是必不可少的。通过使用IP代理&…

c++ std::shared_ptr学习

背景 c中智能指针shared_ptr用于自动管理资源&#xff0c;通过引用计数来记录资源被多少出地方使用。在不使用资源时&#xff0c;减少引用计数&#xff0c;如果引用计数为0&#xff0c;表示资源不会再被使用&#xff0c;此时会释放资源。本文记录对c中std::shared_ptr的源码学习…

攻防世界PHP2

1、打开靶机链接http://61.147.171.105:49513/&#xff0c;没有发现任何线索 2、尝试访问http://61.147.171.105:49513/index.php&#xff0c;页面没有发生跳转 3、尝试将访问 尝试访问http://61.147.171.105:49513/index.phps index.php 和 index.phps 文件之间的主要区别在于…

GNU Radio创建时间戳 C++ OOT块

文章目录 前言一、创建自定义的 C OOT 块1、创建 timestamp_sender C OOT 模块①、创建 timestamp_sender OOT 块②、修改 C 代码 2、创建 timestamp_receiver C OOT 模块①、创建 timestamp_receiver OOT 块②、修改 C 代码 3、创建 delayMicroSec C OOT 模块①、创建 delayMi…

Vue3实战笔记(20)—封装头部导航组件

文章目录 前言一、封装头部导航栏二、使用步骤总结 前言 Vue 3 封装头部导航栏有助于提高代码复用性、统一风格、降低维护成本、提高可配置性和模块化程度&#xff0c;同时还可以实现动态渲染等功能&#xff0c;有利于项目开发和维护。 一、封装头部导航栏 封装头部导航栏&am…

HFSS学习-day4-建模操作

通过昨天的学习&#xff0c;我们已经熟悉了HFSS的工作环境&#xff1b;今天我们来讲解HFSS中创建物体模型的县体步骤和相关操作。物体建模是HFSS仿真设计工作的第一步&#xff0c;HFSS中提供了诸如矩形、圆面、长方体圆柱体和球体等多种基本模型(Primitive)&#xff0c;这些基本…

新书速览|MATLAB科技绘图与数据分析

提升你的数据洞察力&#xff0c;用于精确绘图和分析的高级MATLAB技术。 本书内容 《MATLAB科技绘图与数据分析》结合作者多年的数据分析与科研绘图经验&#xff0c;详细讲解MATLAB在科技图表制作与数据分析中的使用方法与技巧。全书分为3部分&#xff0c;共12章&#xff0c;第1…

精英都是时间控!职场精英的完美一天~~~谷歌FB都在用的时间管理术!

如何超高效使用24小时 每个人的一天都只有24小时&#xff0c;使用时间的方法将决定整个人生。时间管理术并不提倡把自己忙死榨干&#xff0c;而是通过在合适的时间做合适的事情&#xff0c;把大脑机能发挥到极致&#xff0c;从而提高效率&#xff0c;节省下更多时间用于生活与…

(项目)-KDE巡检报告(模板

金山云于12月26日对建行共计【30】个KDE集群,合计【198】台服务器进行了巡检服务。共发现系统风险【135】条,服务风险【1912】条,服务配置风险【368】条。 一、系统风险 1、风险分析(图片+描述) (1)磁盘使用率高 问题描述多个集群的多台服务器磁盘使用率较高,远超过…

答辩PPT模版如何选择?aippt快速生成

这些网站我愿称之为制作答辩PPT的神&#xff01; 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT…

简述RocketMQ系统架构及其相关概念

一、概述 RocketMQ是一款高性能、高吞吐量的分布式消息队列系统&#xff0c;它采用了分布式架构&#xff0c;支持多生产者和消费者并发读写&#xff0c;具有高可用性、高吞吐量、低延迟等特点。本文将对RocketMQ的系统架构进行详细解析。 二、架构设计 RocketMQ采用了分布式架…

入门物联网就是这么简单——青创智通

工业物联网解决方案-工业IOT-青创智通 MQTT&#xff0c;全称为Message Queuing Telemetry Transport&#xff0c;是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网领域。 MQTT协议以其高效、可靠、灵活的特性&#xff0c;成为物联网设备间通信的理想选择。本…

升级版ComfyUI InstantID 换脸:FaceDetailer + InstantID + IP-Adapter

在使用ComfyUI的InstantID进行人脸替换时&#xff0c;一个常见问题是该工具倾向于保留原始参考图的构图&#xff0c;即使用户的提示词与之不符。 例如&#xff0c;即使用户提供的是大头照并请求生成全身照&#xff0c;结果仍是大头照&#xff0c;没有显示出用户所期望的构图。…

MySQL_DDL语句

1.Data类临时数据的弊端 我们之前在将ServletJSP配合处理请求的过程中 数据库起到一个存取数据的作用 但是我们之前的案例中 数据是在Data类中临时定义的 并不是从数据库中获取的 这样做是不好的 因为每一次服务器关闭之后 那么部署在其上的类也会随着卸载 紧接着和类相挂钩的静…