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 年所有互联网流量的近三分之一。恶意机器人会访问敏感数据、实施欺诈、窃取专有信息并降低网站性能。新技术使欺诈者能够更快地发动攻击并造成更大的破坏。机器人的无差别和大规模攻击对所有行业各种规模的企业都构成风险。 但您的…...
CGI Studio 3.11:AI驱动与安全合规的嵌入式HMI开发平台解析
1. 项目概述:为什么我们需要CGI Studio这样的HMI设计工具?在嵌入式系统开发领域,尤其是在汽车、工业和高端家电行业,图形用户界面的复杂度和美观度要求正以前所未有的速度提升。十年前,一个简单的单色LCD屏幕配上几个按…...
区块链跨链桥接:原理与实现
区块链跨链桥接:原理与实现 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊区块链跨链桥接这个重要话题。作为一个Web3探索者,跨链技术是连接不同区块链生态的关键。今天就来分享一下跨链桥接的原理和实现方式。 什…...
告别FTP!用Go写的Filebrowser,一个命令搞定Windows/Linux跨平台文件管理
告别FTP!用Go语言构建的Filebrowser,一条命令实现全平台文件管理革命 在服务器管理和跨平台文件共享的日常工作中,传统FTP工具早已显露出诸多不便:复杂的客户端配置、不直观的界面操作、安全隐患频发。而现代开发者需要的…...
C语言泛型编程与类型安全 - C11的高级特性
引言 C语言通常被认为不支持泛型编程,但实际上通过巧妙的设计模式和C11标准的新特性,我们可以在C语言中实现类型安全的泛型代码。 本文将深入讲解如何使用void指针、宏技巧和C11的_Generic关键字实现泛型编程,让你的代码更加灵活和可复用。 一、void指针泛型基础 1.1 vo…...
LinuxVLAN接口异常定位实战
LinuxVLAN接口异常定位实战这是一篇面向中级 Linux 使用者的技术文章,主题聚焦在VLAN接口,重点讨论链路隔离、子接口和二层网络划分。在真实生产环境中,VLAN接口相关问题往往不会以单一错误形式出现,而是混杂在日志、权限、资源状…...
终极Axel下载加速指南:让你的文件下载速度翻倍
终极Axel下载加速指南:让你的文件下载速度翻倍 【免费下载链接】axel Lightweight CLI download accelerator 项目地址: https://gitcode.com/gh_mirrors/ax/axel Axel是一款轻量级命令行下载加速工具,通过多线程技术显著提升文件下载速度。无论你…...
告别手动传Token!用JMeter的JSON Extractor搞定接口自动化登录(附实战配置)
告别手动传Token!用JMeter的JSON Extractor实现无缝接口自动化登录 在接口测试的世界里,登录态管理就像一场永无止境的接力赛——每次请求都需要准确传递Token这个"接力棒"。传统的手工复制粘贴Token不仅效率低下,更是自动化测试流…...
【信号处理】基于高斯函数的Caputo-Fabrizio分数阶导数闭式表达式及其在信号处理中的应用附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量m…...
工厂考勤数据分散怎么破?实在Agent助力企业数字化转型实现非侵入式数据整合
摘要: 我是企业架构师老王。在2026年的今天,尽管智能制造已进入深水区,但“工厂考勤数据分散、打卡请假加班数据无法自动整合”依然是困扰无数中大型制造企业的“顽疾”。传统的API集成方案在面对老旧系统和复杂的异构环境时,往往…...
液压串联弹性驱动器融合的双足机器人运动控制方法【附算法】
✨ 长期致力于双足机器人、运动控制、液压SEA、导纳控制、参数优化、快速步行研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于无源性扰动观测器的…...
