mybatis中的$和#區別
提前總結:
1mybatis中$取值不會自動給你轉為string型別,即不會給你自動在值得兩側加雙引號,用#取值會自動轉為String,自動加雙引號,這個大家都知道。
2如果實際傳的是個map,parameterType可以宣告為"java.lang.String",但此時取值只能使用#,不能使用$
3下面的是我這次遇到的坑:當xml中parameterType宣告為"java.lang.String"時,就一定不可以用$取值,只能用#,因為#才能確保你取到的值是String,否則會報
### The error occurred while setting parameters
挖坑填坑經歷如下:
AlarmCountResultMapper中:
Integer deleteAlarmCountResultLogical(Map<String, String> map);
xml檔案:
<update id="deleteAlarmCountResultLogical" parameterType="java.lang.String">
update alarm_count_result set
<if test="status != null and status != '' ">
status = #{status}
</if>
where id in ${id}
</update>
此時會報錯,id取到值不是(12),報錯內容:
### The error occurred while setting parameters
### SQL: update alarm_count_result set status = ? where id in com.ruisitch.bi:rsbi:war:4.0
報上面錯的原因,猜測是因為聲明瞭parameterType="java.lang.String",而$的取值結果是不會自動轉為String,所以在用$取值的時候直接報錯,即如果宣告parameterType為java.lang.String,用$取值一定會報錯
但是如果修改為下面,即取id的值使用#,能取到值,但是為String型別的(12)但是語法不對了,自動轉為String,sql實際為:
update alarm_count_result set status = 2 where id in “(12)”
即“”在括號的外邊,這當然也是錯誤的
<update id="deleteAlarmCountResultLogical" parameterType="java.lang.String">
update alarm_count_result set
<if test="status != null and status != '' ">
status = #{status}
</if>
where id in #{id}
</update>
正確的使用方式如下將parameterType宣告為:java.util.Map,id的取值方式使用
<update id="deleteAlarmCountResultLogical" parameterType="java.util.Map">
update alarm_count_result set
<if test="status != null and status != '' ">
status = #{status}
</if>
where id in ${id}
</update>
如果parameterType="java.lang.String",取值的時候都是採用#方式來取值,這種方式也是可以的
public void deleteAlarmCountResultPhysicalByTime(String time){
map.put("id","12");
map.put("status","2");
mapper.deleteAlarmCountResultPhysicalByTime(map);
}
AlarmCountResultMapper中:
void deleteAlarmCountResultPhysicalByTime(HashMap<String,String> map);
<delete id="deleteAlarmCountResultPhysicalByTime" parameterType="java.lang.String">
delete from alarm_count_result
where add_time <![CDATA[ < ]]> #{add_time}
and status=#{status}
</delete>