mybatis中的模糊查询
不能直接用#{queryText} ,例如:#相当于占位符?,而?不能放在%%中。
<select id="queryList" resultMap="BaseResultMap" >
select id,loginacct,userpswd,username,email,createtime
from t_user
<where>
<if test="queryText!=null"> loginacct LIKE "%#{queryText}%" </if>
</where>
limit #{startIndex},#{pagesize}
</select>
可以用${queryText},但是会容易sql注入攻击
<select id="queryList" resultMap="BaseResultMap" >
select id,loginacct,userpswd,username,email,createtime
from t_user
<where>
<if test="queryText!=null"> loginacct LIKE "%${queryText}%" </if>
</where>
limit #{startIndex},#{pagesize}
</select>
推荐使用concat
<select id="queryList" resultMap="BaseResultMap" >
select id,loginacct,userpswd,username,email,createtime
from t_user
<where>
<if test="queryText!=null"> loginacct LIKE concat("%",#{queryText},"%") </if>
</where>
limit #{startIndex},#{pagesize}
</select>
但是如果传入特殊字符则又会有问题,例如传入一个% 则会查询所有。
因此需要将%转译:
if (queryText.contains("%")){
queryText = queryText.replaceAll("%","\\\\%");
}
在java中 \ 就代表转译 因此需要 \ \ 但是replaceAll内部使用正则表达式,因此又会将一个 \ 转译,因此需要 \\\\ 。
同理 _ 类似 也需要转译 或者一些其他的特殊符。