网站改版怎么弄,团购网站发展,定兴做网站的,精准营销的三大要素大家好#xff0c;我是烤鸭#xff1a; 遇到一个maybatis传参的问题。 如果传参是数字逗号的形式#xff0c;比如1,2,3,4,5。 问题复现#xff1a;
项目中查询sql和navicat查询sql结果不一致。
1 项目中#xff1a;
如图所示#xff0c;查到一条数据。 可以看到…大家好我是烤鸭 遇到一个maybatis传参的问题。 如果传参是数字逗号的形式比如1,2,3,4,5。 问题复现
项目中查询sql和navicat查询sql结果不一致。
1 项目中
如图所示查到一条数据。 可以看到上面设置进去的参数是String类型的也就是 IN (1,2,3,4,5)。很显然这不是我们想要的。
2. navicat中
同样的sql复制到navicat里是5条。 3. 查找原因
为什么会有这个问题呢。 为了找问题将传入的参数写死是没有问题的。 问题在于#符号#是先生成sql后采用占位符的方式将参数放进去。 4. 解决方式
知道问题就比较好改了将#换成$就可以了。
$是在sql生成时把参数传入sql中。#是在sql后将参数生成到占位符上。 这篇文章从源码角度说了两者的区别。
http://www.importnew.com/25791.html
$的第二种写法更麻烦了没必要
select idselectByFlowIds resultTypePreAuthorizeHnydExpendFlowSELECTinclude refidpreAuthorizeHnydExpendFlowColumns/FROM pre_authorize_hnyd_expend_flow aWHERE 1 1AND FIND_IN_SET(a.expend_id, #{flowIds})if testflowIds ! null and flowIds! AND a.expend_id INforeach collectionflowIds.split(,) itemflowId indexindex open( close) separator,#{flowId}/foreach/if
/select
但是我们都知道$会有sql注入的风险用#改写这个采用mysql的FIND_IN_SET函数。
select idselectByFlowIds resultTypePreAuthorizeHnydExpendFlowSELECTinclude refidpreAuthorizeHnydExpendFlowColumns/FROM pre_authorize_hnyd_expend_flow aWHERE 1 1AND FIND_IN_SET(a.expend_id, #{flowIds})
/select
总结一下
来源
https://www.cnblogs.com/friends-wf/p/4227999.html
mybatis中的#和$的区别
#相当于对数据 加上 双引号$相当于直接显示数据
1. #将传入的数据都当成一个字符串会对自动传入的数据加一个双引号。如order by #user_id#如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id则解析成的sql为order by id. 2. $将传入的数据直接显示生成在sql中。如order by $user_id$如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id则解析成的sql为order by id. 3. #方式能够很大程度防止sql注入。 4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象例如传入表名. 6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意用$而不是# 字符串替换 默认情况下使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值比如?。这样做很安全很迅速也是首选做法有时你只是想直接在SQL语句中插入一个不改变的字符串。比如像ORDER BY你可以这样来使用 ORDER BY ${columnName} 这里MyBatis不会修改或转义字符串。
重要接受从用户输出的内容并提供给语句中不变的字符串这样做是不安全的。这会导致潜在的SQL注入攻击因此你不应该允许用户输入这些字段或者通常自行转义并检查。