MyBatis 中 #{} 和 ${}的区别是什么?

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

  1. Mybatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ? 号,调用 PreparedStatement 的 set 方法来赋值;使用 #{} 可以有效的防止 SQL 注入,提高系统安全性;

  2. MyBatis 在处理 ${} 时,

就是把 ${} 替换成变量的值。

发表评论

后才能评论

评论(3)

  • Noya 普通 2022-07-16 4:38 下午

    SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中:1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=”111″, 如果传入的值是id,则解析成的sql为where username=”id”. 
    2、将传入的数据直接显示生成在sql中。如:where username={username},如果传入的值是111,那么解析成sql时的值为where username=111;如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
    在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

  • Q_Uattro 普通 2022-04-06 9:44 上午

    #{}:其本质是占位符,但是对于日期类型和字符串类型而言会自动加上单引号
    ${}:其本质是字符串拼接,但是对于日期类型和字符串类型的话需要手动加上单引号

  • 羽痕 普通 2021-10-25 7:21 下午

    #{}是占位符,${}是拼接符。