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

Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn)

 更新時間:2025年04月08日 14:54:25   作者:鴿鴿程序猿  
這篇文章主要介紹了Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

一、#{ }和${ }傳參的區(qū)別

我們先來看一下,使用兩個方式傳遞Integer的日志上的不同。

  • 我們可以看見使用#{ }傳參的參數(shù)沒有在后?拼接,id的值是使? ? 進(jìn)?占位. 這種SQL 我們稱之為"預(yù)編譯SQL" 。而使用${ } 傳參的參數(shù)直接在后?拼接,這種SQL 我們稱之為"即時SQL" 。
  • 并且當(dāng)我們使用${ ]傳String類型的參數(shù)的時候,我們跟#{ }使用同樣方式會報錯。

這個原因是因?yàn)?{ }傳參是直接拼接,導(dǎo)致我們SQL語句傳參是字符串時參數(shù)沒有用引號括起來,語法直接報錯了。我們使用${ }傳字符串要加引號。

    @Select("select * from user_info where username = '${userName}' and password = '${password}'")
    List<UserInfo> selectUsernameAndPassWord(String userName, String password) ;

即時SQL與預(yù)編譯SQL區(qū)別:

一條SQL的執(zhí)行流程如下:

  • 解析語法和語義, 校驗(yàn)SQL語句是否正確
  • 優(yōu)化SQL語句, 制定執(zhí)?計劃
  • 執(zhí)?并返回結(jié)果

預(yù)編譯SQL就可以當(dāng)執(zhí)行相同SQL語句,只是參數(shù)不同時,不用執(zhí)行第1步和 第2步。編譯?次之后會將編譯后的SQL語句緩存起來,后?再次執(zhí)?這條語句時,不會再次編譯。

#{ }與${ }區(qū)別:

  • #{ }由于是預(yù)編譯SQL的原因性能更高一些。
  • #{ }還能防止SQL注入的安全問題。

SQL注?:是通過操作輸?的數(shù)據(jù)來修改事先定義好的SQL語句,以達(dá)到執(zhí)?代碼對服務(wù)器進(jìn)?攻擊的?法。
由于沒有對??輸?進(jìn)?充分檢查,?SQL?是拼接?成,在??輸?參數(shù)時,在參數(shù)中添加?些SQL關(guān)鍵字,達(dá)到改變SQL運(yùn)?結(jié)果的?的,也可以完成惡意攻擊。

--這條SQL語句就有SQL注入的問題
select username, `password`, age, gender, phone from user_info where 
password = ''or 1 ='1'

二、排序

我們將排序的方式作為參數(shù)傳遞,用戶選擇升序還是降序。

@Select("select * from user_info order by id #{order}")
    List<UserInfo> selectAllSort(String order) ;

測試方法:

    @Test
    void selectAllSort() {
        System.out.println(userMapper.selectAllSort("desc"));
    }

向上面這樣使用#{ }傳參會報錯:會解析SQL語句為select * from user_info order by id ‘desc’

我們在這種情況下 只能使用${ }傳參。但是又要防止SQL注入的風(fēng)險。由于排序只有desc和asc兩種選項(xiàng),我們在后端寫好校驗(yàn),防止SQL注入。

    @Select("select * from user_info order by id ${order}")
    List<UserInfo> selectAllSort(String order) ;

三、like查詢

@Select("select * from user_info where username like '%#{name}%' ")
    List<UserInfo> selectLike(String name) ;

也會報錯:解析為select * from user_info where username like ‘%'zhang'%'

我們這里不能使用${ }來解決,由于參數(shù)不是有限固定的,不能進(jìn)行校驗(yàn) 防止SQL注入。我們使用SQL的字符串拼接函數(shù)concat。

@Select("select * from user_info where username like concat('%', #{name} ,'%') ")
    List<UserInfo> selectLike(String name) ;

測試方法:

    @Test
    void selectLike() {
        userMapper.selectLike("zhang");
    }

結(jié)果:

四、數(shù)據(jù)庫連接池

數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)?程序重復(fù)使??個現(xiàn)有的數(shù)據(jù)庫連接,?不是再重新建??個。

常?的數(shù)據(jù)庫連接池:C3P0 DBCP Druid Hikari ?前?較流?的是 Hikari, Druid。

Hikari是SpringBoot默認(rèn)使?的數(shù)據(jù)庫連接池。
果我們想把默認(rèn)的數(shù)據(jù)庫連接池切換為Druid數(shù)據(jù)庫連接池,只需要引?相關(guān)依賴即可。

--3.x版本
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-3-starter</artifactId>
 <version>1.2.21</version>
</dependency>
--2.x版本
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-starter</artifactId>
 <version>1.1.17</version>
</dependency>

五、MySQL 開發(fā)企業(yè)規(guī)范

表名, 字段名使??寫字?或數(shù)字, 單詞之間以下劃線分割. 盡量避免出現(xiàn)數(shù)字開頭或者兩個下劃線中間只出現(xiàn)數(shù)字.數(shù)據(jù)庫字段名的修改代價很?,所以字段名稱需要慎重考慮。

MySQL 在 Windows 下不區(qū)分??寫, 但在 Linux下默認(rèn)是區(qū)分??寫.因此,數(shù)據(jù)庫名,表名,字段名都不允許出現(xiàn)任何?寫字?, 避免節(jié)外?枝
正例: aliyun_admin,rdc_config, level3_name
反例: AliyunAdmin,rdcConfig,level_3_name

表必備三字段: id, create_time, update_time

id 必為主鍵, 類型為 bigint unsigned, 單表時?增, 步?為 1
create_time, update_time 的類型均為 datetime 類型, create_time表?創(chuàng)建時間,
update_time表?更新時間
有同等含義的字段即可, 字段名不做強(qiáng)制要求

在表查詢中, 避免使? * 作為查詢的字段列表, 標(biāo)明需要哪些字段.

  • 增加查詢分析器解析成本
  • 增減字段容易與 resultMap 配置不?致
  • ??字段增加?絡(luò)消耗, 尤其是text 類型的字段

到此這篇關(guān)于Mybatis 傳參與排序模糊查詢的文章就介紹到這了,更多相關(guān)Mybatis 模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡介Java編程中的Object類

    簡介Java編程中的Object類

    這篇文章主要介紹了簡介Java編程中的Object類,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • SpringBoot如何添加WebSocket的方法示例

    SpringBoot如何添加WebSocket的方法示例

    這篇文章主要介紹了SpringBoot如何添加WebSocket的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot的攔截器中依賴注入為null的解決方法

    SpringBoot的攔截器中依賴注入為null的解決方法

    這篇文章主要介紹了SpringBoot的攔截器中依賴注入為null的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 深入理解JVM垃圾回收算法

    深入理解JVM垃圾回收算法

    我們都知道java語言與C語言最大的區(qū)別就是內(nèi)存自動回收,那么JVM是怎么控制內(nèi)存回收的,這篇文章將介紹JVM垃圾回收的幾種算法,從而了解內(nèi)存回收的基本原理
    2021-06-06
  • springboot中poi使用操作方法

    springboot中poi使用操作方法

    在項(xiàng)目中,有很多對excel的操作,大都數(shù)時候我們都會使用poi工具類,本文將介紹poi的一些使用方法,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • SpringBoot整合ES解析搜索返回字段問題

    SpringBoot整合ES解析搜索返回字段問題

    這篇文章主要介紹了SpringBoot整合ES解析搜索返回字段問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java之邏輯控制三大結(jié)構(gòu)使用及說明

    Java之邏輯控制三大結(jié)構(gòu)使用及說明

    文章介紹了Java中的邏輯控制結(jié)構(gòu),包括順序執(zhí)行、選擇執(zhí)行(if和switch語句)和循環(huán)執(zhí)行(while、for和do-while循環(huán)),此外,還討論了輸入輸出和一個簡單的猜數(shù)字游戲
    2025-12-12
  • springBoot靜態(tài)資源加載不到,并且配置了也不生效問題及解決

    springBoot靜態(tài)資源加載不到,并且配置了也不生效問題及解決

    這篇文章總結(jié)了一個在Spring Boot 2.6.x版本中,由于路徑匹配策略改變導(dǎo)致靜態(tài)資源無法加載的問題,并提供了解決方案:通過配置類或在配置文件中設(shè)置路徑匹配策略為AntPathMatcher,或者直接降級Spring Boot版本
    2025-02-02
  • 詳細(xì)聊聊Mybatis中萬能的Map

    詳細(xì)聊聊Mybatis中萬能的Map

    最近有個需求,就是使用mybatis時,向mysql中插入數(shù)據(jù),其參數(shù)為map類型,下面這篇文章主要給大家介紹了關(guān)于Mybatis中萬能的Map的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評論

驻马店市| 石阡县| 东兰县| 忻州市| 涿鹿县| 喀喇| 天等县| 区。| 霸州市| 尚志市| 伊宁市| 龙里县| 墨玉县| 龙门县| 普洱| 无锡市| 临沭县| 吉木乃县| 敦化市| 天水市| 阳西县| 南雄市| 汤阴县| 克拉玛依市| 教育| 论坛| 垣曲县| 洛隆县| 镇安县| 奎屯市| 来宾市| 辽阳县| 稷山县| 台山市| 镇宁| 梧州市| 邵阳市| 武强县| 吴忠市| 云和县| 九寨沟县|