java -- mybatis 模糊查询

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内部使用正则表达式,因此又会将一个 \ 转译,因此需要 \\\\ 。

同理 _ 类似 也需要转译 或者一些其他的特殊符。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值