1. 程式人生 > >mybatis中的$和#區別

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>