今天我們來聊聊java開發(fā)者的基礎(chǔ)應(yīng)用(下層基筑決定上層高度)

一谴分、命名風(fēng)格

【強(qiáng)制】類名使用 UpperCamelCase 風(fēng)格,必須遵從駝峰形式状土,但以下情形例外:DO / BO / DTO / VO / AO

正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion

反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

【強(qiáng)制】方法名、參數(shù)名精算、成員變量、局部變量都統(tǒng)一使用 lowerCamelCase 風(fēng)格,必須遵從 駝峰形式搞动。

正例: localValue / getHttpMessage() / inputUserId

【強(qiáng)制】常量命名全部大寫躏精,單詞間用下劃線隔開,力求語義表達(dá)完整清楚鹦肿,不要嫌名字長(zhǎng)矗烛。

正例:MAX_STOCK_COUNT 反例:MAX_COUNT

【強(qiáng)制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結(jié)尾箩溃;測(cè)試類命名以它要測(cè)試的類的名稱開始瞭吃,以 Test 結(jié)尾。

【強(qiáng)制】Model 類中布爾類型的變量涣旨,都不要加 is歪架,否則部分框架解析會(huì)引起序列化錯(cuò)誤。

反例:定義為基本數(shù)據(jù)類型 Boolean isDeleted霹陡;的屬性和蚪,它的方法也是 isDeleted(),RPC框架在反向解析的時(shí)候烹棉,“以為”對(duì)應(yīng)的屬性名稱是 deleted攒霹,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常浆洗。

【強(qiáng)制】對(duì)于 Service 和 DAO 類催束,基于 SOA 的理念,暴露出來的服務(wù)一定是接口伏社,內(nèi)部的實(shí)現(xiàn)類用 Impl 的后綴與接口區(qū)別抠刺。 正例:CacheManagerImpl 實(shí)現(xiàn) CacheManager 接口。

【推薦】為了達(dá)到代碼自解釋的目標(biāo)洛口,任何自定義編程元素在命名時(shí)矫付,使用盡量完整的單詞組合來表達(dá)其意。

正例:從遠(yuǎn)程倉(cāng)庫(kù)拉取代碼的類命名為PullCodeFromRemoteRepository

反例:變量int a;的隨意命名方式第焰。

【推薦】接口類中的方法和屬性不要加任何修飾符號(hào)(public 也不要加)买优,保持代碼的簡(jiǎn)潔 性,并加上有效 的Javadoc 注釋挺举。盡量不要在接口里定義變量杀赢,如果一定要定義變量,肯定是 與接口方法相關(guān)湘纵,并且是整個(gè)應(yīng)用的基礎(chǔ)常量脂崔。

正例:接口方法簽名:void f(); 接口基礎(chǔ)常量表示:String COMPANY = "alibaba";

反例:接口方法定義:public abstract void f();

說明:JDK8 中接口允許有默認(rèn)實(shí)現(xiàn),那么這個(gè)default方法梧喷,是對(duì)所有實(shí)現(xiàn)類都有價(jià)值的默 認(rèn)實(shí)現(xiàn)砌左。

【參考】枚舉類名建議帶上 Enum 后綴脖咐,枚舉成員名稱需要全大寫,單詞間用下劃線隔開汇歹。

說明:枚舉其實(shí)就是特殊的常量類屁擅,且構(gòu)造方法被默認(rèn)強(qiáng)制是私有。

正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKOWN_REASON产弹。

【參考】各層命名規(guī)約:

A) Service/DAO 層方法命名規(guī)約

1) 獲取單個(gè)對(duì)象的方法用 get 做前綴派歌。

2) 獲取多個(gè)對(duì)象的方法用 list 做前綴。

3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴痰哨。

4) 插入的方法用 save/insert 做前綴胶果。

5) 刪除的方法用 remove/delete 做前綴。

6) 修改的方法用 update 做前綴斤斧。

二早抠、變量定義

【推薦】不要使用一個(gè)常量類維護(hù)所有常量,按常量功能進(jìn)行歸類折欠,分開維護(hù)贝或。 說明:大而全的常量類,非得使用查找功能才能定位到修改的常量锐秦,不利于理解和維護(hù)咪奖。

正例:緩存相關(guān)常量放在類 CacheConsts 下;系統(tǒng)配置相關(guān)常量放在類 ConfigConsts 下酱床。

三羊赵、代碼格式

【強(qiáng)制】大括號(hào)的使用約定。如果是大括號(hào)內(nèi)為空扇谣,則簡(jiǎn)潔地寫成{}即可昧捷,不需要換行;如果 是非空代碼塊則:

1) 左大括號(hào)前不換行罐寨。

2) 左大括號(hào)后換行靡挥。

3) 右大括號(hào)前換行。

4) 右大括號(hào)后還有 else 等代碼則不換行 表示終止的右大括號(hào)后必須換行鸯绿。

【強(qiáng)制】 左小括號(hào)和字符之間不出現(xiàn)空格跋破;同樣,右小括號(hào)和字符之間也不出現(xiàn)空格瓶蝴。

反例:if (空格a == b空格)

【強(qiáng)制】if/for/while/switch/do 等保留字與括號(hào)之間都必須加空格毒返。

【強(qiáng)制】任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格舷手。

說明:運(yùn)算符包括賦值運(yùn)算符=拧簸、邏輯運(yùn)算符&&、加減乘除符號(hào)等男窟。

【強(qiáng)制】采用 4 個(gè)空格縮進(jìn)盆赤,禁止使用 tab 字符贾富。

說明:Vue工程采用2個(gè)空格縮進(jìn)

【強(qiáng)制】注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。

正例:// 注釋內(nèi)容弟劲,注意在//和注釋內(nèi)容之間有一個(gè)空格祷安。

【強(qiáng)制】方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格兔乞。

正例:下例中實(shí)參的"a",后邊必須要有一個(gè)空格。method("a", "b", "c");

【強(qiáng)制】IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式凉唐,不要使用 Windows 格式庸追。

【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組台囱、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個(gè)空行淡溯。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。

說明:沒有必要插入多個(gè)空行進(jìn)行隔開簿训。

四咱娶、OOP規(guī)約

【強(qiáng)制】所有的覆寫方法,必須加@Override 注解强品。

【強(qiáng)制】不能使用過時(shí)的類或方法膘侮。

【強(qiáng)制】Object 的 equals 方法容易拋空指針異常,應(yīng)使用常量或確定有值的對(duì)象來調(diào)用 equals的榛。

正例:"test".equals(object);

反例:object.equals("test");

【強(qiáng)制】所有的相同類型的包裝類對(duì)象之間值的比較琼了,全部使用 equals 方法比較。

說明:對(duì)于 Integer var = ? 在-128 至 127 范圍內(nèi)的賦值夫晌,Integer 對(duì)象是在IntegerCache.cache 產(chǎn)生雕薪,會(huì)復(fù)用已有對(duì)象,這個(gè)區(qū)間內(nèi)的 Integer 值可以直接使用==進(jìn)行判斷晓淀,但是這個(gè)區(qū)間之外的所有數(shù)據(jù)所袁,都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對(duì)象凶掰,這是一個(gè)大坑燥爷, 推薦使用 equals 方法進(jìn)行判斷。

【強(qiáng)制】RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型锄俄。

【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯局劲,如果有初始化邏輯,請(qǐng)放在 init 方法中奶赠。

【推薦】當(dāng)一個(gè)類有多個(gè)構(gòu)造方法鱼填,或者多個(gè)同名方法,這些方法應(yīng)該按順序放置在一起毅戈, 便于閱讀苹丸。

【推薦】循環(huán)體內(nèi)愤惰,字符串的連接方式,使用 StringBuilder 的 append 方法進(jìn)行擴(kuò)展赘理。 說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會(huì) new 出一個(gè) StringBuilder 對(duì)象宦言,然后進(jìn)行 append 操作,最后通過 toString 方法返回 String 對(duì)象商模,造成內(nèi)存資源浪費(fèi)奠旺。

反例:

String str = "start"; for (int i = 0; i < 100; i++) { str = str + "hello"; }

【推薦】慎用 Object 的 clone 方法來拷貝對(duì)象。 說明:對(duì)象的 clone 方法默認(rèn)是淺拷貝施流,若想實(shí)現(xiàn)深拷貝需要重寫 clone 方法實(shí)現(xiàn)屬性對(duì)象 的拷貝响疚。

五、集合處理

【強(qiáng)制】使用集合轉(zhuǎn)數(shù)組的方法瞪醋,必須使用集合的 toArray(T[] array)忿晕,傳入的是類型完全一樣的數(shù)組,大小就是 list.size()银受。

說明:使用 toArray 帶參方法践盼,入?yún)⒎峙涞臄?shù)組空間不夠大時(shí),toArray 方法內(nèi)部將重新分配 內(nèi)存空間宾巍,并返回新數(shù)組地址咕幻;如果數(shù)組元素大于實(shí)際所需,下標(biāo)為[ list.size() ]的數(shù)組 元素將被置為 null蜀漆,其它數(shù)組元素保持原值谅河,因此最好將方法入?yún)?shù)組大小定義與集合元素 個(gè)數(shù)一致。 正例:

List list = new ArrayList(2); list.add("guan"); list.add("bao"); String[] array = new String[list.size()]; array = list.toArray(array);

反例:直接使用 toArray 無參方法存在問題确丢,此方法返回值只能是 Object[]類绷耍,若強(qiáng)轉(zhuǎn)其它 類型數(shù)組將出現(xiàn) ClassCastException 錯(cuò)誤。

【強(qiáng)制】不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作鲜侥。remove 元素請(qǐng)使用 Iterator方式褂始,如果并發(fā)操作,需要對(duì) Iterator 對(duì)象加鎖描函。

正例:

Iterator iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } }

反例:

List list = new ArrayList(); list.add("1"); list.add("2"); for (String item : list) { if ("1".equals(item)) { list.remove(item); } }

【推薦】使用 entrySet 遍歷 Map 類集合 KV崎苗,而不是 keySet 方式進(jìn)行遍歷。

六舀寓、控制語句

【強(qiáng)制】在一個(gè) switch 塊內(nèi)胆数,每個(gè) case 要么通過 break/return 等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè) case 為止互墓;在一個(gè) switch 塊內(nèi)必尼,都必須包含一個(gè) default 語句并且 放在最后,即使它什么代碼也沒有。

【強(qiáng)制】在 if/else/for/while/do 語句中必須使用大括號(hào)判莉。即使只有一行代碼豆挽,避 單行的編碼方式:if (condition) statements;

【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句券盅,將復(fù) 雜邏輯判斷的結(jié)果賦值給一個(gè)有意義的布爾變量名帮哈,以提高可讀性。 說明:很多 if 語句內(nèi)的邏輯相當(dāng)復(fù)雜锰镀,閱讀者需要分析條件表達(dá)式的最終結(jié)果娘侍,才能明確什么 樣的條件執(zhí)行什么樣的語句,那么泳炉,如果閱讀者分析邏輯表達(dá)式錯(cuò)誤呢私蕾?

正例: // 偽代碼如下

final boolean existed = (file.open(fileName, "w") != null) && (...) || (...); if (existed) { ... }

反例:

if ((file.open(fileName, "w") != null) && (...) || (...)) { ... }

【推薦】循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理胡桃,如定義對(duì)象、變量磕潮、 獲取數(shù)據(jù)庫(kù)連接翠胰,進(jìn)行不必要的 try-catch 操作(這個(gè) try-catch 是否可以移至循環(huán)體外)。

【參考】下列情形自脯,需要進(jìn)行參數(shù)校驗(yàn):

1) 調(diào)用頻次低的方法之景。

2) 執(zhí)行時(shí)間開銷很大的方法。此情形中膏潮,參數(shù)校驗(yàn)時(shí)間幾乎可以忽略不計(jì)锻狗,但如果因?yàn)閰?數(shù)錯(cuò)誤導(dǎo)致中間執(zhí)行回退,或者錯(cuò)誤焕参,那得不償失轻纪。

3) 需要極高穩(wěn)定性和可用性的方法。

4) 對(duì)外提供的開放接口叠纷,不管是 RPC/API/HTTP 接口刻帚。 5) 敏感權(quán)限入口。

七涩嚣、注釋規(guī)約

【強(qiáng)制】類崇众、類屬性、類方法的注釋必須使用 Javadoc 規(guī)范航厚,使用/**內(nèi)容*/ 格式顷歌,不得使用 // xxx 方式。

【強(qiáng)制】所有的抽象方法(包括接口中的方法)必須要用 Javadoc 注釋幔睬、除了返回值眯漩、參數(shù)、 異常說明外溪窒,還必須指出該方法做什么事情坤塞,實(shí)現(xiàn)什么功能冯勉。 說明:對(duì)子類的實(shí)現(xiàn)要求,或者調(diào)用注意事項(xiàng)摹芙,請(qǐng)一并說明灼狰。

【強(qiáng)制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。

【強(qiáng)制】方法內(nèi)部單行注釋浮禾,在被注釋語句上方另起一行交胚,使用//注釋。方法內(nèi)部多行注釋 使用/* */注釋盈电,注意與代碼對(duì)齊蝴簇。

【強(qiáng)制】所有的枚舉類型字段必須要有注釋,說明每個(gè)數(shù)據(jù)項(xiàng)的用途匆帚。

【推薦】代碼修改的同時(shí)熬词,注釋也要進(jìn)行相應(yīng)的修改,尤其是參數(shù)吸重、返回值互拾、異常、核心邏輯 等的修改嚎幸。 說明:代碼與注釋更新不同步颜矿,就像路網(wǎng)與導(dǎo)航軟件更新不同步一樣,如果導(dǎo)航軟件嚴(yán)重滯后嫉晶, 就失去了導(dǎo)航的意義骑疆。

【參考】謹(jǐn)慎注釋掉代碼。在上方詳細(xì)說明替废,而不是簡(jiǎn)單地注釋掉箍铭。如果無用,則刪除舶担。

【參考】對(duì)于注釋的要求:第一坡疼、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;第二衣陶、能夠描述業(yè)務(wù)含 義柄瑰,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對(duì)于閱讀者形同 天書剪况,注釋是給自己看的教沾,即使隔很長(zhǎng)時(shí)間,也能清晰理解當(dāng)時(shí)的思路译断;注釋也是給繼任者看 的授翻,使其能夠快速接替自己的工作。

【參考】好的命名、代碼結(jié)構(gòu)是自解釋的堪唐,注釋力求精簡(jiǎn)準(zhǔn)確巡语、表達(dá)到位。避免出現(xiàn)注釋的 一個(gè)極端:過多過濫的注釋淮菠,代碼的邏輯一旦修改男公,修改注釋是相當(dāng)大的負(fù)擔(dān)。

【參考】特殊注釋標(biāo)記合陵,請(qǐng)注明標(biāo)記人與標(biāo)記時(shí)間枢赔。注意及時(shí)處理這些標(biāo)記,通過標(biāo)記掃描拥知, 經(jīng)常清理此類標(biāo)記踏拜。線上故障有時(shí)候就是來源于這些標(biāo)記處的代碼。

1) 待辦事宜(TODO):( 標(biāo)記人低剔,標(biāo)記時(shí)間速梗,[預(yù)計(jì)處理時(shí)間]) 表示需要實(shí)現(xiàn),但目前還未實(shí)現(xiàn)的功能襟齿。這實(shí)際上是一個(gè) Javadoc 的標(biāo)簽镀琉,目前的 Javadoc 還沒有實(shí)現(xiàn),但已經(jīng)被廣泛使用蕊唐。只能應(yīng)用于類,接口和方法(因?yàn)樗且粋€(gè) Javadoc 標(biāo)簽)烁设。

2) 錯(cuò)誤替梨,不能工作(FIXME):(標(biāo)記人,標(biāo)記時(shí)間装黑,[預(yù)計(jì)處理時(shí)間]) 在注釋中用 FIXME 標(biāo)記某代碼是錯(cuò)誤的副瀑,而且不能工作,需要及時(shí)糾正的情況恋谭。

八糠睡、其他

【強(qiáng)制】在使用正則表達(dá)式時(shí),利用好其預(yù)編譯功能疚颊,可以有效加快正則匹配速度狈孔。 說明:不要在方法體內(nèi)定義:Pattern pattern = Pattern.compile(規(guī)則);

【強(qiáng)制】注意 Math.random() 這個(gè)方法返回是 double 類型,注意取值的范圍 0≤x<1(能夠 取到零值材义,注意除零異常)均抽,如果想獲取整數(shù)類型的隨機(jī)數(shù),不要將 x 放大 10 的若干倍然后 取整其掂,直接使用 Random 對(duì)象的 nextInt 或者 nextLong 方法油挥。

【強(qiáng)制】獲取當(dāng)前毫秒數(shù) System.currentTimeMillis(); 而不是 new Date().getTime();

【推薦】任何數(shù)據(jù)結(jié)構(gòu)的構(gòu)造或初始化,都應(yīng)指定大小,避免數(shù)據(jù)結(jié)構(gòu)無限增長(zhǎng)吃光內(nèi)存深寥。

九攘乒、異常處理

【強(qiáng)制】捕獲異常是為了處理它,不要捕獲了卻什么都不處理而拋棄之惋鹅,如果不想處理它则酝,請(qǐng) 將該異常拋給它的調(diào)用者。最外層的業(yè)務(wù)使用者负饲,必須處理異常堤魁,將其轉(zhuǎn)化為用戶可以理解的 內(nèi)容。

十返十、MySQL數(shù)據(jù)庫(kù)

建立表規(guī)約

【強(qiáng)制】表名妥泉、字段名必須使用小寫字母或數(shù)字,禁止出現(xiàn)數(shù)字開頭洞坑,禁止兩個(gè)下劃線中間只 出現(xiàn)數(shù)字盲链。數(shù)據(jù)庫(kù)字段名的修改代價(jià)很大,因?yàn)闊o法進(jìn)行預(yù)發(fā)布迟杂,所以字段名稱需要慎重考慮刽沾。

說明:MySQL 在 Windows 下不區(qū)分大小寫,但在 Linux 下默認(rèn)是區(qū)分大小寫排拷。因此侧漓,數(shù)據(jù)庫(kù) 名、表名监氢、字段名布蔗,都不允許出現(xiàn)任何大寫字母,避免節(jié)外生枝浪腐。

正例:aliyun_admin纵揍,rdc_config,level3_name 反例:AliyunAdmin议街,rdcConfig泽谨,level_3_name

【強(qiáng)制】禁用保留字,如 desc特漩、range吧雹、match、delayed 等涂身,請(qǐng)參考 MySQL 官方保留字吮炕。

【強(qiáng)制】主鍵索引名為 pk_字段名;唯一索引名為 uk_字段名访得;普通索引名則為 idx_字段名龙亲。 說明:pk_ 即 primary key陕凹;uk_ 即 unique key;idx_ 即 index 的簡(jiǎn)稱鳄炉。

【強(qiáng)制】小數(shù)類型為 decimal杜耙,禁止使用 float 和 double。

【強(qiáng)制】如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等拂盯,使用 char 定長(zhǎng)字符串類型佑女。

【強(qiáng)制】varchar 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間谈竿,長(zhǎng)度不要超過 5000团驱,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類型為 text空凸。

【強(qiáng)制】表必備三個(gè)字段:id嚎花,create_time, update_time, delete_flag

【強(qiáng)制】對(duì)于Boolean型的字段,采用decimal類型

【強(qiáng)制】表和字段都需要添加注釋信息呀洲。

【推薦】單表行數(shù)超過 500 萬行或者單表容量超過 2GB紊选,才推薦進(jìn)行分庫(kù)分表。 說明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別道逗,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表兵罢。

【參考】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間滓窍、節(jié)約索引存儲(chǔ)卖词,更重要的是提升檢 索速度。

十一吏夯、索引規(guī)約

【強(qiáng)制】業(yè)務(wù)上具有唯一特性的字段坏平,即使是多個(gè)字段的組合,也必須建成唯一索引锦亦。

說明:不要以為唯一索引影響了 insert 速度,這個(gè)速度損耗可以忽略令境,但提高查找速度是明 顯的杠园;另外,即使在應(yīng)用層做了非常完善的校驗(yàn)控制舔庶,只要沒有唯一索引抛蚁,根據(jù)墨菲定律,必 然有臟數(shù)據(jù)產(chǎn)生惕橙。

【強(qiáng)制】超過三個(gè)表禁止 join瞧甩。需要 join 的字段,數(shù)據(jù)類型必須絕對(duì)一致弥鹦;多表關(guān)聯(lián)查詢時(shí)肚逸, 保證被關(guān)聯(lián)的字段需要有索引。

說明:即使雙表 join 也要注意表索引、SQL 性能嘉赎。

【強(qiáng)制】在 varchar 字段上建立索引時(shí)米辐,必須指定索引長(zhǎng)度,沒必要對(duì)全字段建立索引务冕,根據(jù) 實(shí)際文本區(qū)分度決定索引長(zhǎng)度即可血当。

說明:索引的長(zhǎng)度與區(qū)分度是一對(duì)矛盾體,一般對(duì)字符串類型數(shù)據(jù)禀忆,長(zhǎng)度為 20 的索引臊旭,區(qū)分度會(huì)高達(dá) 90%以上,可以使用 count(distinct left(列名, 索引長(zhǎng)度))/count(*)的區(qū)分度 來確定箩退。

【參考】創(chuàng)建索引時(shí)避免有如下極端誤解:

1)寧濫勿缺离熏。認(rèn)為一個(gè)查詢就需要建一個(gè)索引。

2)寧缺勿濫乏德。認(rèn)為索引會(huì)消耗空間撤奸、嚴(yán)重拖慢更新和新增速度。

3)抵制惟一索引喊括。認(rèn)為業(yè)務(wù)的惟一性一律需要在應(yīng)用層通過“先查后插”方式解決胧瓜。

十二、SQL語句

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

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

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

【強(qiáng)制】當(dāng)某一列的值全是 NULL 時(shí)碎捺,count(col)的返回結(jié)果為 0,但 sum(col)的返回結(jié)果為NULL.

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

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

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

【參考】如果有全球化需要,所有的字符存儲(chǔ)與表示势腮,均以 utf-8 編碼联贩,注意字符 的區(qū)別。

說明: SELECT LENGTH("輕松工作")捎拯; 返回為 12 SELECT CHARACTER_LENGTH("輕松工作")泪幌; 返回為 4 如果需要存儲(chǔ)表情,那么選擇 utfmb4 來進(jìn)行存儲(chǔ)署照,注意它與 -8 編碼的區(qū)別祸泪。

【強(qiáng)制】更新數(shù)據(jù)表記錄時(shí),必須同時(shí)更新記錄對(duì)應(yīng)的 update_time 字段值為當(dāng)前時(shí)間建芙。

【參考】@Transactional 事務(wù)不要濫用没隘。事務(wù)會(huì)影響數(shù)據(jù)庫(kù)的 QPS,另外使用事務(wù)的地方需 要考慮各方面的回滾方案禁荸,包括緩存回滾右蒲、搜索引擎回滾、消息補(bǔ)償赶熟、統(tǒng)計(jì)修正等瑰妄。

轉(zhuǎn)載地址:https://blog.csdn.net/qq_41534566/article/details/80030808

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市映砖,隨后出現(xiàn)的幾起案子间坐,更是在濱河造成了極大的恐慌,老刑警劉巖邑退,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹宋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡地技,警方通過查閱死者的電腦和手機(jī)蜈七,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莫矗,“玉大人飒硅,你說我怎么就攤上這事∪に眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵梯轻,是天一觀的道長(zhǎng)食磕。 經(jīng)常有香客問我,道長(zhǎng)喳挑,這世上最難降的妖魔是什么彬伦? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任滔悉,我火速辦了婚禮,結(jié)果婚禮上单绑,老公的妹妹穿的比我還像新娘回官。我一直安慰自己,他們只是感情好搂橙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布歉提。 她就那樣靜靜地躺著,像睡著了一般区转。 火紅的嫁衣襯著肌膚如雪苔巨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天废离,我揣著相機(jī)與錄音侄泽,去河邊找鬼。 笑死蜻韭,一個(gè)胖子當(dāng)著我的面吹牛悼尾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肖方,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闺魏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了窥妇?” 一聲冷哼從身側(cè)響起舷胜,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎活翩,沒想到半個(gè)月后烹骨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡材泄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年沮焕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拉宗。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峦树,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旦事,到底是詐尸還是另有隱情魁巩,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布姐浮,位于F島的核電站谷遂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卖鲤。R本人自食惡果不足惜肾扰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一畴嘶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧集晚,春花似錦窗悯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至条摸,卻和暖如春悦污,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钉蒲。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工切端, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷啼。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓踏枣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钙蒙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茵瀑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容