首页 > 基础资料 博客日记
MyBatis中#和$的区别
2023-09-19 22:29:03基础资料围观445次
MyBatis中#{}和${}的用法
说一下为什么要写这篇文章,最近面试有被问到,一下子想不出来有啥区别,想记录一下加深自己的理解,同时自己也经常用MyBatis-Plus忽略了XML文件的编写和使用,所以需要加深一下这块的知识
一、例子
1、#{}将传入的数据当作一个字符串,会对传入的数据加上一个双引号。
比如
select * from student where student_name = #{studentName}
如果传入的值为zhangxiangwei,那么经过Mybatis解析完成之后的语句是
select * from student where student_name="zhangxiangwei"
2.${}将传入的数据直接显示生成在sql中。
比如
select ${fieldName} from user where user_age = 22
此时,传入的参数作为要查询的字段,如果传入的值为user_name,则解析成的sql为:
select user_name from user where user_age = 22
二、区别
1.#{}方式能够很大程度上防止sql注入,${}无法防止sql注入。
2.${}方式一般用于传入数据库对象,例如列表和表名,#{}方式一般用来传递接口传输过来的具体数据。
3.由于#{}方式具有更高的安全行,所以能用#{}的地方尽量不要使用${}。
4.Mybatis排序时使用order by动态参数时需要注意,用${}而不是#{}。
5.#
符号(Pound Sign):
-
#
符号用于参数值的占位,会将参数值进行预编译,并在执行SQL语句时将参数值安全地传递给数据库,防止SQL注入攻击。 -
适用于大多数情况,尤其是当参数值来自用户输入或不可信数据时,是更安全的选择。
-
参数值会被自动转义,不需要担心特殊字符的处理。
-
使用
#
符号会产生预编译的SQL语句,可以提高数据库的性能,因为数据库可以缓存相同的预编译语句。 -
<!-- 使用#符号进行参数占位 --> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{userId} </select>
6.$
符号(Dollar Sign):
-
$
符号用于简单的值替换,不进行预编译,直接将参数的值嵌入SQL语句中。 -
适用于那些不需要参数值预编译,且参数值是确定且可信的情况,比如用于动态拼接SQL语句的情况。
-
使用
$
符号时,需要小心防止SQL注入攻击,需要手动处理参数值的安全性。 -
不会产生预编译的SQL语句,可能会导致数据库性能较低,因为每次SQL语句都会重新解析和执行。
-
<!-- 使用$符号进行简单值替换 --> <select id="getUserByName" parameterType="string" resultType="User"> SELECT * FROM users WHERE username = '${username}' </select>
三、最后说一下 $ 动态 拼接SQL
下面是一个实例
<select id="getUsersWithDynamicSorting" parameterType="map" resultType="User">
SELECT * FROM users
WHERE 1=1 <!-- 为了方便拼接,可以始终使用一个始终成立的条件 -->
<!-- 根据参数动态拼接排序字段和排序顺序 -->
<if test="sortField != null and sortOrder != null">
ORDER BY ${sortField} ${sortOrder}
</if>
</select>
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- springboot~3.x项目中使用集成测试
- Java测试类、工具类与JavaBean对比解析
- SpringBoot-日志
- springboot~http2的支持
- 解疑释惑 - 日志体系之 slf4j + logback 组合(一)
- Web server failed to start. Port 8080 was already in use. 端口被占用
- Springboot 项目配置多数据源
- 伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 05
- 剑指offer-23、搜索⼆叉树的后序遍历序列
- 一个表示金额的数字是 100000000L,这是多少米?