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

编写SQL语句时,#{} 和 ${}的区别

 #{ }:参数占位符(推荐使用)

  • 处理方式:MyBatis 会将 #{} 替换为 SQL 中的 ? 占位符,然后通过 PreparedStatement 的 setXxx () 方法设置参数(预编译处理)。
  • 安全性:能自动防止 SQL 注入(因为参数是通过预编译传入,而非直接拼接 SQL)。
  • 适用场景:大多数参数传递(如查询条件、插入值等)。

示例

xml

<!-- Mapper.xml 中 -->
<select id="getUser" resultType="User">SELECT * FROM user WHERE id = #{userId}
</select>

MyBatis 会将其转换为预编译 SQL:

sql

SELECT * FROM user WHERE id = ?

${ }:字符串拼接(谨慎使用)

  • 处理方式:MyBatis 会直接将 ${} 替换为参数的字符串值,相当于直接拼接 SQL(无预编译)。
  • 安全性无法防止 SQL 注入(参数会被原样代入 SQL)。
  • 适用场景:需要动态拼接 SQL 关键字的场景(如排序字段、表名等,这些无法用 #{} 实现)。

示例

xml

<!-- Mapper.xml 中 -->
<select id="getUsers" resultType="User">SELECT * FROM user ORDER BY ${sortField}
</select>

若 sortField 的值是 "name DESC",拼接后 SQL 为:

sql

SELECT * FROM user ORDER BY name DESC

http://www.dtcms.com/a/300802.html

相关文章:

  • 一文读懂 JWT(JSON Web Token)
  • 使用橙武低代码平台做数据统计:定时任务汇总数据并生成日报表
  • 零基础学习性能测试:JVM性能分析与调优-JVM垃圾回收机制,GC对性能的影响
  • Gradio.NET 中文快速入门与用法说明
  • Python-初学openCV——图像预处理(四)——滤波器
  • Python 数据分析(四):Pandas 进阶
  • 负载均衡Haproxy
  • [NOIP 2004 提高组] 合并果子 Java
  • Vue 框架 学习笔记
  • 《汇编语言:基于X86处理器》第10章 结构和宏(1)
  • 【任务6.15】字符串操作
  • 51c自动驾驶~合集9
  • 以太坊ETF流入量超越比特币 XBIT分析买币市场动态与最新价格
  • 51核和ARM核单片机OTA实战解析(二)
  • docker与k8s的容器数据卷
  • 接口自动化-allure报告
  • 从零开始:Coze Studio开源版部署全记录(win11)
  • Leetcode力扣解题记录--第136题(查找单数)
  • note22:应用安全编码规范培训
  • 从零开始学习Dify-基于MCP的智能旅行规划助手上(八)
  • Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程
  • Jangow靶机通关教程
  • DAY21-二叉树的遍历方式
  • Gradio全解8——ChatInterfaceChatbot:聊天界面类与聊天机器人(3)——ChatInterface的多模态功能与附加输入输出
  • 9-大语言模型—Transformer 核心:多头注意力的 10 步拆解与可视化理解
  • 新手向:MySQL配置性能优化
  • unity开发中Hash、Queue、LinkedList简单介绍
  • 算法竞赛阶段二-数据结构(37)数据结构动态链表list
  • QT开发---网络编程下
  • 《C++》STL--string详解(上)