亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)文章

  • Java組件javabean用戶登錄實(shí)例詳解

    Java組件javabean用戶登錄實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Java組件javabean用戶登錄實(shí)例,內(nèi)容有用戶登錄,注冊(cè)和退出等,感興趣的小伙伴們可以參考一下
    2016-05-05
  • java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式

    java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式

    這篇文章主要介紹了java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot如何使用Fastjson解析Json數(shù)據(jù)

    SpringBoot如何使用Fastjson解析Json數(shù)據(jù)

    這篇文章主要介紹了SpringBoot如何使用Fastjson解析Json數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java構(gòu)造函數(shù)的相互調(diào)用代碼示例

    Java構(gòu)造函數(shù)的相互調(diào)用代碼示例

    這篇文章主要介紹了Java構(gòu)造函數(shù)的相互調(diào)用代碼示例,分享了兩段代碼示例,通過(guò)this關(guān)鍵字實(shí)現(xiàn)對(duì)的構(gòu)造函數(shù)的調(diào)用,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java常用類(lèi)之System類(lèi)的使用指南

    Java常用類(lèi)之System類(lèi)的使用指南

    System類(lèi)代表系統(tǒng),系統(tǒng)級(jí)的很多屬性和控制方法都放置在該類(lèi)的內(nèi)部。該類(lèi)位于java.lang包。本文將通過(guò)示例為大家詳細(xì)講講System類(lèi)的使用,需要的可以參考一下
    2022-07-07
  • Java中的自動(dòng)拆裝箱、基本類(lèi)型的轉(zhuǎn)換、包裝類(lèi)的緩存詳解

    Java中的自動(dòng)拆裝箱、基本類(lèi)型的轉(zhuǎn)換、包裝類(lèi)的緩存詳解

    文章詳細(xì)介紹了Java中數(shù)據(jù)類(lèi)型的拆裝箱、自動(dòng)拆箱和裝箱,以及包裝類(lèi)的緩存機(jī)制,包括基本數(shù)據(jù)類(lèi)型的容量大小、轉(zhuǎn)換規(guī)則和自動(dòng)類(lèi)型轉(zhuǎn)換等
    2024-12-12
  • java nio基礎(chǔ)使用示例

    java nio基礎(chǔ)使用示例

    傳統(tǒng)的io技術(shù)為阻塞的,java新nio是非阻塞的,注冊(cè)一個(gè)op_read事件,注冊(cè)到selector對(duì)象上,當(dāng)有數(shù)據(jù)到來(lái)時(shí)候,selector回通知之前注冊(cè)事件的對(duì)象,進(jìn)行read處理,看面我看看它是如何使用的
    2013-11-11
  • Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程

    Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程

    這篇文章主要介紹了Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    這篇文章主要為大家介紹了SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    這篇文章主要介紹了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論