看到网上有许多关于这方面的解释:
但是对于我现在的问题并不能很好解决,
select * from(
select a.* ,ROWNUM rn from (
SELECT
OPENID,NICKNAME,COUNTRY,SUBSCRIBE_TIME,(CASE WHEN SEX='1' THEN '男' WHEN SEX='2' THEN '女' ELSE '未知' END) AS SEX
from wechat_user WHERE WID=#{wxid} AND ZT='1'
<if test=" NICKNAME!=null and NICKNAME!='' ">
and NICKNAME like '%#{NICKNAME}%'
</if>
) a
where ROWNUM <= #{end} ) where rn > #{start} ,主要是标红区域存在问题
翻看以前的代码,才找到解决方案:把 # 换成 $
select * from(
select a.* ,ROWNUM rn from (
SELECT
OPENID,NICKNAME,COUNTRY,SUBSCRIBE_TIME,(CASE WHEN SEX='1' THEN '男' WHEN SEX='2' THEN '女' ELSE '未知' END) AS SEX
from wechat_user WHERE WID=#{wxid} AND ZT='1'
<if test=" NICKNAME!=null and NICKNAME!='' ">
and NICKNAME like '%${NICKNAME}%'
</if>
) a
where ROWNUM <= #{end} ) where rn > #{start}
关于#和$符号的区别,简单来说就是#符号会自动为参数加引号,而$不会处理数据,也正是由于$的这个特性,导致他不能防止注入攻击,所以#的使用优先级要高于$。上面的like参数出现的问题正好是这个原因。