Mybatis Mapper文件中的$和#的区别

本文通过一个具体的案例,介绍了在MyBatis的Mapper文件中使用$和#符号的区别。作者在开发过程中遇到SQL注入的问题,最终发现是因为误用了$符号而非#导致的。文章解释了使用#可以避免SQL注入风险,并给出了官方文档的相关说明。

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

Mybatis Mapper文件中的$和#的区别

最近在做一个很简单的更新api接口时,遇到了一个错误。这个错误虽然让我郁闷,因为当程序更新我本地数据库的时候是能正常执行的,但是其他同事对接的时候他本地数据库时会报错(数据库结构一模一样)。

  • 先查测试数据
    假设这个api接口需要传递一个id的参数,我测试的时候传的是123,而其他同事传的是123f。我的能成功,他的不行,刚开始在想会不会是他动了数据库,于是我用他的数据来测试,结果我的也失败了。

  • 看异常输出
    Java.sql.SQLException:Unknown column ‘123f’ in ‘where clause’,并打印出了SQL语句 update _company_test set status = ? where id = 123f. 看到这我就纳了闷,我命名传入的是字符串为何通过mybatis传输之后没有了引号了?

原来,我在mapper文件中将#写成了$,改回#后不再报错了。

那么,为什么呢?引用官方文档中的一段话

By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement.

官方给出的例子是 ORDER BY ${columnName}。于是,我算是终于搞明白了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值