深入理解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的功能。

相关推荐
若阳安好8 分钟前
【备忘录】正则表达式
后端·正则表达式·restful
Jinuss31 分钟前
代码质量管理工具-SonarQube
前端·代码规范
Cosolar33 分钟前
AI Agent 的记忆战争:OpenClaw vs Hermes vs QwenPaw vs HiClaw,谁真正"记得住"?
人工智能·后端·面试
M ? A1 小时前
VuReact:Vue转React的增量编译利器
前端·vue.js·后端·react.js·面试·开源·vureact
aircrushin1 小时前
给宝宝办了个宴,朋友用trae做的工具帮了大忙
前端·后端
码上小翔哥1 小时前
Jackson 配置深度解析
java·后端
程序员Sunday1 小时前
爆肝万字!这应该是全网最全的 Codex 实战教程了
前端·后端·ai编程
aircrushin1 小时前
朋友用trae搭建的工具,解决了旅行拍照共享的大事儿
前端·后端
星栈1 小时前
把业务逻辑写成纯函数之后,我再也不想写 Service 层了
后端·开源
未秃头的程序猿1 小时前
如何用 AI 写出符合规范的 Java 代码?我总结了 7 条有效建议
java·后端·ai编程