mybatis动态字段传值问题

mybatis动态字段传值问题

开发时有这样一个需求,sql语句的字段根据传值查询

一般都会这样写

1
select * from  Student where #{fieldname} select * from  Student where #{fieldname} like "%"#{keywords}"%"

但这条sql语句查出来的结果为0;

原因在于#{}为了防止sql注入都会给传入的参数加一个双引号,也就是上面的sql语句实际是这样的:

1
2
fieldname:"name",keywords="杨"
select * from Student where "fieldname" fieldname:"name",keywords="杨"
select * from Student where "fieldname" like "%杨%"

数据库找不到字段 “fieldname” ,所以查询结果为0;

所以这种情况下就可以用到${},${}将传入的参数直接显示生成在sql中,不会添加引号。

1
2
3
4
fieldname:"name",keywords="杨"
select * from Student where ${fieldname} like "%"#{keywords}"%"
生成为
select * from Student where name fieldname:"name",keywords="杨"
select * from Student where ${fieldname} like "%"#{keywords}"%"
生成为
select * from Student where name like "%杨%"

所以#{}可以防止sql注入,在我们确定传入的值是安全的情况下,例如传的变量字段,那么就可以使用${}。


mybatis动态字段传值问题
https://evanyangtobegreatest.github.io/2022/09/01/mybatis动态字段传值问题/
作者
Evan
发布于
2022年9月1日
许可协议