关于:Mbatis 访问数据的#{}和¥{}说明:
亲身体验,并不是#对所有的数据都默认加引号
如果传入的是字符串类型数据 参数用#{}访问就会加引号;如果不是则不会加引号(如下面例子的的Long类型)
当然#能防止注入攻击
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
以下例子是用ibatis(mybatis同理,访问格式不同而已(ibatis#参数#,mybatis#{} ))
/**
* 如果说插入的参数是数值类型的,#映射不会加上'';这时候如果数据库里的对应字段是字符类型,且存在字符数据的时候;就会报错;
* 所以一般我们还是需要数据库类型和参数类型对应
* @param registerNo
* @return
*/
public Long getFarePublishByRegisterNoAndType(Long registerNo,String registerType){
Long baseFareId = null;
try{
Map<String,Object> params = new HashMap<String, Object>();
params.put("registerNo", registerNo);//参数数值型;#访问不会加''
params.put("registerType", registerType);
baseFareId = (Long)getSqlMapRepository().queryByObject("getBaseFareInterByRegisterNoAndType",params);
} catch (Exception a) {
a.printStackTrace();
}
return baseFareId;
}
sql是这样的:其中DISPLAY_NO在数据库里是varchar2类型;传入的registerNo是Long类型
<select id="getBaseFareInterByRegisterNoAndType" parameterClass="java.util.HashMap" resultClass="java.lang.Long">
<![CDATA[ SELECT T.ID FROM T_BASE_FARE_INTER T WHERE T.DISPLAY_NO=#registerNo# AND T.FARE_TYPE=#registerType# ]]>
</select>
由于插入的参数registerNo 是数值类型的,#映射不会加上”;所以如果存在一条 DISPLAY_NO 字段非数值型数据的记录,就会报错
解决方法:
- 我们应该尽量保存数据库中字段类型和参数类型对应;
public Long getFarePublishByRegisterNoAndType(Long registerNo,String registerType){
Long baseFareId = null;
try{
Map<String,Object> params = new HashMap<String, Object>();
params.put("registerNo", registerNo.toString());//参数字符型;#访问会加''
params.put("registerType", registerType);
baseFareId = (Long)getSqlMapRepository().queryByObject("getBaseFareInterByRegisterNoAndType",params);
} catch (Exception a) {
a.printStackTrace();
}
return baseFareId;
}
- 显示加引号
<select id="getBaseFareInterByRegisterNoAndType" parameterClass="java.util.HashMap" resultClass="java.lang.Long">
<![CDATA[ SELECT T.ID FROM T_BASE_FARE_INTER T WHERE T.DISPLAY_NO='$registerNo$' AND T.FARE_TYPE=#registerType# ]]>
</select>