mybatis3的用户指南里关于字符串替换的解释是:
字符串替换
默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并以它为背景设
置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在 SQL 语
句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里 MyBatis 不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会
导致潜在的 SQL 注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检
查。
我在使用的Maper xml映射时
<select id="selectCartIdBymobileNo" parameterType="String" resultType="java.util.HashMap">
SELECT CAR.MOBILE_NO,CAR.WORK_RECORD_ID FROM T_CAR_SOURE_INFO CAR WHERE CAR.MOBILE_NO IN (${mobileNos})
</select>
使用Java调用如下:
String mobileNos = "'1303423****',''1303413****'";
SqlSession session = SqlMap.getSqlSessionFactory().openSession();
try{
List<Map<String,Object>> resultList = session.selectList("selectCartIdBymobileNo", mobileNos);
}finally{
session.close();
}
运行时报错 mybatis There is no getter for property named 'mobileNos' in 'class java.lang.String'
将 $ 换成 # 虽然不报错了,但是查询不出数据。
最后把 改成 ${value} 居然解决了这个问题。
现在分析认为,默认是使用#{} 这个没什么说的了,但是使用${} 时,因为框架支持了OGNL 所以会按照OGNL解析此语句,使用value为什么能够解决这个问题,本人现在还不明白,只是在网上搜了下,看到有人这样说。如有明白的,麻烦告知。
转自:http://hi.baidu.com/thinkingjava/item/5b40182c8f8b920c72863ea0