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

Mybatis 傳參與排序模糊查詢功能實現

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

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

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

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

這個原因是因為${ }傳參是直接拼接,導致我們SQL語句傳參是字符串時參數沒有用引號括起來,語法直接報錯了。我們使用${ }傳字符串要加引號。

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

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

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

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

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

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

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

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

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

二、排序

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

@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注入的風險。由于排序只有desc和asc兩種選項,我們在后端寫好校驗,防止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'%'

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

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

測試方法:

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

結果:

四、數據庫連接池

數據庫連接池負責分配、管理和釋放數據庫連接,它允許應?程序重復使??個現有的數據庫連接,?不是再重新建??個。

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

Hikari是SpringBoot默認使?的數據庫連接池。
果我們想把默認的數據庫連接池切換為Druid數據庫連接池,只需要引?相關依賴即可。

--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ī)范

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

MySQL 在 Windows 下不區(qū)分??寫, 但在 Linux下默認是區(qū)分??寫.因此,數據庫名,表名,字段名都不允許出現任何?寫字?, 避免節(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表?更新時間
有同等含義的字段即可, 字段名不做強制要求

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

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

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

相關文章

  • 詳解Spring Boot 項目部署到heroku爬坑

    詳解Spring Boot 項目部署到heroku爬坑

    這篇文章主要介紹了詳解Spring Boot 項目部署到heroku爬坑,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)

    SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)

    這篇文章主要介紹了SpringBoot項目的logback日志配置(包括打印mybatis的sql語句),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring?IOC容器Bean注解創(chuàng)建對象組件掃描

    Spring?IOC容器Bean注解創(chuàng)建對象組件掃描

    這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Spring解密之XML解析與Bean注冊示例詳解

    Spring解密之XML解析與Bean注冊示例詳解

    這篇文章主要給大家介紹了關于Spring解密之XML解析與Bean注冊的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面小編來一起學習學習吧。
    2018-01-01
  • Springboot 整合shiro實現權限控制的方法

    Springboot 整合shiro實現權限控制的方法

    這篇文章主要介紹了Springboot 整合shiro實現權限控制的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 淺談Java泛型通配符解決了泛型的許多詬病(如不能重載)

    淺談Java泛型通配符解決了泛型的許多詬病(如不能重載)

    下面小編就為大家?guī)硪黄獪\談Java泛型通配符解決了泛型的許多詬病(如不能重載)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解Spring依賴注入的三種方式以及優(yōu)缺點

    詳解Spring依賴注入的三種方式以及優(yōu)缺點

    IoC?和?DI?是?Spring?中最重要的兩個概念,其中?IoC(Inversion?of?Control)為控制反轉的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實現。那么?DI?實現依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來和大家一起詳細聊聊
    2022-08-08
  • java8中parallelStream性能測試及結果分析

    java8中parallelStream性能測試及結果分析

    本篇文章給大家用代碼實例做了segmentfaultjava8中parallelStream性能測試,并對測試結果做了說明,需要的朋友學習下吧。
    2018-01-01
  • ConditionalOnProperty注解的作用和使用方式

    ConditionalOnProperty注解的作用和使用方式

    在SpringBoot項目開發(fā)中,@ConditionalOnProperty注解允許根據配置文件中的屬性值來控制配置類是否生效,該注解通過屬性name和havingValue來判斷配置是否注入,如果application.properties中的對應屬性值為空或不匹配havingValue設定值
    2024-09-09
  • 解決feign調用接口不穩(wěn)定的問題

    解決feign調用接口不穩(wěn)定的問題

    這篇文章主要介紹了解決feign調用接口不穩(wěn)定的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論