MyBatis参数处理
MyBatis 参数处理详解
在 MyBatis 中,参数处理是非常重要的部分,它支持灵活的参数传递方式,以实现与数据库的交互。MyBatis 提供了多种方式来传递参数,包括单个参数、多参数、Java 对象和集合等,这些参数通过 SQL 语句中的占位符动态绑定到 SQL 中。
一、MyBatis 单个参数处理
MyBatis 支持将单个参数传递给 SQL 语句,通常通过 #{}
或 ${}
来绑定参数。
1. #{}
与 ${}
的区别
-
#{}
占位符:这是 MyBatis 的标准参数占位符,它会在 SQL 语句执行时将参数安全地绑定到 PreparedStatement 中,防止 SQL 注入。SELECT * FROM users WHERE id = #{id}
-
${}
占位符:它会直接将参数替换到 SQL 语句中,不会进行类型转换和 SQL 注入检查。通常用于动态表名或列名的拼接。SELECT * FROM ${tableName}
2. 单个参数示例
在 Mapper 接口中传递单个参数时,可以直接使用基本数据类型或包装类。
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUserById(int id);
}
此时,MyBatis 会自动将参数 id
绑定到 SQL 语句中的 #{id}
占位符上,并执行查询。
3. 动态 SQL 示例
使用 ${}
动态拼接表名或列名:
@Select("SELECT * FROM ${tableName} WHERE id = #{id}")
List<User> selectFromTable(@Param("tableName") String tableName, @Param("id") int id);
在此示例中,表名会动态拼接到 SQL 语句中,而 #{id}
则通过 PreparedStatement 绑定参数,保证 SQL 安全性。
二、MyBatis 多个参数处理
MyBatis 支持多个参数的传递。在处理多个参数时,MyBatis 会将参数封装为 param1
, param2
, param3
等形式,也可以使用 @Param
注解为每个参数指定名称,增强可读性。
1. 多个参数的自动映射
当传递多个参数时,MyBatis 默认按 param1
, param2
, param3
等名称来映射这些参数。
public interface UserMapper {@Select("SELECT * FROM users WHERE name = #{param1} AND age = #{param2}")List<User> selectUsersByNameAndAge(String name, int age);
}
在这种情况下,param1
对应第一个参数 name
,param2
对应第二个参数 age
。
2. 使用 @Param
注解传递多个参数
为了更清晰地传递多个参数,MyBatis 提供了 @Param
注解,允许开发者自定义参数名。
public interface UserMapper {@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")List<User> selectUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
}
使用 @Param
后,name
和 age
会被绑定到 SQL 语句中的 #{name}
和 #{age}
占位符上。
三、MyBatis 对象参数处理
MyBatis 支持将 Java 对象作为参数传递到 SQL 语句中。在这种情况下,MyBatis 会自动将对象的属性映射为 SQL 语句中的参数。
1. 传递单个 Java 对象
当我们将一个 Java 对象作为参数传递时,MyBatis 会自动根据对象的属性名匹配 SQL 语句中的占位符。
public class User {private int id;private String name;private int age;// getters and setters
}public interface UserMapper {@Insert("INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})")int insertUser(User user);
}
在这个例子中,#{id}
, #{name}
, #{age}
分别对应传入的 User
对象的属性。
2. 传递嵌套对象
如果 Java 对象中包含了嵌套对象,MyBatis 也支持通过嵌套属性进行参数映射。
public class Address {private String city;private String state;// getters and setters
}public class User {private int id;private String name;private Address address;// getters and setters
}public interface UserMapper {@Select("SELECT * FROM users WHERE city = #{address.city} AND state = #{address.state}")List<User> selectUsersByAddress(User user);
}
在这个示例中,#{address.city}
和 #{address.state}
分别映射 User
对象中的 Address
对象的属性。
四、MyBatis 集合参数处理
MyBatis 支持传递集合类型(如 List
、Map
等)作为 SQL 语句的参数,常用于 IN
查询或批量插入操作。
1. List 参数
MyBatis 可以直接传递 List
类型的参数,通常用于 IN
查询中。
@Select("SELECT * FROM users WHERE id IN (#{ids})")
List<User> selectUsersByIds(@Param("ids") List<Integer> ids);
在 XML 中,使用 foreach
标签可以灵活处理 List
参数。
<select id="selectUsersByIds" resultType="User">SELECT * FROM users WHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach>
</select>
2. Map 参数
MyBatis 也可以将 Map
作为参数传递,常用于动态 SQL 查询。
public interface UserMapper {@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")List<User> selectUsersByMap(Map<String, Object> params);
}
调用时,可以构建一个 Map
来传递多个参数:
Map<String, Object> params = new HashMap<>();
params.put("name", "Alice");
params.put("age", 25);
List<User> users = userMapper.selectUsersByMap(params);
五、MyBatis 注解式参数处理
MyBatis 支持通过注解定义 SQL 语句,参数的绑定方式与 XML 配置相似。通过注解,开发者可以直接在 Mapper 接口中编写 SQL 语句和参数映射规则。
1. 简单注解参数
可以直接使用 #{}
绑定参数,SQL 语句通过 @Select
、@Insert
、@Update
等注解直接定义在接口方法上。
public interface UserMapper {@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")List<User> selectUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
}
2. 复杂动态 SQL
对于复杂 SQL 或动态 SQL,也可以在注解中实现,配合 MyBatis 的 @Param
进行灵活的参数传递。
@Select("<script>" +"SELECT * FROM users WHERE 1=1 " +"<if test='name != null'> AND name = #{name} </if>" +"<if test='age != null'> AND age = #{age} </if>" +"</script>")
List<User> selectUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age);
在这个示例中,使用了 script
标签和 if
条件标签来实现动态 SQL 查询。
六、MyBatis 参数处理注意事项
1. 避免使用 ${}
直接拼接参数
尽量避免使用 ${}
拼接参数,因为它会直接将参数值插入到 SQL 中,容易引发 SQL 注入风险。除非是动态拼接表名、列名等不可避免的场景,推荐使用 #{}
进行参数绑定。
2. @Param
注解的使用
当传递多个参数时,最好使用 @Param
注解给每个参数命名,以提高代码的可读性,并防止自动生成的 param1
, param2
等名称引发混淆。
3. 参数映射与数据库字段的对应
确保 Java 对象中的字段名与数据库表的列名对应。如果命名不一致,可以使用 @Results
或者 XML 的 <resultMap>
来手动
指定映射关系。
七、总结
MyBatis 提供了丰富的参数处理机制,包括单个参数、多个参数、对象参数和集合参数的处理。通过 #{}
和 @Param
等方式,MyBatis 实现了对 SQL 语句中的参数绑定和动态 SQL 的灵活支持。合理使用 MyBatis 的参数处理机制,能够简化数据库操作代码,同时保持 SQL 语句的灵活性和可读性。
相关文章:
MyBatis参数处理
MyBatis 参数处理详解 在 MyBatis 中,参数处理是非常重要的部分,它支持灵活的参数传递方式,以实现与数据库的交互。MyBatis 提供了多种方式来传递参数,包括单个参数、多参数、Java 对象和集合等,这些参数通过 SQL 语句…...

Beyond 5.5旗舰版和高级版激光软件
Beyond 5.5旗舰版和高级版激光软件具有以下一些特点和功能: 1. 强大的功能特性: • 多媒体支持:它是真正的多媒体控制激光软件,除支持基本的激光图案外,还支持视频、3D 动画和绘图程序等,为用户提供了丰富…...

python爬虫/引用requests/基本使用
1.安装requests 进入控制台使用该命令安装requests pip3 install requests 2.对网站使用get请求 这里用对网站进行get请求,然后打印。 import requests //引用requestsresponse requests.get(urlhttps://www.bilibili.com/)print(response.text) 3.对网站使用…...

输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。
输电线塔目标检测数据集yolo格式 该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。 输电线塔目标检测数据集 数据集名称 输电线塔目标检测数据集(Transmission Tower Object Detecti…...

MySQL之基本查询(二)(update || delete || 聚合函数 || group by)
目录 一、表的更新update 二、表的删除delete 三、聚合函数 四、group by 分组查询 一、表的更新update 语法: UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...] 使用实列: ~ 将孙悟空同学的数学…...

全栈开发(五):初始化前端项目(nuxt3+vue3+element-plus)+前端代理
1.初始化前端项目 Nuxt3:搭建项目_nuxt3 项目搭建-CSDN博客、 2.配置代理 nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-configexport default defineNuxtConfig({devtools: { enabled: true },modules: ["element-plus/nuxt", "pinia/n…...

Linux环境变量进程地址空间
目录 一、初步认识环境变量 1.1常见的环境变量 1.2环境变量的基本概念 二、命令行参数 2.1通过命令行参数获取环境变量 2.2本地变量和内建命令 2.3环境变量的获取 三、进程地址空间 3.1进程(虚拟)地址空间的引入 3.2进程地址空间的布局和理解 …...

C++读取txt文件中的句子在终端显示,同时操控鼠标滚轮(涉及:多线程,产生随机数,文件操作等)
文章目录 运行效果功能描述代码mian.cppincludeMouseKeyControl.hTipsManagement.h srcMouseControl.cppTipsManagement.cpp 运行效果 功能描述 线程一:每隔n随机秒,动一下鼠标滚轮,防止屏幕息屏。 线程二:运行时加载txt文件中的…...
Android 中使用高德地图实现根据经纬度信息画出轨迹、设置缩放倍数并定位到轨迹路线的方法
一、添加依赖和权限 在项目的build.gradle文件中添加高德地图的依赖: implementation com.amap.api:maps:latest_version在AndroidManifest.xml文件中添加必要的权限: <uses-permission android:name"android.permission.ACCESS_FINE_LOCATIO…...

LeetCode从入门到超凡(二)递归与分治算法
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档;在算法设计中,递归和分治算法是两种非常重要的思想和方法。它们不仅在解决复杂问题时表…...

superset 解决在 mac 电脑上发送 slack 通知的问题
参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…...
SQL_UNION
在 SQL 中使用 UNION 操作符时,被联合的两个或多个 SELECT 语句的列数必须相同,并且相应的列数据类型也需要兼容。这是因为 UNION 操作符会将结果组合成单个结果集,每个 SELECT 语句的结果行将按顺序放置在结果集中。 例如,如果你…...
高等代数笔记(2)————(弱/强)数学归纳法
数学归纳法的引入情景其实很简单,就是多米诺骨牌。 推倒所有多米诺骨牌的关键就是推倒第一块,以及确保第一块倒下后会带动第二块,第二块带动第三块,以此类推,也就是可以递推。由此我们可以归纳出所有的多米诺骨牌都可…...

模拟自然的本质:与IBM量子计算研究的问答
量子计算可能是计算领域的下一个重大突破,但它的一般概念仍然处于炒作和猜测的现状?它能破解所有已知的加密算法吗?它能设计出治愈所有疾病的新分子吗?它能很好地模拟过去和未来,以至于尼克奥弗曼能和他死去的儿子说话…...
Robot Operating System——带有时间戳和坐标系信息的多边形信息
大纲 应用场景1. 机器人导航场景描述具体应用 2. 环境建模场景描述具体应用 3. 路径规划场景描述具体应用 4. 无人机飞行控制场景描述具体应用 5. 机械臂运动控制场景描述具体应用 6. 自动驾驶车辆控制场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::PolygonStamped …...

内网穿透(当使用支付宝沙箱的时候需要内网穿透进行回调)
内网穿透 一、为什么要使用内网穿透: 内网穿透也称内网映射,简单来说就是让外网可以访问你的内网:把自己的内网(主机)当做服务器,让外网访问 二、安装路由侠 路由侠-局域网变公网 (luyouxia.com) 安装成功如下: 三…...

Contact Form 7最新5.9.8版错误修复方案
最近有多位用户反应Contact Form 7最新5.9.8版的管理页面有错误如下图所示 具体错误文件的路径为wp-content\plugins\contact-form-7\admin\includes\welcome-panel.php on line 153 找到welcome-panel.php这个文件编辑它,将如下图选中的部分删除 删除以后…...

【第十一章:Sentosa_DSML社区版-机器学习之分类】
目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…...

kafka3.8的基本操作
Kafka基础理论与常用命令详解(超详细)_kafka常用命令和解释-CSDN博客 [rootk1 bin]# netstat -tunlp|grep 90 tcp6 0 0 :::9092 :::* LISTEN 14512/java [rootk1 bin]# ./kafka-topics.s…...

如何检测并阻止机器人活动
恶意机器人流量逐年增加,占 2023 年所有互联网流量的近三分之一。恶意机器人会访问敏感数据、实施欺诈、窃取专有信息并降低网站性能。新技术使欺诈者能够更快地发动攻击并造成更大的破坏。机器人的无差别和大规模攻击对所有行业各种规模的企业都构成风险。 但您的…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...