欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis中Like的三種使用解讀

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

方式一

在Mybatis中的第一種寫法:

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

這種會有sql注入的問題,需要明白在 Mybatis中 $ # 使用的區(qū)別。這種寫法也不能加 jdbcType=VARCHAR ,否則也會報錯。

做了個簡單的測試:

@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)這個問題,在使用的時候也一定要注意。

order by ${orderBy}

第一種方式在實際開發(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());
}

這種方式在一些項目中也會看到。

如果沒有使用如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>

測試:

@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());
}

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

小注意:

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

查詢的sql如下:

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

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

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

①在代碼中進行轉(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>

測試:

@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ì)都是對查詢的關(guān)鍵字進行了處理,這種處理在代碼中可以使用攔截器或者AOP等技術(shù)統(tǒng)一處理。

總結(jié)

推薦使用第三種方式進行模糊查詢。

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

相關(guān)文章

  • Java組件javabean用戶登錄實例詳解

    Java組件javabean用戶登錄實例詳解

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

    java設(shè)計模式(實戰(zhàn))-責任鏈模式

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

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

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

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

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

    Java常用類之System類的使用指南

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

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

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

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

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

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

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

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

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

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

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

最新評論