在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

電子工程師 ? 來源:OSCHINA ? 作者:OSCHINA ? 2021-06-07 15:59 ? 次閱讀

Java程序員編程時需要混合面向對象思維和一般命令式編程的方法,能否完美的將兩者結合起來完全得依靠編程人員的水準:

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

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

心境(首先,要寫個好的面向對象程序是比命令式程序難的多,你得花費一些功夫)

但當Java程序員寫SQL語句時,一切都不一樣了。SQL是說明性語言而非面向對象或是命令式編程語言。在SQL中要寫個查詢語句是很簡單的。但在Java里類似的語句卻不容易,因為程序員不僅要反復考慮編程范式,而且也要考慮算法的問題。

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

1、忘掉NULL

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

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

解決方法:

好好的訓練你自己。當你寫SQL時要不停得想到NULL的用法:

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

NULL是否影響到結果?

2、在Java內存中處理數據

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

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

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

性能表現。數據庫應該比你的算法處理起來更加快。而且更加重要的是,你不必再去傳遞數百萬條記錄了。

解決方法:

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

3、使用UNION 代替UNION ALL

UNION ALL(允許重復)

UNION (去除了重復)

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

注意即使SQL標準規定了INTERSECT ALL和EXCEPT ALL,很少數據庫會實現這些沒用的集合操作符。MySQL 系列面試題都整理好了,微信搜索Java技術棧,在后臺發送:面試,可在線刷題。

解決方法:

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

4、通過JDBC分頁技術給大量的結果進行分頁操作

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

解決方法:

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

5、在Java內存中加入數據

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

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

解決方法:

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

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

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

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

對具有很多列的龐大的結果集合來說它很慢。DISTINCT要執行ORDER BY操作來消除重復。

對龐大的笛卡爾積集合來說它很慢,還是需要加載很多的數據到內存中。

解決方法:

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

7、不使用MERGE語句

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

解決方法:

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

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

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

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

使用窗口函數:

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

提升性能,像關系數據庫管理系統能夠更容易優化窗口函數

解決方法:

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

9、使用內存間接排序

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

SQL排序很慢

SQL排序辦不到

解決方法:

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

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

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

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

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

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7232

    瀏覽量

    90627
  • JAVA
    +關注

    關注

    20

    文章

    2982

    瀏覽量

    106408
  • SQL
    SQL
    +關注

    關注

    1

    文章

    779

    瀏覽量

    44662
  • null
    +關注

    關注

    0

    文章

    19

    瀏覽量

    4065

原文標題:Java程序員常犯的 10 個 SQL 錯誤!

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

收藏 人收藏

    評論

    相關推薦

    Devart::dbForge SQL Complete讓生產力上一臺階

    SQL編碼助手,適用于SSMS 和VS 該工具提供上下文感知的代碼補全,使SQL開發人員和數據庫管理能夠更快地編寫代碼。 SQL Complet包含許多實用的功能,這些功能是專門為提
    的頭像 發表于 01-14 11:09 ?396次閱讀
    Devart::dbForge <b class='flag-5'>SQL</b> Complete讓生產力上一<b class='flag-5'>個</b>臺階

    阿里云升級通義靈碼AI程序員,全面上線

    近日,阿里云宣布其備受矚目的通義靈碼AI程序員已正式全面上線,為開發者帶來更為強大和便捷的編程輔助工具。 此次上線的通義靈碼AI程序員,在功能上實現了全面升級。現在,它支持VS Code
    的頭像 發表于 01-09 11:16 ?503次閱讀

    TMS320C6000程序員指南

    電子發燒友網站提供《TMS320C6000程序員指南.pdf》資料免費下載
    發表于 12-24 17:19 ?0次下載
    TMS320C6000<b class='flag-5'>程序員</b>指南

    TMS320C55x DSP CPU程序員參考補充

    電子發燒友網站提供《TMS320C55x DSP CPU程序員參考補充.pdf》資料免費下載
    發表于 12-21 11:36 ?0次下載
    TMS320C55x DSP CPU<b class='flag-5'>程序員</b>參考補充

    UCD3138A64/UCD3138128程序員手冊

    電子發燒友網站提供《UCD3138A64/UCD3138128程序員手冊.pdf》資料免費下載
    發表于 12-09 14:42 ?0次下載
    UCD3138A64/UCD3138128<b class='flag-5'>程序員</b>手冊

    機械革命發布CODE AI程序員

    近日,英特爾新質生產力技術生態大會在成都舉行,機械革命作為重要參展商帶來了多款明星產品引爆全場!其中更是在AI PC軟件生態產品發布分論壇上,Intel、智譜、機械革命三方聯合發布了專為程序員設計的CODE AI程序員本,成為本次大會的一大亮點。
    的頭像 發表于 11-30 10:34 ?821次閱讀

    Linux驅動程序程序員指南

    電子發燒友網站提供《Linux驅動程序程序員指南.pdf》資料免費下載
    發表于 11-22 15:53 ?0次下載
    Linux驅動<b class='flag-5'>程序</b><b class='flag-5'>程序員</b>指南

    SQL錯誤代碼及解決方案

    SQL數據庫開發和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在
    的頭像 發表于 11-19 10:21 ?5271次閱讀

    C++新手容易的十編程錯誤

    簡單的總結一下?C++ 新手容易的一些編程錯誤,給新人們提供一參考。 1 有些關鍵字在 cpp 文件中多寫了 對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再
    的頭像 發表于 11-15 12:42 ?781次閱讀

    AI編程工具會不會搶程序員飯碗

    AI編程工具可輔助編程,減少手動編碼,提升效率,對程序員有積極影響也有挑戰。程序員需深化技能、拓寬知識應對。長遠看,AI與人類程序員將共生共榮。
    的頭像 發表于 11-08 10:17 ?406次閱讀

    第五屆長沙·中國1024程序員節開幕

    據官方媒體報道,10月24日;? 第五屆長沙·中國1024程序員節在湖南湘江新區開幕;本次中國1024程序員節以“智能應用新生態”為主題。設置有岳麓對話、技術英雄會、主題峰會及賽事、展覽等活動,一場
    的頭像 發表于 10-25 15:42 ?367次閱讀

    京東上萬程序員都AI用它!

    對大模型生成代碼進行智能修復,為程序員開啟代碼漏洞修復的“自動駕駛”模式,不但減少人工接入、提高工作效率,更為企業抵御內外部各種攻擊構建起一道堅固的安全屏障,確保業務的連續性和穩定性。 JoyCoder是京東云自主研發的一款輔助開發人員
    的頭像 發表于 07-17 16:29 ?382次閱讀
    京東上萬<b class='flag-5'>程序員</b>都AI用它!

    程序員節視頻創意大賽,用串口屏贏取千元大獎

    10月24日,程序員專屬的節日里,我們盛大開啟“程序員節視頻創意大賽”特別活動!這不僅是一場視覺的盛宴,更是智慧與創意的璀璨碰撞。我們誠摯邀請每一位程序員及編程愛好者,拿起你的鏡頭,記
    的頭像 發表于 07-08 10:38 ?72次閱讀
    <b class='flag-5'>程序員</b>節視頻創意大賽,用串口屏贏取千元大獎

    程序員節視頻創意盛宴,邀您共襄盛舉!

    10月24日,程序員專屬的節日里,我們盛大開啟“程序員節視頻創意大賽”特別活動!這不僅是一場視覺的盛宴,更是智慧與創意的璀璨碰撞。我們誠摯邀請每一位程序員及編程愛好者,拿起你的鏡頭,記
    的頭像 發表于 07-04 09:00 ?67次閱讀
    <b class='flag-5'>程序員</b>節視頻創意盛宴,邀您共襄盛舉!

    甲骨文發布AI編程助手,助用戶編寫JavaSQL程序

    據悉,Oracle Code Assist基于甲骨文先進的云計算平臺——Oracle Cloud Infrastructure (OCI)構建,重點優化各項Java、SQL程序以及OCI應用開發環節。
    的頭像 發表于 05-13 10:19 ?746次閱讀
    主站蜘蛛池模板: 男女交性视频免费播放视频 | 亚洲热热久久九九精品 | 夜夜爽一区二区三区精品 | 97成人资源 | 五月天婷婷在线播放 | 亚洲爱爱图| 亚洲高清一区二区三区四区 | 免费在线黄网站 | 国产亚洲一区二区三区在线 | 韩国三级久久精品 | 三级网站免费 | 成人在线黄色 | 国产欧美视频在线 | 网色| 最新午夜宅男 | 黑人一区二区三区中文字幕 | 人人干人人模 | 成人久久久精品乱码一区二区三区 | 黄色免费大全 | 97影院午夜在线观看视频 | 国产老师的丝袜在线看 | 美女扒开尿口让男生添 漫画 | 国产精品高清一区二区三区不卡 | 国产一级特黄aaa大片 | 成人综合婷婷国产精品久久免费 | 99精品久久99久久久久久 | 啪啪免费网 | 免费番茄社区性色大片 | 中文一区二区 | 椎名空中文字幕一区二区 | 久久国产免费 | 天天在线天天综合网色 | 日本黄色大片在线播放视频免费观看 | 午夜影院观看 | 狠狠色丁香 | 欧美网站色 | 超h 高h 污肉男男 | 亚洲人成在线精品 | 免费看一级特黄a大片 | 欧美经典三级春潮烂漫海棠红 | 噜噜爽 |