Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn)
一、#{ }和${ }傳參的區(qū)別
我們先來(lái)看一下,使用兩個(gè)方式傳遞Integer的日志上的不同。
- 我們可以看見(jiàn)使用#{ }傳參的參數(shù)沒(méi)有在后?拼接,id的值是使? ? 進(jìn)?占位. 這種SQL 我們稱之為"預(yù)編譯SQL" 。而使用${ } 傳參的參數(shù)直接在后?拼接,這種SQL 我們稱之為"即時(shí)SQL" 。
- 并且當(dāng)我們使用${ ]傳String類型的參數(shù)的時(shí)候,我們跟#{ }使用同樣方式會(huì)報(bào)錯(cuò)。
這個(gè)原因是因?yàn)?{ }傳參是直接拼接,導(dǎo)致我們SQL語(yǔ)句傳參是字符串時(shí)參數(shù)沒(méi)有用引號(hào)括起來(lái),語(yǔ)法直接報(bào)錯(cuò)了。我們使用${ }傳字符串要加引號(hào)。
@Select("select * from user_info where username = '${userName}' and password = '${password}'") List<UserInfo> selectUsernameAndPassWord(String userName, String password) ;
即時(shí)SQL與預(yù)編譯SQL區(qū)別:
一條SQL的執(zhí)行流程如下:
- 解析語(yǔ)法和語(yǔ)義, 校驗(yàn)SQL語(yǔ)句是否正確
- 優(yōu)化SQL語(yǔ)句, 制定執(zhí)?計(jì)劃
- 執(zhí)?并返回結(jié)果
預(yù)編譯SQL就可以當(dāng)執(zhí)行相同SQL語(yǔ)句,只是參數(shù)不同時(shí),不用執(zhí)行第1步和 第2步。編譯?次之后會(huì)將編譯后的SQL語(yǔ)句緩存起來(lái),后?再次執(zhí)?這條語(yǔ)句時(shí),不會(huì)再次編譯。
#{ }與${ }區(qū)別:
- #{ }由于是預(yù)編譯SQL的原因性能更高一些。
- #{ }還能防止SQL注入的安全問(wèn)題。
SQL注?:是通過(guò)操作輸?的數(shù)據(jù)來(lái)修改事先定義好的SQL語(yǔ)句,以達(dá)到執(zhí)?代碼對(duì)服務(wù)器進(jìn)?攻擊的?法。
由于沒(méi)有對(duì)??輸?進(jìn)?充分檢查,?SQL?是拼接?成,在??輸?參數(shù)時(shí),在參數(shù)中添加?些SQL關(guān)鍵字,達(dá)到改變SQL運(yùn)?結(jié)果的?的,也可以完成惡意攻擊。
--這條SQL語(yǔ)句就有SQL注入的問(wèn)題 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) ;
測(cè)試方法:
@Test void selectAllSort() { System.out.println(userMapper.selectAllSort("desc")); }
向上面這樣使用#{ }傳參會(huì)報(bào)錯(cuò):會(huì)解析SQL語(yǔ)句為select * from user_info order by id ‘desc’
我們?cè)谶@種情況下 只能使用${ }傳參。但是又要防止SQL注入的風(fēng)險(xiǎn)。由于排序只有desc和asc兩種選項(xiàng),我們?cè)诤蠖藢懞眯r?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) ;
也會(huì)報(bào)錯(cuò):解析為select * from user_info where username like ‘%'zhang'%'
我們這里不能使用${ }來(lái)解決,由于參數(shù)不是有限固定的,不能進(jìn)行校驗(yàn) 防止SQL注入。我們使用SQL的字符串拼接函數(shù)concat。
@Select("select * from user_info where username like concat('%', #{name} ,'%') ") List<UserInfo> selectLike(String name) ;
測(cè)試方法:
@Test void selectLike() { userMapper.selectLike("zhang"); }
結(jié)果:
四、數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)?程序重復(fù)使??個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,?不是再重新建??個(gè)。
常?的數(shù)據(jù)庫(kù)連接池:C3P0 DBCP Druid Hikari ?前?較流?的是 Hikari, Druid。
Hikari是SpringBoot默認(rèn)使?的數(shù)據(jù)庫(kù)連接池。
果我們想把默認(rèn)的數(shù)據(jù)庫(kù)連接池切換為Druid數(shù)據(jù)庫(kù)連接池,只需要引?相關(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ù)字開頭或者兩個(gè)下劃線中間只出現(xiàn)數(shù)字.數(shù)據(jù)庫(kù)字段名的修改代價(jià)很?,所以字段名稱需要慎重考慮。
MySQL 在 Windows 下不區(qū)分??寫, 但在 Linux下默認(rèn)是區(qū)分??寫.因此,數(shù)據(jù)庫(kù)名,表名,字段名都不允許出現(xiàn)任何?寫字?, 避免節(jié)外?枝
正例: aliyun_admin,rdc_config, level3_name
反例: AliyunAdmin,rdcConfig,level_3_name
表必備三字段: id, create_time, update_time
id 必為主鍵, 類型為 bigint unsigned, 單表時(shí)?增, 步?為 1
create_time, update_time 的類型均為 datetime 類型, create_time表?創(chuàng)建時(shí)間,
update_time表?更新時(shí)間
有同等含義的字段即可, 字段名不做強(qiáng)制要求
在表查詢中, 避免使? * 作為查詢的字段列表, 標(biāo)明需要哪些字段.
- 增加查詢分析器解析成本
- 增減字段容易與 resultMap 配置不?致
- ??字段增加?絡(luò)消耗, 尤其是text 類型的字段
到此這篇關(guān)于Mybatis 傳參與排序模糊查詢的文章就介紹到這了,更多相關(guān)Mybatis 模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實(shí)現(xiàn)
- MyBatis-plus中的模糊查詢解讀
- 關(guān)于MyBatis模糊查詢的幾種實(shí)現(xiàn)方式
- MyBatis解決模糊查詢包含特殊字符問(wèn)題
- mybatis-plus指定字段模糊查詢的實(shí)現(xiàn)方法
- springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁(yè)并帶條件模糊查詢功能
- MyBatis中模糊查詢使用CONCAT('%',#{str},'%')出錯(cuò)的解決
- Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug
- mybatis?like模糊查詢特殊字符報(bào)錯(cuò)轉(zhuǎn)義處理方式
- Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式
- Mybatis中使用萬(wàn)能的Map傳參實(shí)現(xiàn)
相關(guān)文章
詳解Spring Boot 項(xiàng)目部署到heroku爬坑
這篇文章主要介紹了詳解Spring Boot 項(xiàng)目部署到heroku爬坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
這篇文章主要介紹了SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)
IoC?和?DI?是?Spring?中最重要的兩個(gè)概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實(shí)現(xiàn)。那么?DI?實(shí)現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來(lái)和大家一起詳細(xì)聊聊2022-08-08java8中parallelStream性能測(cè)試及結(jié)果分析
本篇文章給大家用代碼實(shí)例做了segmentfaultjava8中parallelStream性能測(cè)試,并對(duì)測(cè)試結(jié)果做了說(shuō)明,需要的朋友學(xué)習(xí)下吧。2018-01-01ConditionalOnProperty注解的作用和使用方式
在SpringBoot項(xiàng)目開發(fā)中,@ConditionalOnProperty注解允許根據(jù)配置文件中的屬性值來(lái)控制配置類是否生效,該注解通過(guò)屬性name和havingValue來(lái)判斷配置是否注入,如果application.properties中的對(duì)應(yīng)屬性值為空或不匹配havingValue設(shè)定值2024-09-09解決feign調(diào)用接口不穩(wěn)定的問(wèn)題
這篇文章主要介紹了解決feign調(diào)用接口不穩(wěn)定的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09