关于mybatis中#和$占位符理解,导致sql语句的条件失效

文章讨论了在使用MyBatis时,#和$占位符的区别和应用场景。#用于PreparedStatement,提高效率并防止SQL注入,适合列值;$则用于Statement,可能存在安全风险,适用于表名或列名。特别指出,当需要动态指定列名时,由于#会将字符串包围在双引号中,导致错误,此时应使用$。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前总觉得自己把mybatis、mysql学习的很好了,但是这次发现使用过程中,很多小细节还是掌握的不到位

做项目中,mybatis的占位符很常用,#和$的区别如下,

#占位符的特点

  1. MyBatis处理 #{ } 占位符,使用的 JDBC 对象是 PreparedStatement 对象,执行sql语句的效率更高。
  2. 使用 PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。
  3. #{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。

$占位符的特点

  1. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。
  2. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。
  3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。
  4. ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。

这几点大多都耳熟能详,但是真到应用中还是不能使用的得心应手。

在使用过程中,有一个很大的坑需要注意,容易导致sql语句报错或者sql语句的条件无效
比如要将查询出来的数据,按照某一列升序或降序排列;或者传入一个字段名称,在sql语句中使用。具体是哪一个列,是由前端或者后台传递过来。在这样的场景下,就必须要使用到 ${ }占位符,而不能使用#{ }占位符。因为:#{ }占位符使用的时候,如果传递过去的是一个字符串,那么最终生成的SQL语句,会自动使用双引号包裹住字符串。

这一点也对应$占位符的第四点,但是在使用过程中很容易忽略,我自己再mark一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值