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

java中復(fù)雜查詢sql語句該怎么寫

 更新時(shí)間:2022年11月01日 10:48:09   作者:二哥別秀了  
我們知道在java連接數(shù)據(jù)庫之后,需要數(shù)據(jù)庫的sql語句,下面這篇文章主要給大家介紹了關(guān)于java中復(fù)雜查詢sql語句該怎么寫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

java中的復(fù)雜查詢sql語句實(shí)現(xiàn):

這樣的查詢欄,在頁面中很常見,這就是復(fù)雜查詢的條件,我們可以填寫一個(gè)條件或多個(gè)條件,也可以一個(gè)都不填寫,在這樣的情況下我們的sql語句就不能是一個(gè)固定的String類型的字符串。

看到這相信大家都想到用什么來定義sql語句了,沒錯(cuò)就是StringBuilder,基本模板應(yīng)該就是

 String sql = "select * from `user` ";
 StringBuilder sb = new StringBuilder(sql);

但是這一步之后就存在一個(gè)難點(diǎn),如何添加查詢條件呢?

判斷每一個(gè)條件,如果條件存在且不為空,拼接字符串,用模糊查詢

sb.append(" where name like ? ");

理論上沒錯(cuò),但是如果多個(gè)條件呢?

sql語句就存在問題了,當(dāng)多個(gè)條件存在時(shí),sql語句就被拼接成

String sql = "select * from `user` where name like ? where address like ?" 

這明顯是不行的,有一個(gè)最簡(jiǎn)單的方法去定義一個(gè)正確的基本模板

String sql = "select * from `user` where 1 = 1 ";

在上面的模板上添加一個(gè)where 1 = 1 ,恒成立條件,無論有沒有條件,都可以運(yùn)行,那么存在條件的拼接語句就可以寫出來了

sb.append(" and name like ? ");

String sql = "select * from `user` where 1 = 1 " //沒有條件的查詢
//當(dāng)多個(gè)條件存在時(shí)
String sql = "select * from `user` where 1 = 1  and name like ?  and address like ? "
//多個(gè)條件也能成立

但是還有兩個(gè)特別需要注意的點(diǎn)就是:

1.拼接字符串時(shí),應(yīng)該在拼接的開頭敲上一個(gè)空格,這樣才能讓拼接起來的字符串之間存在空格不會(huì)變成連在一起的字符串,那樣也會(huì)報(bào)錯(cuò)

2.填充占位符時(shí),直接把值填上是不行的,因?yàn)槲覀冃枰氖悄:樵?,所以我們?yīng)該在填充值的時(shí)候在值的前面和后面加上“%”號(hào)。

補(bǔ)充:JAVA編程規(guī)范之SQL 語句

結(jié)構(gòu)化查詢語言(Structured Query Language)簡(jiǎn)稱SQL,結(jié)構(gòu)化查詢語言是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)

1、【強(qiáng)制】不要使用 count(列名)或 count(常量)來替代 count(),count()是 SQL92 定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法,跟數(shù)據(jù)庫無關(guān),跟 NULL 和非 NULL 無關(guān)。

說明 : count(*)會(huì)統(tǒng)計(jì)值為 NULL 的行,而 count(列名)不會(huì)統(tǒng)計(jì)此列為 NULL 值的行。

2、【強(qiáng)制】count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)行數(shù),注意 count(distinct col1, col2) 如果其中一列全為 NULL,那么即使另一列有不同的值,也返回為 0。

3、【強(qiáng)制】當(dāng)某一列的值全是 NULL 時(shí),count(col)的返回結(jié)果為 0,但 sum(col)的返回結(jié)果為 NULL,因此使用 sum()時(shí)需注意 NPE 問題。

正例 : 可以使用如下方式來避免 sum 的 NPE 問題: SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;

4、【強(qiáng)制】使用 ISNULL()來判斷是否為 NULL 值。注意: NULL 與任何值的直接比較都為 NULL。

5、【強(qiáng)制】在代碼中寫分頁查詢邏輯時(shí),若 count 為 0 應(yīng)直接返回,避免執(zhí)行后面的分頁語句。

6、【強(qiáng)制】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。

說明 : (概念解釋)學(xué)生表中的 student_id 是主鍵,那么成績(jī)表中的 student_id 則為外鍵。如果更新學(xué)生表中的 student_id,同時(shí)觸發(fā)成績(jī)表中的 student_id 更新,則為級(jí)聯(lián)更新。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級(jí)聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫的插入速度。

7、【強(qiáng)制】禁止使用存儲(chǔ)過程,存儲(chǔ)過程難以調(diào)試和擴(kuò)展,更沒有移植性。

8、【強(qiáng)制】數(shù)據(jù)訂正時(shí),刪除和修改記錄時(shí),要先 select,避免出現(xiàn)誤刪除,確認(rèn)無誤才能執(zhí)行更新語句。

9、【推薦】in 操作能避免則避免,若實(shí)在避免不了,需要仔細(xì)評(píng)估 in 后邊的集合元素?cái)?shù)量,控制在 1000 個(gè)之內(nèi)。

10、【參考】如果有全球化需要,所有的字符存儲(chǔ)與表示,均以 utf-8 編碼,注意字符統(tǒng)計(jì)函數(shù)的區(qū)別。

11、【參考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少,但 TRUNCATE 無事務(wù)且不觸發(fā) trigger,有可能造成事故,故不建議在開發(fā)代碼中使用此語句。

說明 : TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同。

總結(jié)

到此這篇關(guān)于java中復(fù)雜查詢sql語句該怎么寫的文章就介紹到這了,更多相關(guān)java復(fù)雜查詢sql語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot 創(chuàng)建web項(xiàng)目并部署到外部Tomcat

    SpringBoot 創(chuàng)建web項(xiàng)目并部署到外部Tomcat

    本篇文章主要介紹了SpringBoot 創(chuàng)建web項(xiàng)目并部署到外部Tomcat,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 深入講解SpringBoot Actuator是什么

    深入講解SpringBoot Actuator是什么

    Spring Boot Actuator提供了生產(chǎn)上經(jīng)常用到的功能(如健康檢查,審計(jì),指標(biāo)收集,HTTP跟蹤等),幫助我們監(jiān)控和管理Spring Boot應(yīng)用程序。這些功能都可以通過JMX或HTTP端點(diǎn)訪問
    2023-01-01
  • Java跨平臺(tái)原理與虛擬機(jī)相關(guān)簡(jiǎn)介

    Java跨平臺(tái)原理與虛擬機(jī)相關(guān)簡(jiǎn)介

    這篇文章主要介紹了Java跨平臺(tái)原理與虛擬機(jī)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java框架之Maven SSM集合

    Java框架之Maven SSM集合

    本篇文章主要介紹了基于maven的ssm框架整合的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • Zookeeper全局唯一ID生成方案解析

    Zookeeper全局唯一ID生成方案解析

    這篇文章主要介紹了Zookeeper全局唯一ID生成方案解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Spring?boot?RedisTemplate?序列化服務(wù)化配置方式

    Spring?boot?RedisTemplate?序列化服務(wù)化配置方式

    這篇文章主要介紹了Springboot?RedisTemplate序列化服務(wù)化配置方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot使用AOP實(shí)現(xiàn)防重復(fù)提交功能

    SpringBoot使用AOP實(shí)現(xiàn)防重復(fù)提交功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用AOP實(shí)現(xiàn)防重復(fù)提交功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 超詳細(xì)的IntelliJ IDEA的安裝及配置

    超詳細(xì)的IntelliJ IDEA的安裝及配置

    這篇文章主要介紹了超詳細(xì)的IntelliJ IDEA的安裝及配置,文中有非常詳細(xì)的圖文示例,對(duì)想要安裝IDEA的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot中自定義注解實(shí)現(xiàn)參數(shù)非空校驗(yàn)的示例

    SpringBoot中自定義注解實(shí)現(xiàn)參數(shù)非空校驗(yàn)的示例

    這篇文章主要介紹了SpringBoot中自定義注解實(shí)現(xiàn)參數(shù)非空校驗(yàn),幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file bytecode version:52.0(java 8)錯(cuò)誤的解決辦法

    IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file byt

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file bytecode version:52.0(java 8)錯(cuò)誤的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評(píng)論