1. 程式人生 > >學員會診之03:你那慘不忍睹的三層架構

學員會診之03:你那慘不忍睹的三層架構

        最近檢查作業,雖然我們反覆強調三層架構就是:表示層、業務邏輯層、資料訪問層,每個層只做自己應該做的事情,但是,部分同學的作業還是不理想啊~~~

        你以為的三層架構是這樣的:

        而實際上你的三層架構是這樣的:

        如果我們尚不能完全瞭解把握各個層的邊界,那麼我們首先僅需要記住下面兩句話:

        1:除了UI層,任何其它層不要出現System.out;

        2:除了DAO層,任何其它層不要出現SQL;

1.除了UI層,任何其它層不要出現System.out

        在三層架構的作業中,我們寫到:

        這句話本來說的是service層應該是和具體的資料儲存無關的,但是反過來說,service同時也應該是和具體的頁面展示無關的。這是什麼意思呢?

        先來看趙同學的這個專案結構:

        Very清晰,沒有任何問題(其實有問題)。但現在讓我們開啟biz下的一個檔案:

        可以看到,在Service層的ScoreService相關方法中,出現了很多接受使用者輸入的程式碼。

        這是不能接受的,如果是在BS程式中,相當於我們把網頁寫到了service層。

        接受使用者輸入一定是在UI層完成的,修改之後的這兩個方法,應該長成這樣才行:

        仔細比對下之前的save。在呼叫save方法之前,name和pwd和grade應該在UI層就已經得到了。另外,我也去掉了id,為什麼呢?如果你的id在資料庫中是自增的,那麼根本不需要得到它。當然存在一種情況,我們不需要id由資料庫自己生成,而是由程式碼根據業務特點自己生成,那麼確實就應該放在Service的當前方法來生成。但是看這段程式碼,顯然不需要,因為趙同學首先從資料庫取id的max值,然後+1,然後再insert回去,那不就是資料庫的自增欄位嗎?所以這樣做又是何必呢。

        上面的save還可以繼續改造

        也就是說,service所要引數是UI層已經構造好的物件。到了web階段,尤其使用了各種MVC框架後,這些物件可以直接由框架構造好,故service層用到的引數是這些實體物件才是更常見的。

2.除了DAO層,任何其它層不要出現SQL

        接著來看第二個同樣重要的問題

        怎麼可以這樣呢,趙同學,你傷我的心了~~~

        你可是一個月寫了6篇部落格的同學,然而到了這個作業一下子坍塌了,是不是太驕傲導致你看都不看什麼是三層架構?

        請把所有見得到的sql丟到dao層去。

3.Dao層返回什麼?

        趙同學的作業簡直慘不忍睹,把所有能犯的錯誤全部犯了,如下:

        在這個queryall的dao方法中,它返回了一個void,然後列表直接在方法中遍歷輸出,我只能說一個大大的服

        而正常的做法是,返回List<Score>,然後在UI層輸出。

除了select,CRUD中的CUD返回什麼呢?

        Insert、update、delete語句JDBC都會返回一個int值,表明在資料庫中影響的行數,舉例來說,

        如果新增一條記錄,則jdbc返回的就是1;

        如果更新了10條記錄,則jdbc返回的就是10;

        而dao就是要真實反映資料庫操作,故以趙同學的delete為例

        應該修改為:

        看到沒,我連方法名都改了(哼哼,還有SQL注入哦)。

4.Service怎麼處理dao層返回的int值?

        Service層不應該再反映資料庫的狀態了,所以,以deleteByName為例,service應該這麼寫:

        或者這麼寫:

        如果是第一種寫法,得有一個全域性處理異常的地方,如果是後一種寫法,則UI層自己展示刪除結果資訊給使用者。

5.其它問題

        A:SQL注入。這個問題就不多說了,用引數化SQL解決之;

        B:分層不應該用package,而應該是project,這是作業裡面要求的;

        C:命名不規範;

        暫時就這些吧,如果寫多了估計會打擊趙同學的積極性,畢竟,我們還要趙同學笑著活下去呢~~

相關推薦

學員會診03慘不忍睹架構

        最近檢查作業,雖然我們反覆強調三層架構就是:表示層、業務邏輯層、資料訪問層,每個層只做自己應該做的事情,但是,部分同學的作業還是不理想啊~~~         你以為的三層架構是這樣的:         而實際上你的三層架構是這樣的:         如果我們尚不能完全瞭解把握各

學員會診04為什麼找不到工作?

我有一段時間看到文同學和潘同學比較的窩火,明明學的也還不錯,卻老是跟我說找不到工作。 先說說文同學。文同學很有意思,剛畢業那會面試機會還蠻多,並且沒兩天還拿下一個offer:某個小軟體公司讓他去做架構師~~。當然他面試的職位是Java工程師,一下子沒發揮好,吹的太厲害了,對方直接讓他上來做架構師~~~。那他

學員會診01那些典型的面向物件錯誤

       我原本不想用“錯誤”二字。因為錯誤顯得太嚴重了,並且,軟體編碼本身就沒有對錯,只要你把功能實現了,剩下的就是思想流派的分歧。但這裡仍舊想用“錯誤”兩個字,因為本篇診斷所涉及的那些問題基本已經屬於當前軟體開發規則中的普適需要避免的。        注意,被診斷的學員並不是學的差的學員,相反,他有

學員會診02SVN協作以及Page類的設計

三層架構的學生管理系統是我們第一個稍微大型的專案:分層、一個解決方案多個Project,所以值得我們停下來好好審查審查。 1.測試SVN伺服器地址 我們的作業要求學員建立自己的SVN伺服器,並且將程式碼commit上去,然後講師進行批改是從原始碼伺服器上獲取程式碼,繼而review。這非常類似於敏捷開

第二十七章JavaEE專案的架構

作者:java_wxid JavaEE專案的三層架構 分層的作用 方便專案後期的維護和升級,以及擴充套件。 分層的好處是降低程式碼的耦合度 分層後的程式碼包結構 Dao持久層的包 com.dao 放dao層的介面 com.dao.impl 放dao層的實現類 Se

PowerBuilder編程新思維3適配(架構與GraphQL)

erp軟件 支持 sqli mar prism 源碼 手動 auto png PowerBuilder編程新思維3:適配(三層架構與GraphQL) PB在富客戶端時代,是一線開發工具。隨著網絡發展,主流架構演進到三層架構的時代,PB拿不出有力的三層架構,已經明顯力不從心,

楊老師課堂JavaWeb體系的MVC與架構有什麼區別

首先,宣告一下,三層是三層,MVC是MVC,這倆是毫無關係的。 三層是從整個應用程式架構的角度來分的三層(如果程式需要,還可以分多層)。 三層架構通常包括表示層,業務邏輯層以及資料訪問層。雖然三層架構將系統在邏輯上分成了三層,但是它並不是物理上的分層。也就是

Oracle 資料庫見過最高的 SQL Version 是多少?

Oracle資料庫中執行的SQL,很多時候會因為種種原因產生多個不同的執行版本,一個遊標的版本過多很容易引起資料庫的效能問題,甚至故障。 有時候一個SQL的版本數量可能多達數萬個,以下是我之前在”雲和恩墨大講堂”分享過的一個案例。這個報告中的 SQL,最高達到了26萬個 SQL 版本。算是我見過的“

零售激起片“死海”

在百度鍵入“寒冬”,92萬詞條中,比寒冬天氣更讓人打顫的是零售業寒冬、遊戲業寒冬、車市寒冬、創業寒冬、券商營業寒冬、股市寒冬……這些字眼。一個企業,最害怕聽到“死亡”,但硬著頭皮要面對也是“死亡”。 01 萬億規模的“圍城”誘餌 市場就像一座圍城,城外的人總是禁不住誘惑拼命往進擠,而且是萬億市場做“誘餌

Java全棧程式設計師03Ubuntu下安裝idea

JetBrains的產品我曾經用過很長一段時間,它們是resharper和dotcover。VS號稱宇宙最強IDE,直到它遇到了resharper,我們才知道,原來vs可以更好。DotCover是一個計算程式碼覆蓋率的工具,過去,我們為了應付QA的檢查,與DotCover成了最好的朋友。 我有一段時間(其實

[C#.NET 拾遺補漏]03可能不知道的幾種物件初始化方式

閱讀本文大概需要 1.2 分鐘。 隨著 C# 的升級,C# 在語法上對物件的初始化做了不少簡化,來看看有沒有你不知道的。 陣列的初始化 在上一篇羅列陣列的小知識的時候,其中也提到了陣列的初始化,這時直接引用過來。 int[] arr = new int[3] {1, 2, 3}; // 正兒八經的初始化in

Netty想要的NIO知識點,這裡都有!

![NIO思維導圖.png](https://s1.ax1x.com/2020/07/21/UTeKc4.png) 高清思維導圖原件(`xmind/pdf/jpg`)可以關注公眾號:`一枝花算不算浪漫` 回覆`nio`即可。(文末有二維碼) ## 前言 抱歉好久沒更原創文章了,看了下上篇更新時間,已經

趣談網路協議---容器網路Flannel每人一畝分地

Kubernetes,可靈活地將一個容器排程到任何一臺機器上,還可修改容器的副本數。 要解決的重要問題,是通訊。 1、應用將自己環境的 IP 和埠註冊到註冊中心指揮部,方便其他應用請求。如果發生變化,重新註冊。 2、應用如何相互通訊?通過 Flannel。 (

程式設計菜鳥到大佬演算法基礎(

第三天學習精要 列舉 稱硬幣 例題3:POJ1013 稱硬幣 題目描述 有12枚硬幣。其中有11枚真幣和1枚假幣。 假幣和真幣重量不同,但不知道假幣比真幣輕還是重。 現在,用一架天平稱了這些

企業級負載均衡解決方案美團點評四負載均衡解決方案MGW

一、前言在網際網路廠商業務不斷擴充套件之後,多種服務的入口會導致接入流量的劇增,所以多數基於IPVS或者Nginx等初級負載均衡技術的早期方案都會面臨故障或者失效,所以就像google開發meglev一樣,許多網際網路服務提供商也都紛紛開發自己的分散式軟體負載均衡系統作為對外

Java自學路-Java中級教程-12SpringMVC的架構模型、表現、控制

MVC即Model、View、Controller三者的縮寫。Model為模型層,View為表現層,Controller為控制層。其中M處於最底層,V在最上層,中間層為Controller。比如使用者訪問網站,首先接觸的是View,即是網頁。通過訪問網頁的url,就會傳到Co

單元測試系列4使用Unitils測試DAO

Spring 的測試框架為我們提供一個強大的測試環境,解決日常單元測試中遇到的大部分測試難題:如執行多個測試用例和測試方法時,Spring上下文只需建立一次;資料庫現場不受破壞;方便手工指定Spring配置檔案、手工設定Spring容器是否需要重新載入等。但也存在不足的地方,

架構成長分布式緩存架構設計分析

從數據 點贊 高可用性 rdb 保護 取模 key 矛盾 nsh 前言 在高並發場景下,需要通過緩存來減少數據庫的壓力,使得大量的訪問進來能夠命中緩存,只有少量的需要到數據庫層。由於緩存基於內存,可支持的並發量遠遠大於基於硬盤的數據庫。所以對於高並發設計,緩存的設計是必不可

什麽是架構真的理解分層的意義嗎?

靜下心來 感到 面向過程 基於 用不了 加班 str transacti context 首先聲明,本文並不是介紹什麽是N層架構,然後給張分層圖,最後來一堆代碼結束。本文主要是對分層過程中常常讓人感到困惑地方的思考,從個人經驗角度出發,努力嘗試來解決這些困惑,歡迎拍磚!開始

JavaEE架構傳統架構,叢集架構,分散式架構,微服務架構

javaEE架構 1.傳統三層架構(all in one專案) 傳統三層架構大致可以分為表現層,業務層和持久層(資料訪問層)。其中表現層負責接受請求和轉發請求。業務層負責處理請求(注:事務管理,日誌記錄等AOP型別的操作均封裝在這一層)。持久層主要負責資料庫與實體之間的操作。