為什么80%的碼農都做不了架構師?>>> ??
第一種方法:用轉義字符(注:對大小寫敏感!?)
用了轉義字符把>和<替換掉,然后就沒有問題了。
SELECT * FROM test WHERE 1 = 1 AND start_date ?<= CURRENT_DATE AND end_date >= CURRENT_DATE
附:XML轉義字符 ?
顯示結果 | 描述 | 實體名稱 | 實體編號 |
---|---|---|---|
? | 空格 | |   |
< | 小于號 | < | < |
> | 大于號 | > | > |
& | 和號 | & | & |
" | 引號 | " | " |
' | 撇號? | ' (IE不支持) | ' |
第二種方法:<![CDATA[ ]]>
因為這個是xml格式的,所以不允許出現類似“>”這樣的字符,但是都可以使用<![CDATA[ ]]>符號進行說明,將此類符號不進行解析 ,如下: <update id="reduceNumber">UPDATE seckillSET number = number-1WHERE seckill_id=#{seckillId}AND start_time <![CDATA[ <= ]]> #{killTime} AND end_time >= #{killTime}AND number > 0; </update> |
注意點:有動態語句(where,if)的情況,where,if 條件不能放在<![CDATA[ ]]>中,否則將導致無法識別動態判斷部分,導致整個sql語句非法.應該縮小范圍,只對有字符沖突部分進行合法性調整
錯誤的形式:以下where 放在<![CDATA[ ]]>中
<select?id="getAccountErrorCount"?resultType="int"?parameterType="map">??<![CDATA[?select?count(*)?from?t_acctreg_accounterror?<where>?<if?test="enddate?!=?null?and?enddate?!=?''">?createdate?<=?#{enddate}?</if>?<if?test="acctno?!=?null?and?acctno?!=?''">?AND?acctno?LIKE?'%'#{acctno}'%'?</if>?</where>?]]>??
</select>??
正確的形式:
<select id="getAccountErrorCount" resultType="int" parameterType="map"> select count(*) from t_acctreg_accounterror <where> <if test="enddate != null and enddate != ''"> <![CDATA[createdate <= #{enddate}]]> </if> <if test="acctno != null and acctno != ''"> <![CDATA[AND acctno LIKE CONCAT('%',#{acctno},'%')]]> </if> </where>
</select>
補充說明:like的以上兩種寫法,都是可以的
LIKE '%'#{acctno}'%'
LIKE CONCAT('%',#{acctno},'%')