Mybatis的 #{}与${}区别

在mybatis查询时,参数传递方式可以是#{}或者是$ {}。
两者的区别是:
一, #{}传参时会将传入参数当成是一个字符串,为这个字符串加上引号。而$ {}则不会加引号 例:

select * from user where name = #{name}  //如果传的name是"小明"
对应的sql执行的语句就是
select * from user where name = "小明"

select * from user where name = ${name}
对应执行
select * from user where name = 小明 //这中查询条件对应的值就一般都会用#,不加”“的话sql无法执行
${}一般用来传表名、字段名等数据库对象,如:order by ${}

二 , #{}能够很大程度防止sql注入,而${}无法防止sql注入,所以能用#{}的时候就尽量使用#{}。
为什么说#{}能防止sql注入:
#{}在mybatis中的底层是运用了PreparedStatement 预编译,传入的参数会以 ? 形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成,而 $ {}则没有使用预编译,传入的参数直接和sql进行拼接,由此会产生sql注入的漏洞。
$ {}没有预编译会造成sql注入的例子:

select * from user where name =  ${name} 

对于这样的sql语句,如果传参是 ** name = ‘sam or 1=1’ **
那么使用 ${}对应生成的sql就是:

select * from user where name = sam or 1=1

这样就会将全部数据查出来无法起到该有的作用,会带来较大问题。

MyBatis 中,`#{}` 和 `${}` 是两种用于处理参数的语法,它们的主要区别在于 SQL 注入安全性、参数处理方式以及使用场景。 - `#{}` 是预编译占位符,MyBatis 会将其视为 JDBC `PreparedStatement` 中的参数标记。使用 `#{}` 时,MyBatis 会自动对参数进行类型处理和安全转义,从而有效防止 SQL 注入问题。这种写法适用于大多数参数传递场景,尤其是在需要将用户输入作为查询条件时[^1]。 ```sql SELECT * FROM users WHERE username = #{username}; ``` 上述语句中,`#{username}` 会被替换为 `?`,然后通过 `PreparedStatement` 设置参数值。 - `${}` 是字符串替换占位符,MyBatis 会将其直接替换为参数值,不做任何转义或预编译处理。这种方式适用于需要动态拼接 SQL 片段的场景,例如动态表名、列名等。但正因为不做处理,`${}` 存在 SQL 注入风险,使用时需格外谨慎。 ```sql SELECT * FROM ${tableName} WHERE id = #{id}; ``` 在该语句中,`${tableName}` 会被直接替换为传入的表名字符串,而 `#{id}` 则仍作为安全参数处理。 ### 使用建议 - 优先使用 `#{}` 来处理参数,以确保 SQL 安全性。 - 只有在确实需要拼接 SQL 片段(如动态表名)时,才使用 `${}`,并且应确保传入的值是可信的或经过严格校验。 ### 示例对比 使用 `#{}` 的 SQL 语句: ```sql SELECT * FROM users WHERE id = #{id}; ``` 如果 `id = 123`,最终生成的 SQL 是: ```sql SELECT * FROM users WHERE id = ?; -- 参数绑定:123 ``` 使用 `${}` 的 SQL 语句: ```sql SELECT * FROM ${tableName} WHERE id = #{id}; ``` 如果 `tableName = "users"`,`id = 123`,最终生成的 SQL 是: ```sql SELECT * FROM users WHERE id = ?; -- 参数绑定:123 ``` ### 总结 `#{}` 和 `${}` 的核心区别在于是否进行预编译处理。`#{}` 提供了更高的安全性和更稳定的参数处理机制,而 `${}` 则提供了更灵活但风险更高的字符串替换功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值