管家婆家庭記賬軟件
- 項目介紹
- 項目安排
- 項目目標
- 項目安排
本項目爲JAVAEE基礎班綜合項目,包含了若干個知識點,達到將基礎班所學知識綜合使用,提高了我們對項目的理解與知識點的運用。
熟練View層、Service層、Dao層之間的方法相互調用操作、
熟練dbutils操作數據庫表完成增刪改查
通過本項目,讓我們瞭解公司項目開發的流程,充分的掌握項目需求分析、設計與功能的代碼實現。提高同學們獨立分析需求與功能實現的能力。
-
-
- 項目時間
-
本項目通過1天課程時間完成。
-
- 項目功能分析
- 項目演示
- 項目功能介紹
- 項目功能分析
- 查詢賬務
- 多條件組合查詢賬務
- 添加賬務
- 編輯賬務
- 刪除賬務
- 項目環境搭建
- 技術選型和jar包介紹
每個項目都要使用一些已經成熟的技術,它們通常是由一些專業組織或團隊所提供的開源免費技術。在今後的學習過程中,我們會逐漸對這些專業組織有所瞭解。本項目中使用的技術如下:
- apache的commons組件:
- commons-dbutils-1.4.jar:封裝並簡化了JDBC;
- commons-dbcp-1.4.jar:apache commons提供的數據庫連接池組件,命名爲DBCP;
- commons.pool-1.3.jar:DBCP連接池依賴該jar包;
- mysql-connector-java-5.1.28-bin.jar:MySQL的JDBC驅動包,用JDBC連接MySQL數據庫必須使用該JAR包。
- 工具類介紹
每個項目都會用到一些工具類,本項目也不例外。我們不會教大家如何實現這些類,而是讓大家知道在項目我們如何使用這些工具類,下面是本項目中所使用的工具類以及介紹:
- JDBCUtils:用來創建數據庫連接池對象;
在項目的實現過程中,我們會說明工具類的使用,這裏就不再過多介紹。
JDBCUtils.java
public class JDBCUtils { public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/gjp"; public static final String USERNAME = "root"; public static final String PASSWORD = "root";
private static BasicDataSource dataSource = new BasicDataSource(); static { dataSource.setDriverClassName(DRIVER_CLASS_NAME); dataSource.setUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); }
public static DataSource getDataSource() { return dataSource; } } |
-
- 數據表創建
對一個項目而言,表設計是非常重要的,因爲應用程序中所有的操作都是基於數據庫表而進行的,所以我們第一步就是創建數據庫表。
管家婆項目的數據庫設計很簡單,我們只需找到gjp.sql文件,然後執行之即可。下面是創建庫及表的SQL語句:
-
-
- 創建數據庫
-
創建管家婆數據庫 gjp
CREATE DATABASE gjp; |
-
-
- 創建數據庫表
-
創建賬務表gjp_zhangwu
CREATE TABLE gjp_zhangwu ( zwid INT PRIMARY KEY AUTO_INCREMENT, flname VARCHAR(200), money DOUBLE, zhangHu VARCHAR(100), createtime DATE, description VARCHAR(1000) ); |
-
-
- 添加表數據
-
添加賬務表數據
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (1,'吃飯支出',247,'交通銀行','2016-03-02','家庭聚餐'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (2,'工資收入',12345,'現金','2016-03-15','開工資了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (3,'服裝支出',1998,'現金','2016-04-02','買衣服'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (4,'吃飯支出',325,'現金','2016-06-18','朋友聚餐'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (5,'股票收入',8000,'工商銀行','2016-10-28','股票大漲'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (6,'股票收入',5000,'工商銀行','2016-10-28','股票又大漲'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (7,'工資收入',5000,'交通銀行','2016-10-28','又開工資了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (8,'禮金支出',5000,'現金','2016-10-28','朋友結婚'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (9,'其他支出',1560,'現金','2016-10-29','丟錢了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (10,'交通支出',2300,'交通銀行','2016-10-29','油價還在漲啊'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (11,'吃飯支出',1000,'工商銀行','2016-10-29','又吃飯'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (12,'工資收入',1000,'現金','2016-10-30','開資'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (13,'交通支出',2000,'現金','2016-10-30','機票好貴'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (14,'工資收入',5000,'現金','2016-10-30','又開資');
|
-
- 項目分層(分包)的作用
程序爲什麼要分包分層?
以顧客去飯店吃飯案例分析一下:
小飯店: 一個服務員搞定(接待顧客\點菜\炒菜)
大飯店:
- 迎賓員(是否有預定\ 詢問吃中餐還是西餐或者燒烤等\ 幾位用餐 \ 領路到指定的包間\ 找點菜員爲顧客點菜 )
- 點菜員(記錄顧客點餐內容\ 記錄是否有忌口等問題\ 找廚師爲顧客炒菜)
- 廚師(按照顧客菜餚清單,進行炒菜)
通過案例發現,當程序規模小的時候,可以一個人全部完成;但程序規模大的時候,一個人難以完成,這時,要採用多人合作的方式來完成程序開發。
多人合作方式將會碰到工作任務分配問題,這時我們會想,每個人負責完成項目的一塊內容就可以了。那麼,這一塊塊內容的劃分,就需要我們採用分層(分包)的方式完成了。
通過下圖(用戶註冊功能)來講解下,項目中常見的分層(分包)。
- view層作用: 視圖層,即項目中的界面
- controller層作用: 控制層, 獲取界面上的數據,爲界面設置數據; 將要實現的功能交給業務層處理
- service層作用: 業務層, 功能的實現, 與controller控制層和數據訪問層DAO交互, 將對數據庫的操作交給DAO數據訪問層來處理
- dao層作用: 數據訪問層, 用來操作數據庫表的數據
- db數據庫: 這裏指MySQL
- domain 實體包: 存放JavaBean
- tools工具包:存放項目中使用到的工具類
- test 測試包: 存放項目功能測試的代碼
- 工程創建及包管理
- 使用Eclipse創建Java工程,命名爲gjp
- 創建工程包
- cn.itcast.gjp.app: 存放main方法類;
- cn.itcast.gjp.domain: 存放JavaBean;
- cn.itcast.gjp.view: 存放界面,及表現層類;
- cn.itcast.gjp.service: 存放業務層類;
- cn.itcast.gjp.dao: 存放數據訪問層類;
- cn.itcast.gjp.tools:存放工具類
- 創建lib文件夾,用來存儲使用的jar包
- 功能模塊
- 相關類創建
完成本項目中類的創建,無需在類中添加代碼。
- 複製已編寫好的工具類JDBCUtils.java 到 tools包中;
- 複製jar包mysql-connector-java-5.1.28-bin.jar、commons-dbutils-1.4.jar、commons-dbcp-1.4.jar、commons-pool-1.3.jar,到lib文件夾中,通過Build Path操作,添加到classPath路徑中,提供給JDBCUtils使用;
- 在app包中,創建類MainApp.java,編寫main主方法,用來完成本項目的啓動
- 在domain包中,創建類ZhangWu.java,它是用來封裝賬務信息的JavaBean。
- 在dao包中,創建類ZhangWuDao.java,給ZhangWuDao類添加一個成員變量QueryRunner對象,因爲我們使用dbutils來操作數據庫。
- 在service包中,創建類ZhangWuService.java,給ZhangWuService類添加一個類型爲ZhangWuDao的成員變量,因爲service依賴dao。
- 在view包中,創建類MainView.java,給MainView類添加一個類型爲ZhangWuService的成員變量,因爲本項目中view依賴service。
編寫app包中MainApp.java
/** * 主方法類 */ public class MainApp { public static void main(String[] args) { } } |
編寫domain包中ZhangWu.java
/** * 賬務類 */ public class ZhangWu { } |
編寫Dao包中ZhangWuDao.java
/** * 賬務數據層類 */ public class ZhangWuDao{ //獲取數據庫連接池,得到操作表數據的對象 QueryRunner QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); } |
編寫Service包,ZhangWuService.java
/** * 賬務業務層類 */ public class ZhangWuService { //service都依賴dao private ZhangWuDao zhangWuDao = new ZhangWuDao(); } |
編寫view包,MainView.java
public class MainView { //本項目中view依賴service private ZhangWuService zhangWuService = new ZhangWuService(); } |
-
- 賬務JavaBean
JavaBean是指的是Java中的類,該類中的成員變量與數據庫表中的字段相對應(變量名對應數據庫表字段名、變量數據類型對應數據庫表字段類型),並提供空參數構造方法、set、get方法。
我們現在來完成賬務類的代碼編寫,如下:
/** * 賬務類 */ public class ZhangWu { private int zwid;// id private String flname;// 分類名稱 private String zhangHu;// 賬戶名稱 private double money;// 金額 private String createtime;// 創建時間 private String description;// 說明
public String getFlname() { return flname; } public void setFlname(String flname) { this.flname = flname; } public String getZhangHu() { return zhangHu; } public void setZhangHu(String zhangHu) { this.zhangHu = zhangHu; } public int getZwid() { return zwid; } public void setZwid(int zwid) { this.zwid = zwid; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } |
-
- 功能界面菜單
界面菜單的完成,是項目編寫的第一步。
我們通過輸出語句,完成界面菜單的輸出,之後再根據輸入的功能序號,進行對應功能的調用執行。
-
-
- 功能實現步驟
-
- 編寫MainView類run方法
- 完成功能界面菜單顯示
- 接收鍵盤輸入的功能選項
- 根據選項值,調用對應的功能方法
- 編寫MainApp類的main主方法
- 調用MainView類中run方法,實現將程序執行起來,顯示功能界面菜單。
- 功能實現代碼
- 調用MainView類中run方法,實現將程序執行起來,顯示功能界面菜單。
1.在view包MainView類中編寫run方法
/** * 運行方法 */ public void run() { /* * 1. 打印菜單 2. 獲取用戶輸入 3. 調用對應方法 */ boolean flag = true; Scanner in = new Scanner(System.in); while (flag) { System.out.println("---------------管家婆家庭記賬軟件---------------"); System.out.println(1.添加賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統"); System.out.println("請輸入要操作的功能序號[1-5]:"); int op = in.nextInt(); switch (op) { case 1: addZhangWu(); break; case 2: editZhangWu(); break; case 3: deleteZhangWu(); break; case 4: selectZhangWu(); break; case 5: System.out.println("再見!"); flag = false; break; default: System.out.println("輸入錯誤!"); } } } |
2.app包MainApp類的main主方法中,調用MainView類中run方法
public static void main(String[] args) { new MainView().run(); } |
-
- 查詢所有賬務
-
-
- 功能實現步驟
-
- 編寫MainView類中selectZhangWu方法
- 通過輸出語句,顯示出要查詢賬務的方式
- 接收鍵盤的輸入項,調用對應的方法(1.查詢所有 2.按條件查詢)
- 編寫MainView類中selectAll查詢所有賬務方法
- 調用ZhangWuService類selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
- 調用MainView類中print方法,實現控制檯顯示所有賬務數據
- 編寫MainView類中print方法
- 使用輸出語句,打印出賬務表的表頭名稱
-
- 遍歷賬務集合,將每個賬務信息輸出打印
- 編寫ZhangWuService類中selectAll方法
- 調用ZhangWuDao類中selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
- 編寫ZhangWuDao類中selectAll()方法
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含所有賬務數據的List<ZhangWu>集合
- 功能實現代碼
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含所有賬務數據的List<ZhangWu>集合
1. 編寫MainView類中selectZhangWu方法
/** * 查詢賬務方法 */ public void selectZhangWu() { System.out.println("1.查詢所有 2.按條件查詢"); Scanner in = new Scanner(System.in); int op = in.nextInt(); switch (op) { case 1: selectAll(); break; case 2: select(); break; default: System.out.println("輸入錯誤!"); } } |
2. 編寫MainView類中selectAll方法
/** * 查詢所有賬務方法 */ public void selectAll() { List<ZhangWu> zhangWuList = zhangWuService.selectAll(); print(zhangWuList); } |
3. 編寫MainView類中print方法
/* * 輸出賬務方法 */ private void print(List<ZhangWu> zhangWuList) { System.out.println("ID\t類別\t\t賬戶\t\t金額\t\t時間\t\t說明"); for (ZhangWu zw : zhangWuList) { System.out.println(zw.getZwid() + "\t" + zw.getFlname() + "\t\t" + zw.getZhangHu() + "\t\t" + zw.getMoney() + "\t\t" + zw.getCreatetime() + "\t" + zw.getDescription()); } } |
4. 編寫ZhangWuService類中selectAll方法
/** * 查詢所有 */ public List<ZhangWu> selectAll() { return zhangWuDao.selectAll(); } |
5. 編寫ZhangWuDao類中selectAll()方法
/** * 查詢所有賬務 */ public List<ZhangWu> selectAll() { String sql = "select * from gjp_zhangwu"; try { return qr.query(sql, new BeanListHandler<ZhangWu>(ZhangWu.class)); } catch (SQLException e) { throw new RuntimeException(e); } } |
-
- 多條件查詢賬務
-
-
- 功能分析
-
- 編寫MainView類中select方法
- 通過鍵盤輸入查詢日期的範圍
- 調用ZhangWuSerice類中select方法,返回查詢日期範圍內的賬務信息集合List<ZhangWu>
- 調用MainView類中的print方法,將賬務信息集合中的內容顯示在控制檯中
- 編寫ZhangWuService類中select方法
- 調用ZhangWuDao 類中select方法,返回查詢日期範圍內的賬務信息集合List<ZhangWu>
- 編寫ZhangWuDao類中select方法
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含查詢日期範圍內的賬務數據List<ZhangWu>集合
- 功能實現步驟
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含查詢日期範圍內的賬務數據List<ZhangWu>集合
1. 編寫MainView類中select方法
/** * 按條件查詢賬務方法 */ public void select() { /* * 1. 獲取用戶輸入查詢日期範圍。 * 2. 調用service的select()方法完成條件查詢功能 */ Scanner in = new Scanner(System.in); System.out.print("請輸入查詢起始時間:"); String start = in.next(); System.out.print("請輸入查詢結束時間:"); String end = in.next(); List<ZhangWu> zhangWuList = zhangWuService.select(start, end); print(zhangWuList); } |
2. 編寫ZhangWuService類中select方法
/** * 按條件查詢賬務方法 * @param start * @param end * @return */ public List<ZhangWu> select(String start, String end) { return zhangWuDao.select(start, end); } |
3. 編寫ZhangWuDao類中select方法
/** * 按條件查詢賬務方法 * @param start * @param end * @return */ public List<ZhangWu> select(String start, String end) { String sql = "select * from gjp_zhangwu where createtime between ? and ?"; Object[] params = {start, end}; try { return qr.query(sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params); } catch (SQLException e) { throw new RuntimeException(e); } } |
-
- 添加賬務
-
-
- 功能分析
-
- 編寫MainView類中addZhangWu方法
- 鍵盤輸入新添加的賬務信息
- 調用ZhangWuService類中addZhangWu方法,用來指定賬務的添加
- 添加完畢後,使用輸出語句,提示“添加賬務成功!”
- 編寫ZhangWuService類中addZhangWu方法
- 調用ZhangWuDao類中addZhangWu方法,用來指定賬務的添加
- 編寫ZhangWuDao類中addZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成指定賬務添加到數據庫表中
- 功能實現步驟
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成指定賬務添加到數據庫表中
1. 編寫MainView類中addZhangWu方法
/** * 添加賬務方法 */ public void addZhangWu() { /* * 1. 獲取用戶輸入,封裝到bean中。 * 2. 調用service的addZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("請輸入類別:"); zw.setFlname(in.next()); System.out.print("請輸入賬戶:"); zw.setZhangHu(in.next()); System.out.print("請輸入金額:"); zw.setMoney(in.nextDouble()); System.out.print("請輸入時間:"); zw.setCreatetime(in.next()); System.out.print("請輸入說明:"); zw.setDescription(in.next());
zhangWuService.addZhangWu(zw); System.out.println("添加賬務成功!"); } |
2. 編寫ZhangWuService類中addZhangWu方法
/** * 添加賬務 * @param zw */ public void addZhangWu(ZhangWu zw) { zhangWuDao.addZhangWu(zw); } |
3. 編寫ZhangWuDao類中addZhangWu方法
/** * 添加賬務 * @param zw */ public void addZhangWu(ZhangWu zw) { String sql = "insert into gjp_zhangwu(flname,money,zhanghu,createtime,description) values(?,?,?,?,?)"; try { Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhangHu(),zw.getCreatetime(),zw.getDescription()}; qr.update(sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } |
-
- 編輯賬務
-
-
- 功能分析
-
- 編寫MainView類中editZhangWu方法
- 鍵盤輸入要編輯的賬務信息ID號
- 鍵盤輸入要修改的賬務信息內容
- 調用ZhangWuService類中editZhangWu方法,用來將指定的賬務信息進行更新
- 更新完畢後,使用輸出語句,提示 “編輯賬務成功!”
- 編寫ZhangWuService類中editZhangWu方法
- 調用ZhangWuDao類中editZhangWu方法,用來將指定的賬務信息進行更新
- 編寫ZhangWuDao類中editZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務更新操作
- 功能實現步驟
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務更新操作
1. 編寫MainView類中editZhangWu方法
/** * 編輯賬務方法 */ public void editZhangWu() { /* * 1. 獲取用戶輸入,封裝到bean中。 * 2. 調用service的editZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("請輸入ID:"); zw.setZwid(in.nextInt()); System.out.print("請輸入新類別:"); zw.setFlname(in.next()); System.out.print("請輸入新賬戶:"); zw.setZhangHu(in.next()); System.out.print("請輸入新金額:"); zw.setMoney(in.nextDouble()); System.out.print("請輸入新時間:"); zw.setCreatetime(in.next()); System.out.print("請輸入新說明:"); zw.setDescription(in.next());
zhangWuService.editZhangWu(zw); System.out.println("編輯賬務成功!"); } |
2. 編寫ZhangWuService類中editZhangWu方法
/** * 編輯賬務 * @param zw */ public void editZhangWu(ZhangWu zw) { zhangWuDao.editZhangWu(zw); } |
3. 編寫ZhangWuDao類中editZhangWu方法
/** * 編輯賬務 * @param zw */ public void editZhangWu(ZhangWu zw) { String sql = "update gjp_zhangwu set flname=?, money=?,zhanghu=?,createtime=?,description=? where zwid=?"; try { Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhangHu(),zw.getCreatetime(),zw.getDescription(),zw.getZwid()}; qr.update(sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } |
-
- 刪除賬務
-
-
- 功能分析
-
- 編寫MainView類中deleteZhangWu方法
- 鍵盤輸入要刪除的賬務信息ID號
- 調用ZhangWuService類中deleteZhangWu方法,用來將指定的賬務信息刪除
- 刪除完畢後,使用輸出語句,提示 “刪除賬務成功!”
- 編寫ZhangWuService類中deleteZhangWu方法
- 調用ZhangWuDao類中deleteZhangWu方法,用來將指定的賬務信息刪除
- 編寫ZhangWuDao類中deleteZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務刪除操作
- 功能實現步驟
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務刪除操作
1. 編寫MainView類中deleteZhangWu方法
/** * 刪除賬務方法 */ public void deleteZhangWu() { /* * 1. 獲取用戶輸入,封裝到bean中。 * 2. 調用service的deleteZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); System.out.print("請輸入ID:");
zhangWuService.deleteZhangWu(in.nextInt()); System.out.println("刪除賬務成功!"); } |
2. 編寫ZhangWuService類中deleteZhangWu方法
/** * 刪除賬務 * @param zwid */ public void deleteZhangWu(int zwid) { zhangWuDao.deleteZhangWu(zwid); } |
3. 編寫ZhangWuDao類中deleteZhangWu方法
/** * 刪除賬務 * @param zwid */ public void deleteZhangWu(int zwid) { String sql = "delete from gjp_zhangwu where zwid=?"; try { qr.update(sql, zwid); } catch (SQLException e) { throw new RuntimeException(e); } } |
-
- 功能模塊總結
恭喜大家,我們已經完成了分類模塊所有功能。通過分類模塊功能的實現,大家可能會發現如下幾個問題:
- 難度大的地方:自行功能分析的能力欠缺,需要講師來分析;
- 代碼實現:
- View(Controller):代碼量最大;
- Service層:代碼量最小;
- DAO層:相似度高,難度不大;
到現在爲止我們是第一次寫這麼複雜的項目,所以大家之間也沒有練習過功能分析的能力,所以第一次需要講師來分析是正常的,當大家不斷練習後,有了正確的思維模式,自然就能分析了。
view層的作用是“界面”,用來完成數據顯示給用戶。當前項目view層中,包含了Controller層代碼。
Controller層的作用是“調度”,調度的是表現層view和業務層Service,主要功能分爲:一是把表現層的數據交給業務層處理;二是把業務層返回的數據交給表現層顯示。至於爲什麼這一層View(Controller)的代碼量大,這裏我要說明一下,其實不是View(Controller)層的代碼量大,而是其他層代碼量少,所以你會感覺View(Controller)層代碼量大。
Service層的作用是“業務”,我們也可以把“業務”當成是“功能”。那爲什麼Service層代碼量少呢?原因是現在我們寫的項目很小,沒有什麼複雜的業務,而今後大家要寫的大型項目代碼量最大的就是Service層。
DAO層是操作數據庫,現在我們使用的是commons-dbutils工具來簡化JDBC,所以我們發現代碼不多,比較簡單。最後我們還會學習其他DAO層的工具,例如:hibernate和mybatis,他們都是JDBC的封裝,用來簡化JDBC。