用戶管理系統(tǒng),實(shí)現(xiàn)簡單的用戶管理,有包括普通用戶、管理員;功能包括添加用戶,刪除用戶,查詢用戶信息,更改用戶信息等等,主要是通過項(xiàng)目的方式,讓大家一步步數(shù)據(jù)系統(tǒng)的設(shè)計(jì)流程,以及在java開發(fā)中用的比較多的MVC架構(gòu)模式,走向老鳥的第一步!
第一步,先把系統(tǒng)設(shè)計(jì)的包分好
基本系統(tǒng)都會(huì)設(shè)計(jì)以下包:
- 共通包,用于存放公共的操作,例如常量、異常、工具包等等;
共同包命名規(guī)則:
公司名.項(xiàng)目名.common.業(yè)務(wù)邏輯模塊

- 項(xiàng)目包
命名規(guī)則:
公司名.項(xiàng)目名.具體模塊.業(yè)務(wù)邏輯名

項(xiàng)目采用的是 MVC 架構(gòu),
什么是MVC架構(gòu)?
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設(shè)計(jì)創(chuàng)建 Web 應(yīng)用程序的模式:
- Model(模型)表示應(yīng)用程序核心(比如數(shù)據(jù)庫記錄列表)。
- View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。
- Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)。
如下圖解:
MVC組件類型的關(guān)系和功能


對應(yīng)于項(xiàng)目中,可以簡單理解為用各種功能的包(package)對照著 MVC 三層架構(gòu)進(jìn)行分層,具體如下:
- view 包即 V(視圖層);
- controller 包 即 C(控制器);
- 對于 M(模塊層)包括 domain 包(Bean模型層)、dao 包(DAO持久層)和 service 包(Service業(yè)務(wù)層);
項(xiàng)目總體的包如下:

第二步,先從共通包開始,創(chuàng)建內(nèi)容
- exception
存放的是自定義異常,可根據(jù)業(yè)務(wù)來定義相應(yīng)的可拋出的異常:

自定義異常類DaoException:
將數(shù)據(jù)層異常包裝成自定義異常,進(jìn)行處理;
繼承RuntimeException;
構(gòu)造方法一,默認(rèn)的構(gòu)造方法;
構(gòu)造方法二,重寫異常詳細(xì)信息;
構(gòu)造方法三,重寫異常詳細(xì)信息和異常產(chǎn)生的原因;
構(gòu)造方法四,重寫異常產(chǎn)生的原因;
自定義異常類ServiceException:
將業(yè)務(wù)層發(fā)生的異常包裝成自定義異常;
繼承自RuntimeException
自定義異常類DateException:
將日期轉(zhuǎn)換時(shí)發(fā)生的異常包裝成自定義異常;
繼承自ServiceException
- util

有許多功能,比如數(shù)據(jù)庫連接、事務(wù)操作、數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)驗(yàn)證、文件上傳下載、文件拷貝等,在多個(gè)方法或者多個(gè)類中多次用到,因此設(shè)計(jì)成方法,放到工具類中;
工具類中的方法為了便于其他類訪問,都定義成靜態(tài)static方法;
數(shù)據(jù)庫工具類DBUtil
一個(gè)封裝好的Oracle數(shù)據(jù)庫工具類;

日期轉(zhuǎn)換工具類

獲取控制臺(tái)輸入類ScannerUtil
由于本程序采用的是通過控制臺(tái)進(jìn)行輸入輸出的方式,所以需要一個(gè)工具類,方便操作;

對于dao包和constant,分別存放的是Dao工廠類和項(xiàng)目中涉及到的公共常量,但由于項(xiàng)目簡單,故把功能整合到各自的類中了;
以上就是項(xiàng)目的公共部分
第三步,根據(jù)
MVC來進(jìn)行分層操作
M(模型層)
包括Bean模型層、dao持久層、Service業(yè)務(wù)層

- domain

為什么要設(shè)計(jì)實(shí)體類?
把相關(guān)信息用一個(gè)實(shí)體類封裝后,在程序中可以把實(shí)體類作為參數(shù)傳遞,更加方便;
對對象實(shí)體的封裝,體現(xiàn)OO思想;
實(shí)體類:
1、一般實(shí)體類對應(yīng)于一個(gè)數(shù)據(jù)庫表;
2、實(shí)體類有屬性和方法,屬性對應(yīng)于數(shù)據(jù)庫表中的字段,主要有getter和setter方法;
3、屬性一般是private類型,方法是public類型;
實(shí)體類User
對應(yīng)于數(shù)據(jù)庫中的用戶表


實(shí)體類DataPage
分頁時(shí)所需要的信息封裝成的實(shí)體類

- dao

DAO層設(shè)計(jì)首先是設(shè)計(jì)DAO接口,再定義此接口的實(shí)現(xiàn)類,然后就可以在模塊中調(diào)用此接口來進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理;
DAO層所定義的接口里的方法都大同小異,這是由于DAO層對數(shù)據(jù)庫的操作來決定的,對數(shù)據(jù)庫操作,我們基本要做的的是增、刪、改、查等方法。因而DAO基本上都是要涵蓋這些方法對應(yīng)的操作,除此之外,可以定義一些自定義的特殊的對數(shù)據(jù)庫訪問的方法;
一般命名為xxxDAO
接口UserDAO

接口實(shí)現(xiàn)類UserDAOImpl

- service

Service層可以考慮設(shè)計(jì)接口,再設(shè)計(jì)實(shí)現(xiàn)類,也可以通過單例模式進(jìn)行設(shè)計(jì);
Service層的業(yè)務(wù)實(shí)現(xiàn),具體要調(diào)用到已定義的DAO層的接口,封裝成Service的業(yè)務(wù)邏輯,有利于通用的業(yè)務(wù)邏輯的獨(dú)立性和重復(fù)利用性,程序顯得非常簡潔;
Service建立在DAO之上,建立了DAO層之后才可以建立Service層;
每個(gè)模型都有一個(gè)Service層接口或單例類,每個(gè)類分別封裝各自的業(yè)務(wù)處理方法;
一般命名為xxxService;
Service層接口

Service層接口層實(shí)現(xiàn)類

C(控制器)
為什么要設(shè)計(jì)控制器?
1、控制器可以將視圖和業(yè)務(wù)邏輯分開,便于后期的擴(kuò)展和復(fù)用;
2、控制層主要是根據(jù)視圖層用戶發(fā)出的請求去調(diào)用業(yè)務(wù)層相應(yīng)的業(yè)務(wù)處理方法;
- controller

UserController類

V(表現(xiàn)層/s視圖層)
為什么要設(shè)計(jì)表現(xiàn)層?
1、表現(xiàn)層是系統(tǒng)用用戶交互的接口,用戶通過表現(xiàn)層了解系統(tǒng)的功能,通過表現(xiàn)層和系統(tǒng)進(jìn)行交互;
2、表現(xiàn)層單獨(dú)分離出來,是為了便于復(fù)用和擴(kuò)展;
- view

BaseFrame接口
表現(xiàn)層都實(shí)現(xiàn)該接口;
因?yàn)闊o論是普通用戶還是管理員都有頁面顯示、添加、更新、查詢操作;

show方法,該業(yè)務(wù)對應(yīng)的頁面即對應(yīng)的用戶操作;
addShow犯方法,用戶添加操作的頁面;
searchShow方法,用戶查詢操作的頁面;
updateShow方法,用戶更新操作的頁面;
IndexFrame類
用戶登錄和注冊頁面

show方法,重寫該方法,顯示注冊和登錄操作選項(xiàng);
addShow犯方法,重寫該方法用戶注冊頁面;
searchShow方法,重寫該方法,空方法;
updateShow方法,重寫該方法,空方法;
NormalFrame類
普通用戶操作頁面

show方法,重寫該方法,顯示普通用戶操作選項(xiàng);
searchShow方法,重寫該方法,查找個(gè)人信息;
updateShow方法,重寫該方法,更新個(gè)人信息;
AdminFrame類
管理員操作頁面

show方法,重寫該方法,顯示管理員操作選項(xiàng);
addShow犯方法,繼承該方法,用戶添加的頁面;
searchShow方法,重寫該方法,查詢用戶信息;
updateShow方法,更新用戶信息;
delShow方法,刪除用戶信息;
loginSuccShow方法,登錄成功顯示頁面;
listShow方法,顯示list中的數(shù)據(jù);
以上就是整個(gè)項(xiàng)目的設(shè)計(jì)過程;
演示

下面是項(xiàng)目的源代碼: