MyBatis中 #{} 和 ${} 的区别小结

 更新时间:2024年12月08日 09:26:37   作者:这孩子叫逆  
MyBatis中#{}和${}是两种占位符,本文就来介绍一下MyBatis中 #{} 和 ${} 的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在MyBatis中,#{}${}是两种常见的占位符,它们的作用和使用场景有所不同。理解它们的区别对于正确使用MyBatis非常重要。

在Mybatis面试中常涉及到关于#{}和${}的区别

1、#{}是预编译处理,$ {}是字符串替换。

2、MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

3、使用 #{} 可以有效的防止SQL注入,提高系统安全性。

1. #{} 和 ${} 的基本区别

#{}:SQL参数占位符

作用#{}用于将传入的参数安全地绑定到SQL语句中,它会自动使用PreparedStatement?占位符机制,并且MyBatis会对传入的参数进行预处理(例如防止SQL注入)。

参数替换:在生成SQL语句时,#{}会被替换为一个?,然后由JDBC驱动程序将参数值绑定到这个?占位符上。

使用场景:通常用于传递用户输入的参数,如查询条件、插入或更新的数据等。

示例

<select id="findUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>
  • 如果传入的id为1,MyBatis生成的SQL类似于:SELECT * FROM users WHERE id = ?,然后通过PreparedStatement?替换为1。

${}:SQL文本占位符

作用${}用于直接将传入的参数值替换到SQL语句中,它不会进行预处理,因此直接将参数值插入到SQL语句中。这意味着${}会将参数视为SQL的一部分,可能会导致SQL注入风险。

参数替换:在生成SQL语句时,${}会直接将传入的值替换到SQL语句中,而不会使用?占位符。

使用场景:通常用于动态生成SQL片段,比如排序字段名、表名、列名等不直接来自用户输入的参数。

示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>
  • 如果传入的columnNameusernamevalueJohn,MyBatis生成的SQL类似于:SELECT * FROM users WHERE username = ?,然后通过PreparedStatement?替换为John

2. 安全性和使用建议

  • SQL注入防护:由于#{}会使用PreparedStatement的参数绑定机制,因此可以有效防止SQL注入攻击。而${}直接将参数值拼接到SQL中,可能导致SQL注入,因此应慎重使用。

  • 动态SQL生成${}更适合用于生成动态的SQL片段,比如动态表名、列名等。但要确保传入的值是可信任的,或者通过其他手段确保安全。

3. 具体示例

使用 #{} 的示例

<select id="findUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>

传入id为1,生成SQL为:

SELECT * FROM users WHERE id = ?

然后将参数1安全地绑定到?上。

使用 ${} 的示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>

传入columnNameusernamevalueJohn,生成SQL为:

SELECT * FROM users WHERE username = ?

然后将参数John绑定到?上。

SQL注入风险示例

<select id="findUserByColumn" resultType="User">
    SELECT * FROM users WHERE ${columnName} = #{value}
</select>

如果传入的columnNameusername OR '1'='1',生成的SQL可能是:

SELECT * FROM users WHERE username OR '1'='1' = ?

这样就可能导致SQL注入问题。

总结

  • #{}:安全地传递参数,防止SQL注入,常用于传递用户输入的参数。

  • ${}:直接将参数值插入到SQL中,适用于动态生成SQL片段(如表名、列名),但存在SQL注入风险,应谨慎使用。

在实际开发中,建议尽量使用#{}来传递参数,以确保SQL安全性,而对于使用${}的场景,需要确保传入的参数是安全且经过验证的。

到此这篇关于MyBatis中 /#{} 和 /${} 的区别小结的文章就介绍到这了,更多相关MyBatis  /#{} 和 /${}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 入门JDK集合之HashMap解析

    入门JDK集合之HashMap解析

    HashMap---基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同
    2021-06-06
  • Spring IOC源码剖析_如何整体认知Spring体系结构

    Spring IOC源码剖析_如何整体认知Spring体系结构

    这篇文章主要介绍了Spring IOC源码剖析_如何整体认知Spring体系结构方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Jenkins build记录清理,释放磁盘空间方式

    Jenkins build记录清理,释放磁盘空间方式

    Jenkins构建记录会占用大量磁盘空间,需要定期清理,可以通过JenkinsJob配置中的&ldquo;丢弃旧的构建&rdquo;(DiscardOldBuilds)来清理
    2025-11-11
  • 浅谈Sharding-JDBC强制路由案例实战

    浅谈Sharding-JDBC强制路由案例实战

    本文主要介绍了浅谈Sharding-JDBC强制路由案例实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Eclipse 项目出现错误(红色叹号)解决方法

    Eclipse 项目出现错误(红色叹号)解决方法

    这篇文章主要介绍了Eclipse 项目出现错误(红色叹号)解决方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • SpringBoot3使用Apache Tika实现多格式文件内容提取

    SpringBoot3使用Apache Tika实现多格式文件内容提取

    做后端开发久了,难免碰到这类刚需:用户上传Word、PDF、Excel、Txt各种文档,后台得自动扒出文本做内容审核、全文检索或者数据库归档,所以本文使用 Apache Tika 搞定全格式解析,需要的朋友可以参考下
    2026-03-03
  • Springboot使用@WebListener 作为web监听器的过程解析

    Springboot使用@WebListener 作为web监听器的过程解析

    这篇文章主要介绍了Springboot使用@WebListener作为web监听器的过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java 数组分析及简单实例

    Java 数组分析及简单实例

    这篇文章主要介绍了Java 数组分析及简单实例的相关资料,在Java中它就是对象,一个比较特殊的对象,需要的朋友可以参考下
    2017-03-03
  • Java数组,去掉重复值、增加、删除数组元素的实现方法

    Java数组,去掉重复值、增加、删除数组元素的实现方法

    下面小编就为大家带来一篇Java数组,去掉重复值、增加、删除数组元素的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java中的StringBuilder()常见方法详解

    Java中的StringBuilder()常见方法详解

    StringBuilder是一个可变的字符序列,此类提供一个与 StringBuffer 兼容的 API,但不保证同步,这篇文章主要介绍了StringBuilder()常见方法,需要的朋友可以参考下
    2023-09-09

最新评论