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

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}。于是,我算是终于搞明白了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值