当前位置: 首页 > news >正文

MyBatis的不同参数传递封装

MyBatis参数传递

传参方式

1. 使用 #{} 占位符

这是 MyBatis 中最常用的参数传递方式。它将参数直接替换到 SQL 语句中的占位符位置。

单个参数:

<select id="selectUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>

多个参数:

如果传递多个参数,可以按顺序使用 #{param1}#{param2}, … 或者给参数命名。

<select id="selectUserByNameAndAge" resultType="User">SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>

2. 使用 @Param 注解(推荐使用

在接口方法中使用 @Param 注解可以给参数命名,这样在 SQL 映射文件中就可以使用这些名称。

User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age);

对应的 XML:

<select id="selectUserByNameAndAge" resultType="User">SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>

3. 使用 Map 

可以将参数封装在一个 Map 或 POJO(Plain Old Java Object)中,然后在 SQL 语句中通过键名或属性名来访问这些参数。

Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("age", 30);

对应的 XML:

<select id="selectUserByMap" resultType="User">SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>

4. 使用 ${} 字符串替换

虽然不推荐使用,但 MyBatis 也支持使用 ${} 来进行字符串替换。这种方式容易导致 SQL 注入攻击,因此应该谨慎使用。

<select id="selectUserByName" resultType="User">SELECT * FROM users WHERE name = '${name}'
</select>

注:

  • 使用 #{} 时,MyBatis 会创建预处理语句(PreparedStatement),这有助于防止 SQL 注入。
  • 使用 ${} 时,MyBatis 会直接将参数值拼接到 SQL 语句中,这可能会导致 SQL 注入风险。

参数不同的封装方式

        MyBatis接口方法上可以接收各种各样的参数,MyBatis底层对于这些参数有不同的封装处理方式。我们以解读源码的形式对MyBatis提供的ParamNameResolver类进行参数封装解读。

单个参数:

1.POJO类型:(直接使用,属性名和参数占位符名称一致)
public class UserParam {private String name;private int age;
}

对应的 XML:

<select id="selectUserByPOJO" resultType="User">SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
2.Map集合:(直接使用,属性名和参数占位符名称一致)
Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("age", 30);

对应的 XML:

<select id="selectUserByMap" resultType="User">SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
3.Collection:

可以看出Collection会封装成Map集合,参数值会被封装成:

map.put("arg0", collection集合);
map.put("collection", collection集合);
4.List:也会被封装成map集合

如果是List,则会在Collection的基础上增加一个List键值。

map.put("arg0", List集合);
map.put("collection", List集合);
map.put("List", List集合);
5.Array:也会被封装成map集合

如果是Array数组,则会走另一个if语句。

map.put("arg0", 数组);
map.put("array",数组);
6.其他类型:直接使用

多个参数类型,

put出两个键值对,一个是arg0,另一个是param1。

map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("arg1",参数值2)
map.put("param2",参数值2)
User select(@Param("username") String username,String password);

 注意:封装为Map集合,可以使用@param注解,替换Map集合中默认的arg键名。

-----------------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("arg1",参数值2)
map.put("param2",参数值2)

为什么会有arg和param两个键值对呢?

兼容不同的参数命名规则

  1. arg0arg1, ...:这种命名方式通常用于通过位置(索引)传递参数。在一些情况下,用户可能更喜欢或更习惯于通过参数的顺序来引用它们,而不是通过具体的参数名。这种方式在MyBatis的早期版本中较为常见,尤其是在使用XML映射文件时
  2. param1param2, ...:这种命名方式则是基于参数的名称来传递参数。随着MyBatis的发展,基于名称的参数传递变得更加流行,因为它提供了更好的可读性和灵活性,尤其是在处理复杂对象或多个参数时。

相关文章:

MyBatis的不同参数传递封装

MyBatis参数传递 传参方式 1. 使用 #{} 占位符 这是 MyBatis 中最常用的参数传递方式。它将参数直接替换到 SQL 语句中的占位符位置。 单个参数&#xff1a; <select id"selectUserById" resultType"User">SELECT * FROM users WHERE id #{id}…...

kotlin 协程方法总结

Kotlin 协程是一套强大的异步编程工具&#xff0c;以下是对 Kotlin 协程常用方法的总结&#xff1a; 1. 协程构建器 launch: 启动一个新的协程&#xff0c;不阻塞当前线程&#xff0c;返回一个 Job 对象。 GlobalScope.launch {// 协程体}async: 启动一个新的协程并返回一个…...

脉冲当量计算方法

脉冲的概念&#xff1a; 脉冲当量是指控制器输出一个定位控制脉冲时&#xff0c;所产生的定位控制移动的位移。在直线运动中&#xff0c;它表示移动的距离&#xff1b;在圆周运动中&#xff0c;它表示转动的角度。简而言之&#xff0c;脉冲当量就是电机接收一个脉冲信号后能够移…...

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考&#xff08;spring-boot-helloWorld-2.x&#xff09;示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf&#xff0c;实际以最新更新的手册为准。 2.本文…...

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…...

C++之多态(上)

C之多态 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…...

PySpark单机模式安装教程

目录 1. 环境准备 1.1 安装要求 1.2 检查Python和Java环境 2. 下载并解压Spark 2.1 下载Spark 2.2 解压安装包 3. 配置环境变量 4. 配置Spark 5. 启动Spark Shell 6. 运行测试 7. 关闭Spark Shell 8. 常见问题 8.1 兼容性问题 8.2 环境变量配置 总结 1. 环境准备…...

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…...

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…...

保险大模型革新:全面自动化倒计时

摘 要 大模型于保险业不仅是一个技术升级的过程&#xff0c;更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利&#xff08;KevinKelly&#xff09;曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年&#xff0c;…...

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

《用Gin框架构建分布式应用》学习第12天&#xff0c;p212-p233总结&#xff0c;总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用&#xff0c;作为后…...

点云聚类学习 KMeans/DBSCAN

点云聚类学习--KMeans/DBSCAN OverviewKMeansDBSCAN简单对比 Overview 最近做的东西会处理一些Lidar的点云数据&#xff0c;虽然之前在看Autoware的时候有了解一些聚类的基本原理和实现&#xff0c;但还是稍微再学习一下聚类方法吧&#xff0c;这里就简单记录一下&#xff08;…...

反悔贪心

Problem - C - Codeforces&#xff08;初识反悔贪心&#xff09; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define fi first #define se secondusing namespace std; typedef pair<int,int> PII;string a, b, ans; bool vis…...

汽车软件融合分析

随着汽车智能化、互联化的不断发展&#xff0c;软件在汽车中的重要性日益彰显。从硬件定义汽车&#xff0c;到软件定义汽车&#xff0c;再到AI定义汽车&#xff0c;汽车产业的变革正在加速进行。在这一变革中&#xff0c;软件融合成为了一个重要的趋势。本文将从多个角度对汽车…...

机器人和智能的进化速度远超预期-ROS-AI-

危机 通常&#xff0c;有危险也有机遇才称之为危机。 从2020年启动转型自救&#xff0c;到2021年发现危险迫在眉睫&#xff0c;直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断&#xff0c;在如今得到了验证。 机器人…...

5天学习RAG路线图,你信吗?

RAG是"Retrieval Augmented Generation"的缩写&#xff0c;让我们来拆解这个术语&#xff0c;了解RAG的本质&#xff1a; R -> Retrieval&#xff08;检索&#xff09; A -> Augmented&#xff08;增强&#xff09; G -> Generation&#xff08;生成&…...

JIME智创:抖音创作者的AI绘画与视频生成创作神器

在短视频和社交内容创作的时代&#xff0c;创意和速度成了成功的关键。无论是视频博主、图文创作者还是品牌推广人&#xff0c;他们都面临着如何快速生成高质量图片与视频素材的挑战。JIME智创正是针对这一需求推出的AI创作工具&#xff0c;专为抖音的图文和视频创作者设计&…...

基于SpringBoot和PostGIS的世界各国邻国可视化实践

目录 前言 一、空间数据查询基础 1、空间数据库基础 2、空间相邻查询 二、SpringBoot后台功能设计 1、后台查询接口的实现 2、业务接口设计 三、Leaflet进行WebGIS开发 1、整体结构介绍 2、相邻国家展示可视化 四、成果展示 1、印度及其邻国 2、乌克兰及其邻国 3、…...

Halcon相机外参自理解

外参描述了相机在世界坐标系中的位置和朝向&#xff0c;即它将世界坐标转换为相机坐标的几何变换。具体来说&#xff0c;外参包括一个 旋转矩阵 R R R 和一个 平移向量 t t t&#xff0c;它们共同构成了将世界坐标变换到相机坐标系的刚体变换 相机标定的Pose0代表了相机在外界…...

C#语言入门:从基础到进阶

C#&#xff08;发音为"C sharp"&#xff09;是微软公司推出的一种面向对象的编程语言&#xff0c;它由Anders Hejlsberg和他的团队在.NET框架下开发。C#语言结合了C和Java的特性&#xff0c;并添加了新的功能&#xff0c;使其成为当今最流行的编程语言之一。 C#的特…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...