最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis中Like的三種使用解讀

 更新時(shí)間:2023年09月28日 09:19:49   作者:weixin_43831204  
這篇文章主要介紹了Mybatis中Like的三種使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

方式一

在Mybatis中的第一種寫(xiě)法:

 <!--有sql注入問(wèn)題-->
 <select id="findUserByLikeName1" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like '%${name}%'
  </select>

這種會(huì)有sql注入的問(wèn)題,需要明白在 Mybatis中 $ # 使用的區(qū)別。這種寫(xiě)法也不能加 jdbcType=VARCHAR ,否則也會(huì)報(bào)錯(cuò)。

做了個(gè)簡(jiǎn)單的測(cè)試:

@Test
public void findUserByLikeName1(){
    List<User> test = userMapper.findUserByLikeName1("Cloud");
    //select * from t_user where name like '%Cloud%'
    System.out.println(test.size());// 查出一條
    List<User> test1 = userMapper.findUserByLikeName1("' or '1=1");
    //select * from t_user where name like '%' or '1=1%'
    // 分析: '1=1%' 成立
    System.out.println(test1.size());// 查出了全部數(shù)據(jù)
}

注意:排序的字段也容易出現(xiàn)這個(gè)問(wèn)題,在使用的時(shí)候也一定要注意。

order by ${orderBy}

第一種方式在實(shí)際開(kāi)發(fā)過(guò)程中千萬(wàn)要注意,不要寫(xiě)成這樣了。

方式二

在Mybatis中的第二種寫(xiě)法:

 <!--直接在代碼中拼接%, 不存在sql注入-->
 <select id="findUserByLikeName2" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like #{name,jdbcType=VARCHAR}
  </select>

在代碼中加上 % 。

@Test
public void findUserByLikeName2(){
    String name = "Cloud";
    List<User> test = userMapper.findUserByLikeName2("%" +name+"%");
    // select * from t_user where name like ?
    // %Cloud%(String)
    System.out.println(test.size());
}

這種方式在一些項(xiàng)目中也會(huì)看到。

如果沒(méi)有使用如Mybatis等ORM框架,直接寫(xiě)sql查詢就這樣拼接了。

方式三

在Mybatis中的第三種寫(xiě)法:

 <!--concat Mysql和 Oracle區(qū)別 ,不存在sql注入-->
  <select id="findUserByLikeName3" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%')
  </select>

測(cè)試:

@Test
public void findUserByLikeName3(){
    String name = "Cloud";
    List<User> test = userMapper.findUserByLikeName3(name);
    // select * from t_user where name like concat('%',?,'%')
    // Cloud(String)
    System.out.println(test.size());
}

在實(shí)際開(kāi)發(fā)中推薦使用這種方式。

小注意:

當(dāng)使用方式三的時(shí)候,如果查詢的關(guān)鍵字就是 % ,那情況會(huì)是什么? 初始化數(shù)據(jù)中 name 有9條數(shù)據(jù)中包含 % 。

查詢的sql如下:

select * from t_user where name like concat('%','%','%')

查出來(lái)全部的數(shù)據(jù),并不是只包含了 % 的數(shù)據(jù),如果查詢 _ 也是一樣的。

那這種情況肯定是不滿足查詢需求的,則需要調(diào)整。

①在代碼中進(jìn)行轉(zhuǎn)義

@Test
public void findUserByLikeName3(){
    String name = "%";
    name = name.replaceAll("_", "\\\\_");
    name = name.replaceAll("%", "\\\\%");
    List<User> test = userMapper.findUserByLikeName3(name);
    System.out.println(test.size());
}

②使用 ESCAPE

<select id="findUserByLikeName4" parameterType="java.lang.String" resultMap="user">
select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%') ESCAPE '/'
</select>

測(cè)試:

@Test
public void findUserByLikeName4(){
    // replaceAll("%", "/%").replaceAll("_", "/_")
    String name = "%";
    List<User> test = userMapper.findUserByLikeName4(name);
    System.out.println(test.size());// 查到全部
    List<User> test1 = userMapper.findUserByLikeName4("/" +name);
    System.out.println(test1.size());//查到匹配%的記錄
}

這兩種本質(zhì)都是對(duì)查詢的關(guān)鍵字進(jìn)行了處理,這種處理在代碼中可以使用攔截器或者AOP等技術(shù)統(tǒng)一處理。

總結(jié)

推薦使用第三種方式進(jìn)行模糊查詢。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

扬州市| 革吉县| 遂昌县| 奉新县| 合阳县| 雷州市| 淄博市| 曲周县| 宜宾市| 瑞金市| 华安县| 马公市| 无棣县| 察哈| 丰镇市| 沙坪坝区| 桐庐县| 织金县| 黎城县| 蒙阴县| 泸水县| 新巴尔虎右旗| 安多县| 渝中区| 绥芬河市| 年辖:市辖区| 固镇县| 武鸣县| 达日县| 东丽区| 克山县| 江西省| 肃南| 隆化县| 磴口县| 石屏县| 读书| 崇礼县| 亚东县| 南丰县| 奇台县|