深入理解MyBatis中的#{ }和${ }占位符及参数传递过程

深入理解MyBatis中的#{ }和${ }占位符及参数传递过程

MyBatis是一个广泛使用的持久层框架,它以其强大的数据库访问能力和灵活的SQL映射配置而著称。在MyBatis中,#{ } 和 ${ } 是两种常用的占位符,用于构建动态的SQL语句。本文将深入研究这两种占位符的用法、区别,并详细探讨参数在MyBatis中的传递和接受过程。

1. #{ } 占位符

#{} 占位符是MyBatis中用于预处理参数的标志。它具有以下特点:

  • 安全性: #{} 通过预编译的方式将参数安全地插入SQL语句,有效防止SQL注入攻击。
  • 类型转换: MyBatis会根据参数的类型进行自动类型转换,确保与数据库字段的类型匹配。

1.1 使用示例:

xml 复制代码
<!-- 在Mapper XML文件中的使用 -->
<select id="selectUserById" resultType="User">
    SELECT * FROM users WHERE id = #{userId}
</select>

在这个示例中,#{userId} 将被预处理为一个占位符,保证了SQL的安全性和可读性。

2. ${ } 占位符

${} 占位符用于直接替换变量,在SQL语句执行前,会将 ${} 替换为实际的变量值。它具有以下特点:

  • 直接替换: ${} 不进行预处理,而是直接替换为变量值。
  • 潜在风险: 由于直接替换,使用 ${} 时要小心,防止SQL注入攻击。

2.1 使用示例:

xml 复制代码
<!-- 在Mapper XML文件中的使用 -->
<select id="selectUserByName" resultType="User">
    SELECT * FROM users WHERE name = '${userName}'
</select>

在这个示例中,${userName} 会被直接替换为实际的用户名值。使用 ${} 时要注意输入值的安全性,以避免潜在的SQL注入问题。

3. 参数传递与接受过程

在MyBatis中,参数的传递和接受过程通常通过Mapper接口方法实现。以下是一个简单的例子:

3.1 Mapper 接口方法:

java 复制代码
// 在Mapper接口中定义一个方法,方法的参数为userName
User selectUserByName(@Param("userName") String userName);

3.2 Mapper XML 文件:

xml 复制代码
<!-- 在Mapper XML文件中的使用 -->
<select id="selectUserByName" resultType="User">
    SELECT * FROM users WHERE name = #{userName}
</select>

3.3 Java 代码中调用 Mapper 方法:

java 复制代码
// 在Java代码中调用Mapper方法,并传递参数userName
String userName = "John";
User user = userMapper.selectUserByName(userName);

在这个例子中,${userName} 的值是从 selectUserByName 方法的参数中获取的。在实际应用中,${userName} 的值可以通过用户输入、其他方法的返回值等途径获得。

4. 最佳实践

在实际项目中,推荐使用 #{} 占位符,特别是涉及用户输入的地方,以确保SQL的安全性。只有在确定输入值的安全性的情况下,才考虑使用 ${}。

总体而言,了解和正确使用 #{} 和 ${} 占位符是写出安全、高效SQL查询的关键。通过本文的介绍,希望能够更深入地理解这两种占位符在MyBatis中的应用和差异,并在实际项目中选择合适的占位符来构建动态SQL语句。同时,理解参数的传递和接受过程将有助于更有效地利用MyBatis的功能。

相关推荐
掘金者阿豪2 分钟前
集中式与分布式数据库怎么选?从架构原理到电科金仓的实践思考
前端·后端
张彦峰ZYF34 分钟前
升级了不等于变好了:AI回归测试的固定评测集、版本对比、质量阈值与CI门禁
人工智能·后端·模型或提示词升级·语言模型没有编译器与确定性输出·总体、切片与回退清单·红线、护栏与目标·ci门禁把判定写进合并路径
尼克陈36 分钟前
自媒体平台账号多登-辛小蜂
程序员
程序员沉梦听雨39 分钟前
【搜索引擎】Kibana使用指南
java·后端·学习笔记
Cosolar1 小时前
极简智库(MiniDocs):docsify、VitePress、Notion 等知识库搭建服务的完美替代
前端·后端·架构
Goboy1 小时前
夯爆了,我被一个一句话接入的免费可观测平台策反了,那一刻我决定放弃用了3年的Prometheus
后端·docker·kubernetes
回家路上绕了弯2 小时前
Agent in the Sandbox:当 AI 有了自己的开发环境
后端
陈随易2 小时前
TanStarter,从搭建到支付,一步到位开始赚美元
前端·后端·程序员
Rain的Java大神之路2 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
挖掘狂人2 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql