日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java程序員最容易犯的10個SQL錯誤是哪些

電子工程師 ? 來源:OSCHINA ? 作者:OSCHINA ? 2021-06-07 15:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Java程序員編程時需要混合面向?qū)ο笏季S和一般命令式編程的方法,能否完美的將兩者結(jié)合起來完全得依靠編程人員的水準(zhǔn):

技能(任何人都能容易學(xué)會命令式編程)

模式(有些人用“模式-模式”,舉個例子,模式可以應(yīng)用到任何地方,而且都可以歸為某一類模式)

心境(首先,要寫個好的面向?qū)ο蟪绦蚴潜让钍匠绦螂y的多,你得花費一些功夫)

但當(dāng)Java程序員寫SQL語句時,一切都不一樣了。SQL是說明性語言而非面向?qū)ο蠡蚴敲钍骄幊陶Z言。在SQL中要寫個查詢語句是很簡單的。但在Java里類似的語句卻不容易,因為程序員不僅要反復(fù)考慮編程范式,而且也要考慮算法的問題。

下面是Java程序員在寫SQL時常犯的10個錯誤(沒有特定的順序)。

1、忘掉NULL

Java程序員寫SQL時對NULL的誤解可能是最大的錯誤。也許是因為(并非唯一理由)NULL也稱作UNKNOWN。如果被稱作 UNKNOWN,這還好理解些。另一個原因是,當(dāng)你從數(shù)據(jù)庫拿東西或是綁定變量時,JDBC將SQL NULL 和Java中的null對應(yīng)了起來。這樣導(dǎo)致了NULL = NULL(SQL)和null=null(Java)的誤解。

對于NULL最大的誤解是當(dāng)NULL被用作行值表達式完整性約束條件時。另一個誤解出現(xiàn)在對于NULL 在 NOT IN anti-joins的應(yīng)用中。

解決方法:

好好的訓(xùn)練你自己。當(dāng)你寫SQL時要不停得想到NULL的用法:

這個NULL完整性約束條件是正確的?

NULL是否影響到結(jié)果?

2、在Java內(nèi)存中處理數(shù)據(jù)

很少有Java開發(fā)者能將SQL理解的很好。偶爾使用的JOIN,還有古怪的UNION,好吧,但是對于窗口函數(shù)呢?還有對集合進行分組呢?許多 的Java開發(fā)者將SQL數(shù)據(jù)加載到內(nèi)存中,將這些數(shù)據(jù)轉(zhuǎn)換成某些相近的集合類型,然后再那些集合上面使用邊界循環(huán)控制結(jié)構(gòu)(至少在Java8的集合升級 以前)執(zhí)行令人生厭的數(shù)學(xué)運算。

但是一些SQL數(shù)據(jù)庫支持先進的(而且是SQL標(biāo)準(zhǔn)支持的)OLAP特性,這一特性表現(xiàn)更好而且寫起來也更加方便。一個(并不怎么標(biāo)準(zhǔn)的)例子就 是Oracle超棒的MODEL分句。只讓數(shù)據(jù)庫來做處理然后只把結(jié)果帶到Java內(nèi)存中吧。因為畢竟所有非常聰明的家伙已經(jīng)對這些昂貴的產(chǎn)品進行了優(yōu) 化。因此實際上,通過將OLAP移到數(shù)據(jù)庫,你將獲得一下兩項好處:

便利性。這比在Java中編寫正確的SQL可能更加的容易。

性能表現(xiàn)。數(shù)據(jù)庫應(yīng)該比你的算法處理起來更加快。而且更加重要的是,你不必再去傳遞數(shù)百萬條記錄了。

解決方法:

每次你使用Java實現(xiàn)一個以數(shù)據(jù)為中心的算法時,問問自己:有沒有一種方法可以讓數(shù)據(jù)庫代替為我做這種麻煩事。

3、使用UNION 代替UNION ALL

UNION ALL(允許重復(fù))

UNION (去除了重復(fù))

移除重復(fù)行不僅很少需要(有時甚至是錯的),而且對于帶很多行的大數(shù)據(jù)集合會相當(dāng)慢,因為兩個子select需要排序,而且每個元組也需要和它的子序列元組比較。

注意即使SQL標(biāo)準(zhǔn)規(guī)定了INTERSECT ALL和EXCEPT ALL,很少數(shù)據(jù)庫會實現(xiàn)這些沒用的集合操作符。MySQL 系列面試題都整理好了,微信搜索Java技術(shù)棧,在后臺發(fā)送:面試,可在線刷題。

解決方法:

每次寫UNION語句時,考慮實際上是否需要UNION ALL語句。

4、通過JDBC分頁技術(shù)給大量的結(jié)果進行分頁操作

大部分的數(shù)據(jù)庫都會支持一些分頁命令實現(xiàn)分頁效果,譬如LIMIT..OFFSET,TOP..START AT,OFFSET..FETCH語句等。即使沒有支持這些語句的數(shù)據(jù)庫,仍有可能對ROWNUM(Oracle)或者是ROW NUMBER()、OVER()過濾(DB2、SQL Server2008等),這些比在內(nèi)存中實現(xiàn)分頁更快速。在處理大量數(shù)據(jù)中,效果尤其明顯。

解決方法:

僅僅使用這些語句,那么一個工具(例如JOOQ)就可以模擬這些語句的操作。

5、在Java內(nèi)存中加入數(shù)據(jù)

從SQL的初期開始,當(dāng)在SQL中使用JOIN語句時,一些開發(fā)者仍舊有不安的感覺。這是源自對加入JOIN后會變慢的固有恐懼。

假如基于成本的 優(yōu)化選擇去實現(xiàn)嵌套循環(huán),在創(chuàng)建一張連接表源前,可能加載所有的表在數(shù)據(jù)庫內(nèi)存中,這可能是真的。但是這事發(fā)生的概率太低了。通過合適的預(yù)測,約束和索 引,合并連接和哈希連接的操作都是相當(dāng)?shù)目?。這完全是是關(guān)于正確元數(shù)據(jù)(在這里我不能夠引用Tom Kyte的太多)。而且,可能仍然有不少的Java開發(fā)人員加載兩張表通過分開查詢到一個映射中,并且在某種程度上把他們加到了內(nèi)存當(dāng)中。

解決方法:

假如你在各個步驟中有從各種表的查詢操作,好好想想是否可以表達你的查詢操作在單條語句中。

6、在一個臨時的笛卡爾積集合中使用 DISTINCT 或 UNION 消除重復(fù)項

通過復(fù)雜的連接,人們可能會對SQL語句中扮演關(guān)鍵角色的所有關(guān)系失去概念。特別的,如果這涉及到多列外鍵關(guān)系的話,很有可能會忘記在JOIN 。。 ON子句中增加相關(guān)的判斷。這會導(dǎo)致重復(fù)的記錄,但或許只是在特殊的情況下。有些開發(fā)者因此可能選擇DISTINCT來消除這些重復(fù)記錄。從三個方面來說 這是錯誤的:

它(也許)解決了表面癥狀但并沒有解決問題。它也有可能無法解決極端情況下的癥狀。

對具有很多列的龐大的結(jié)果集合來說它很慢。DISTINCT要執(zhí)行ORDER BY操作來消除重復(fù)。

對龐大的笛卡爾積集合來說它很慢,還是需要加載很多的數(shù)據(jù)到內(nèi)存中。

解決方法:

根據(jù)經(jīng)驗,如果你獲得了不需要的重復(fù)記錄,還是檢查你的JOIN判斷吧。可能在某個地方有一個很難覺察的笛卡爾積集合。

7、不使用MERGE語句

這并不是一個過失,但是可能是缺少知識或者對于強悍的MERGE語句信心不足。一些數(shù)據(jù)庫理解其它形式的更新插入(UPSERT)語句, 如 MYSQL的重復(fù)主鍵更新語句,但是MERGE在數(shù)據(jù)庫中確是很強大,很重要,以至于大肆擴展SQL標(biāo)準(zhǔn),例如SQL SERVER。

解決方法:

如果你使用像聯(lián)合INSERT和UPDATE或者聯(lián)合SELECT 。。 FOR UPDATE然后在INSERT或UPDATE等更新插入時,請三思。你完全可以使用一個更簡單的MERGE語句來遠離冒險競爭條件。

8、使用聚合函數(shù)代替窗口函數(shù)(window functions)

在介紹窗口函數(shù)之前,在SQL中聚合數(shù)據(jù)意味著使用GROUP BY語句與聚合函數(shù)相映射。在很多情形下都工作得很好,如聚合數(shù)據(jù)需要濃縮常規(guī)數(shù)據(jù),那么就在join子查詢中使用group查詢。

但是在SQL2003中定義了窗口函數(shù),這個在很多主流數(shù)據(jù)庫都實現(xiàn)了它。窗口函數(shù)能夠在結(jié)果集上聚合數(shù)據(jù),但是卻沒有分組。事實上,每個窗口函數(shù)都有自己的、獨立的PARTITION BY語句,這個工具對于顯示報告太好了。

使用窗口函數(shù):

使SQL更易讀(但在子查詢中沒有GROUP BY語句專業(yè))

提升性能,像關(guān)系數(shù)據(jù)庫管理系統(tǒng)能夠更容易優(yōu)化窗口函數(shù)

解決方法:

當(dāng)你在子查詢中使用GROUP BY語句時,請再三考慮是否可以使用窗口函數(shù)完成。

9、使用內(nèi)存間接排序

SQL的ORDER BY語句支持很多類型的表達式,包括CASE語句,對于間接排序十分有用。你可能重來不會在Java內(nèi)存中排序數(shù)據(jù),因為你會想:

SQL排序很慢

SQL排序辦不到

解決方法:

如果你在內(nèi)存中排序任何SQL數(shù)據(jù),請再三考慮,是否不能在數(shù)據(jù)庫中排序。這對于數(shù)據(jù)庫分頁數(shù)據(jù)十分有用。

10、一條一條地插入大量記錄

JDBC“懂”批處理(batch),你應(yīng)該不會忘了它。不要使用INSERT語句來一條一條的出入成千上萬的記錄,(因為)每次都會創(chuàng)建一個新 的PreparedStatement對象。如果你的所有記錄都插入到同一個表時,那么就創(chuàng)建一個帶有一條SQL語句以及附帶很多值集合的插入批處理語 句。你可能需要在達到一定量的插入記錄后才提交來保證UNDO日志瘦小,這依賴于你的數(shù)據(jù)庫和數(shù)據(jù)庫設(shè)置。

原文來源:http://blog.jooq.org/ 譯者:LianyouCQ, LeoXu, yale8848, 開源中國駐聯(lián)合國理事, super0555

譯文:https://www.oschina.net/translate/10-common-mistakes-java-developers-make-when-writing-sql

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7349

    瀏覽量

    95054
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116873
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    807

    瀏覽量

    46963
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    4337

原文標(biāo)題:Java程序員常犯的 10 個 SQL 錯誤!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Java轉(zhuǎn) AI高薪領(lǐng)域必備 從0到1打通生產(chǎn)級AI Agent開發(fā) 教程資料

    告別CRUD內(nèi)卷的經(jīng)濟學(xué):Java程序員轉(zhuǎn)型AI Agent的商業(yè)重構(gòu) 在當(dāng)前的IT職場生態(tài)中,一令人不寒而栗的現(xiàn)象正在上演:傳統(tǒng)Java CRUD(增刪改查)開發(fā)者的薪資溢價正在
    發(fā)表于 04-29 17:08

    慕課網(wǎng)Java轉(zhuǎn) AI高薪領(lǐng)域必備 從0到1打通生產(chǎn)級AI Agent開發(fā)

    獲課:pan.baidu.com/s/16MoRr6EApmBczMhHgKxYaw?pwd=w4wg 把握未來十年風(fēng)口,完結(jié)版教程助力Java程序員深耕AI 站在2026年的時代潮頭,人工智能
    的頭像 發(fā)表于 04-28 16:41 ?82次閱讀

    信號完整性仿真中容易的幾個錯誤

    說出來你可能不信,很多工程師拿著漂亮的仿真報告,實物一測試,問題全出來了。返工、延期、挨罵,樣樣都逃不掉。
    的頭像 發(fā)表于 04-20 10:17 ?1472次閱讀
    信號完整性仿真中<b class='flag-5'>容易</b><b class='flag-5'>犯</b>的幾個<b class='flag-5'>錯誤</b>

    郭燕濤SQL Server 全能管理在線課程分享

    ”的 SQL Server 管理核心在線課程,絕不是幾個數(shù)據(jù)庫控制臺的點擊演示,它實際上是一份企業(yè)級“數(shù)字資產(chǎn)風(fēng)控指南”,是一門關(guān)于算力精算與信任契約的隱性經(jīng)濟學(xué)。 一、 實例配置:對抗“算力通貨膨脹”的微觀
    發(fā)表于 04-19 16:28

    NineData 社區(qū)版的慢SQL分析,比查看日志+看EXPLAIN適合中小團隊

    度分析,定位問題后還可銜接后續(xù)操作。且其支持 Docker 單機本地內(nèi)網(wǎng)部署,10 個數(shù)據(jù)源額度適合中小團隊,優(yōu)化慢 SQL 處理流程。
    的頭像 發(fā)表于 03-17 14:07 ?138次閱讀
    NineData 社區(qū)版的慢<b class='flag-5'>SQL</b>分析,比查看日志+看EXPLAIN適合中小團隊

    嵌入式軟件開發(fā)的 10 技巧分享

    資源來演示狀態(tài)機理論和算法。 技巧 3:避免使用全局變量 在函數(shù)式編程的年代,函數(shù)要先于形式,程序員的唯一目標(biāo)是盡可能地讓程序按預(yù)期方式快速運行,而不用考慮程序結(jié)構(gòu)或可重用性。這種編程范式會毫無顧慮
    發(fā)表于 12-25 06:04

    大理的AI野心藏不住了——風(fēng)花雪月中千名程序員探討人工智能

    2025 年12月4日至6日第二屆CCF程序員大會暨大理人工智能與應(yīng)用國際開發(fā)者大會在大理圓滿落幕。
    的頭像 發(fā)表于 12-24 17:45 ?919次閱讀
    大理的AI野心藏不住了——風(fēng)花雪月中千名<b class='flag-5'>程序員</b>探討人工智能

    程序員最常見謊言

    了。 28我已經(jīng)測試過了,這個功能沒問題,可以上線了。 29別擔(dān)心,這個問題很快就能解決。 30代碼快寫完了,已經(jīng)完成 90% 了 。 希望大家對程序員多一些容忍以及諒解! 各位程序員你們都被我說中了哪些?說說你們的觀點
    發(fā)表于 12-10 08:24

    奔赴熱AI,碼力全開!Talkweb House@1024程序員日系列活動圓滿收官

    1024程序員日”系列活動至此劃上了一圓滿句號。本屆1024程序員節(jié)以“AI構(gòu)建世界,智能引領(lǐng)未來”為主題,廣邀技術(shù)大咖、產(chǎn)業(yè)領(lǐng)袖、企業(yè)代表與全球開發(fā)者齊聚星城
    的頭像 發(fā)表于 10-27 18:59 ?982次閱讀
    奔赴熱AI,碼力全開!Talkweb House@1024<b class='flag-5'>程序員</b>日系列活動圓滿收官

    開鴻智谷“以賽促學(xué)、以賽選才”|1024程序員節(jié)暨開源鴻蒙構(gòu)建大會圓滿落幕!

    10月24日,由開鴻智谷聯(lián)合主辦的長沙1024程序員節(jié)暨開源鴻蒙構(gòu)建大會在長沙圓滿落幕。本次活動以“湘聚長沙,共赴熱AI”為主題,通過技術(shù)分享與實戰(zhàn)競賽相結(jié)合的方式,著力培養(yǎng)“開源鴻蒙+AI”領(lǐng)域
    的頭像 發(fā)表于 10-27 17:58 ?890次閱讀
    開鴻智谷“以賽促學(xué)、以賽選才”|1024<b class='flag-5'>程序員</b>節(jié)暨開源鴻蒙構(gòu)建大會圓滿落幕!

    AI技術(shù)在工程設(shè)計的應(yīng)用

    在不需要硬件交互的純軟件項目中,ChatGPT和Gemini等大語言模型(LLM)可以幫助程序員以前所未有的速度加速開發(fā)進程。這種輔助通常包括在開發(fā)人員編寫代碼時提供補全建議,或在排查錯誤和語法錯誤時提供故障排除建議——這些都是
    的頭像 發(fā)表于 09-23 16:21 ?1094次閱讀
    AI技術(shù)在工程設(shè)計的應(yīng)用

    Java效率提升指南:5Java工具選型建議及Perforce JRebel和XRebel介紹

    企業(yè)級Java環(huán)境越來越復(fù)雜,真正的破局點,可能不在“人”,而在于“工具”。5實用建議,幫你理清Java工具的選型思路。
    的頭像 發(fā)表于 09-11 13:59 ?1981次閱讀
    <b class='flag-5'>Java</b>效率提升指南:5<b class='flag-5'>個</b><b class='flag-5'>Java</b>工具選型建議及Perforce JRebel和XRebel介紹

    SQL 通用數(shù)據(jù)類型

    data type. SQL 開發(fā)人員必須在創(chuàng)建 SQL 表時決定表中的每個列將要存儲的數(shù)據(jù)的類型。數(shù)據(jù)類型是一標(biāo)簽,是便于 SQL 了解每個列期望存儲什么類型的數(shù)據(jù)的指南,它也標(biāo)
    的頭像 發(fā)表于 08-18 09:46 ?887次閱讀

    避雷!樹莓派初學(xué)者常犯的5錯誤!

    如果你剛剛?cè)胧謽漭?,你就會知道它潛力無窮,幾乎能實現(xiàn)你想到的任何功能。然而,這種自由也讓你可能在不知不覺中做出對系統(tǒng)有害的操作。在本文中,我將介紹要避免哪些錯誤。初學(xué)者最常犯的錯誤包括:損壞SD
    的頭像 發(fā)表于 07-22 17:16 ?1586次閱讀
    避雷!樹莓派初學(xué)者常犯的5<b class='flag-5'>個</b><b class='flag-5'>錯誤</b>!

    程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)

    的地址)出發(fā),采用推導(dǎo)的方式,深入淺出的分析了廣大C程序員學(xué)習(xí)和開發(fā)中遇到的難點。 2. 從方法論的高度對C語言在數(shù)據(jù)結(jié)構(gòu)和算法方面的應(yīng)用進行了深入講解和闡述。 3. 講解了絕大多數(shù)C程序員開發(fā)
    發(fā)表于 05-13 16:45
    孟村| 文山县| 扶风县| 北票市| 沁阳市| 四会市| 泰州市| 双辽市| 镇远县| 高雄县| 来凤县| 天气| 万州区| 开远市| 扎赉特旗| 闵行区| 昌吉市| 克山县| 平昌县| 肇东市| 郎溪县| 巴塘县| 武强县| 卢氏县| 茶陵县| 肇庆市| 上思县| 曲靖市| 田阳县| 星子县| 竹山县| 淮南市| 西乌珠穆沁旗| 襄城县| 澄江县| 郸城县| 富蕴县| 绥芬河市| 天门市| 贡嘎县| 武清区|