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

Mybatis中Like的三種使用解讀

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

方式一

在Mybatis中的第一種寫法:

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

這種會(huì)有sql注入的問題,需要明白在 Mybatis中 $ # 使用的區(qū)別。這種寫法也不能加 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è)問題,在使用的時(shí)候也一定要注意。

order by ${orderBy}

第一種方式在實(shí)際開發(fā)過程中千萬要注意,不要寫成這樣了。

方式二

在Mybatis中的第二種寫法:

 <!--直接在代碼中拼接%, 不存在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ì)看到。

如果沒有使用如Mybatis等ORM框架,直接寫sql查詢就這樣拼接了。

方式三

在Mybatis中的第三種寫法:

 <!--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í)際開發(fā)中推薦使用這種方式。

小注意:

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

查詢的sql如下:

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

查出來全部的數(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)論

平武县| 鄂托克旗| 多伦县| 潢川县| 濮阳县| 大连市| 蒙自县| 竹溪县| 昌图县| 马龙县| 阿拉善左旗| 灌云县| 攀枝花市| 淳安县| 富顺县| 闸北区| 施甸县| 临洮县| 山丹县| 乐平市| 古丈县| 湘乡市| 大竹县| 永定县| 兴业县| 陆川县| 秭归县| 禹城市| 县级市| 肇庆市| 德安县| 凤城市| 维西| 疏勒县| 阳曲县| 绍兴县| 濮阳县| 肇源县| 安溪县| 东光县| 新竹市|