广告位联系
返回顶部
分享到

MyBatis中 #{} 和 ${} 的区别介绍

java 来源:互联网 作者:佚名 发布时间:2024-12-09 22:45:28 人浏览
摘要

在MyBatis中,#{}和${}是两种常见的占位符,它们的作用和使用场景有所不同。理解它们的区别对于正确使用MyBatis非常重要。 在Mybatis面试中常涉及到关于#{}和${}的区别 1、#{}是预编译处理,$ {}是

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

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

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

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

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

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

#{}:SQL参数占位符

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

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

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

示例:

1

2

3

<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片段,比如排序字段名、表名、列名等不直接来自用户输入的参数。

示例:

1

2

3

<select id="findUserByColumn" resultType="User">

    SELECT * FROM users WHERE ${columnName} = #{value}

</select>

  • 如果传入的columnName为username,value为John,MyBatis生成的SQL类似于:SELECT * FROM users WHERE username = ?,然后通过PreparedStatement将?替换为John。

2. 安全性和使用建议

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

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

3. 具体示例

使用 #{} 的示例

1

2

3

<select id="findUserById" resultType="User">

    SELECT * FROM users WHERE id = #{id}

</select>

传入id为1,生成SQL为:

1

SELECT * FROM users WHERE id = ?

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

使用 ${} 的示例

1

2

3

<select id="findUserByColumn" resultType="User">

    SELECT * FROM users WHERE ${columnName} = #{value}

</select>

传入columnName为username,value为John,生成SQL为:

1

SELECT * FROM users WHERE username = ?

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

SQL注入风险示例

1

2

3

<select id="findUserByColumn" resultType="User">

    SELECT * FROM users WHERE ${columnName} = #{value}

</select>

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

1

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

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

总结

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

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • MyBatis中的N+1问题的解决方法
    N+1 问题是指在进行一对多查询时,应用程序首先执行一条查询语句获取结果集(即 +1),然后针对每一条结果,再执行 N 条额外的查询语句
  • MyBatis中 #{} 和 ${} 的区别介绍
    在MyBatis中,#{}和${}是两种常见的占位符,它们的作用和使用场景有所不同。理解它们的区别对于正确使用MyBatis非常重要。 在Mybatis面试中常
  • MyBatis实现CRUD的代码

    MyBatis实现CRUD的代码
    准备工作 创建module(Maven的普通Java模块):mybatis-002-crud pom.xml 打包方式jar 依赖: mybatis依赖 mysql驱动依赖 junit依赖 logback依赖 mybatis-config
  • MyBatis中if标签的基本使用

    MyBatis中if标签的基本使用
    在MyBatis框架中,if标签用于在构建SQL语句时,根据参数条件判断的结果,动态地选择加入或不加where条件中。 一 常见使用 在使用MyBatis处理
  • Java中的字节流和字符流介绍
    Java 中的输入输出(I/O)流主要分为字节流和字符流。这两类流为开发者提供了高效的文件读写方式,也解决了不同编码格式下的字符处理问
  • Java中缓冲流的使用与性能提升(让文件操作更高效
    在Java的I/O操作中,文件读写是常见且频繁的任务。特别是对于大文件或需要频繁访问文件的程序,如何提升I/O性能成为了一个重要的问题。
  • Java中如何自定义一个类加载器加载自己指定的类
    在 Java 中,类加载器(ClassLoader)负责把字节码文件(.class 文件)加载到 JVM 中,Java 的类加载机制给我们提供了高度的灵活性。通常情况下
  • Java实现Jar文件的遍历复制与文件追加

    Java实现Jar文件的遍历复制与文件追加
    一、引入依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 dependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version2.5/v
  • java中的Consumer、Supply如何实现多参数
    Java的Consumer接口只能接受一个参数,但可以通过自定义接口、使用Tuple或嵌套结构来实现对多个参数的处理,对于Supplier接口,它不能接受参数
  • 在Java中去除字符串末尾的换行符的常用方法
    在日常开发中,字符串操作是非常常见的需求,其中去除字符串末尾的换行符(\n)是一个很有代表性的场景。例如,从文件读取的文本、网
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计