15管家婆小项目
1項目介紹
1.1項目目標
本項目為JAVAEE基礎班綜合項目,包含了若干個知識點,達到將基礎班所學知識綜合使用,提高了我們對項目的理解與知識點的運用。
熟練View層、Service層、Dao層之間的方法相互調用操作、
熟練dbutils操作數據庫表完成增刪改查
通過本項目,讓我們了解公司項目開發(fā)的流程,充分的掌握項目需求分析、設計與功能的代碼實現。提高同學們獨立分析需求與功能實現的能力。
1.2項目功能介紹
- 查詢賬務
- 多條件組合查詢賬務
- 添加賬務
- 編輯賬務
- 刪除賬務
2.項目環(huán)境搭建
2.1技術選型和jar包介紹
每個項目都要使用一些已經成熟的技術,它們通常是由一些專業(yè)組織或團隊所提供的開源免費技術。在今后的學習過程中,我們會逐漸對這些專業(yè)組織有所了解。本項目中使用的技術如下:
- 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包。
2.2工具類介紹
JDBCUtils:用來創(chuàng)建數據庫連接池對象;
package cn.jxufe.java.chapter12.demo02;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;/** 使用DBCP實現數據庫的連接池* 連接池配置,自定義類,* 最基本四項完整* 對于數據庫連接池其他配置,自定義*/public class JDBCUtils {// 創(chuàng)建出BasicDataSource類對象private static BasicDataSource datasource = new BasicDataSource();// 靜態(tài)代碼塊,對象BasicDataSource對象中的配置,自定義static {// 數據庫連接信息,必須的datasource.setDriverClassName("com.mysql.jdbc.Driver");datasource.setUrl("jdbc:mysql://localhost:3306/gjp");datasource.setUsername("root");datasource.setPassword("123456");// 對象連接池中的連接數量配置,可選的datasource.setInitialSize(10);// 初始化的連接數datasource.setMaxActive(8);// 最大連接數量datasource.setMaxIdle(5);// 最大空閑數datasource.setMinIdle(1);// 最小空閑 }// 定義靜態(tài)方法,返回BasicDataSource類的對象public static DataSource getDataSource() {return datasource;}}2.3數據表創(chuàng)建
對一個項目而言,表設計是非常重要的,因為應用程序中所有的操作都是基于數據庫表而進行的,所以我們第一步就是創(chuàng)建數據庫表。
- 創(chuàng)建數據庫
- 創(chuàng)建數據庫表
2.4項目分層(分包)的作用
程序為什么要分包分層?
以顧客去飯店吃飯案例分析一下:
小飯店: 一個服務員搞定(接待顧客\點菜\炒菜)
大飯店:
- 迎賓員(是否有預定\ 詢問吃中餐還是西餐或者燒烤等\ 幾位用餐 \ 領路到指定的包間\ 找點菜員為顧客點菜 )
- 點菜員(記錄顧客點餐內容\ 記錄是否有忌口等問題\ 找廚師為顧客炒菜)
- 廚師(按照顧客菜肴清單,進行炒菜)
通過案例發(fā)現,當程序規(guī)模小的時候,可以一個人全部完成;但程序規(guī)模大的時候,一個人難以完成,這時,要采用多人合作的方式來完成程序開發(fā)。
???????? 多人合作方式將會碰到工作任務分配問題,這時我們會想,每個人負責完成項目的一塊內容就可以了。那么,這一塊塊內容的劃分,就需要我們采用分層(分包)的方式完成了。
- view層作用: 視圖層,即項目中的界面
- controller層作用: 控制層, 獲取界面上的數據,為界面設置數據; 將要實現的功能交給業(yè)務層處理
- service層作用: 業(yè)務層, 功能的實現, 與controller控制層和數據訪問層DAO交互, 將對數據庫的操作交給DAO數據訪問層來處理
- dao層作用: 數據訪問層, 用來操作數據庫表的數據
- db數據庫: 這里指MySQL
- domain 實體包: 存放JavaBean
- tools工具包:存放項目中使用到的工具類
- test 測試包: 存放項目功能測試的代碼
?
2.5?工程創(chuàng)建及包管理
- cn.itcast.gjp.app: 存放main方法類;
- cn.itcast.gjp.domain: 存放JavaBean;
- cn.itcast.gjp.view: 存放界面,及表現層類;
- cn.itcast.gjp.service: 存放業(yè)務層類;
- cn.itcast.gjp.dao: 存放數據訪問層類;
- cn.itcast.gjp.tools:存放工具類
3.功能模塊
3.1相關類創(chuàng)建
完成本項目中類的創(chuàng)建,無需在類中添加代碼。
編寫app包中MainApp.java
package cn.jxufe.gjp.app; /** 主程序類,作用,開啟軟件程序*/ public class MainApp {public static void main(String[] args) {// TODO Auto-generated method stub }}?
編寫domain包中ZhangWu.java
package cn.jxufe.gjp.domain;public class ZhangWu {}?
編寫Dao包中ZhangWuDao.java
package cn.jxufe.gjp.dao;import org.apache.commons.dbutils.QueryRunner;import cn.jxufe.gjp.tools.JDBCUtils;/** 賬務數據層類* 實現對數據表gjp_zhangwu 數據增刪改查操作 * 使用dbutils工具類完成,類成員創(chuàng)建QueryRunner對象,指定數據源*/ public class ZhangWuDao {private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); }?
編寫Service包,ZhangWuService.java
package cn.jxufe.gjp.service; /** 業(yè)務層類* 接收上一層,控制層controller的數據* 經過計算,傳遞給dao層,操作數據庫* 調用dao層中的類,類成員位置,創(chuàng)建Dao類的對象*/import cn.jxufe.gjp.dao.ZhangWuDao;public class ZhangWuService {private ZhangWuDao dao = new ZhangWuDao(); }?
編寫controller包,ZhangWuController.java
package cn.jxufe.gjp.controller; /** 控制器層* 接收視圖層的數據,將數據傳遞給service層* 成員位置創(chuàng)建service對象*/import cn.jxufe.gjp.service.ZhangWuService;public class ZhangWuController {private ZhangWuService service = new ZhangWuService(); }?
編寫view包,MainView.java
package cn.jxufe.gjp.view; /** 視圖層,用戶控制和操作的界面* 數據傳遞給controller層實現* 成員位置,創(chuàng)建一個controller對象*/import cn.jxufe.gjp.controller.ZhangWuController;public class MainView {private ZhangWuController controller = new ZhangWuController(); }3.2賬務JavaBean
JavaBean是指的是Java中的類,該類中的成員變量與數據庫表中的字段相對應(變量名對應數據庫表字段名、變量數據類型對應數據庫表字段類型),并提供空參數構造方法、set、get方法。
package cn.jxufe.gjp.domain;public class ZhangWu {private int zwid;private String flname;private double money;private String zhanghu;private String createtime;private String description;public ZhangWu() {// TODO Auto-generated constructor stub }public ZhangWu(int zwid, String flname, double money, String zhanghu, String createtime, String description) {this.zwid = zwid;this.flname = flname;this.money = money;this.zhanghu = zhanghu;this.createtime = createtime;this.description = description;}public int getZwid() {return zwid;}public void setZwid(int zwid) {this.zwid = zwid;}public String getFlname() {return flname;}public void setFlname(String flname) {this.flname = flname;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getZhanghu() {return zhanghu;}public void setZhanghu(String zhanghu) {this.zhanghu = zhanghu;}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;}@Overridepublic String toString() {return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu+ ", createtime=" + createtime + ", description=" + description + "]";}}3.3功能界面菜單
?
界面菜單的完成,是項目編寫的第一步。
我們通過輸出語句,完成界面菜單的輸出,之后再根據輸入的功能序號,進行對應功能的調用執(zhí)行。
- 編寫MainView類run方法
- 完成功能界面菜單顯示
- 接收鍵盤輸入的功能選項
- 根據選項值,調用對應的功能方法
- 編寫MainApp類的main主方法
- 調用MainView類中run方法,實現將程序執(zhí)行起來,顯示功能界面菜單。
2.功能實現代碼
package cn.jxufe.gjp.view; /** 視圖層,用戶控制和操作的界面* 數據傳遞給controller層實現* 成員位置,創(chuàng)建一個controller對象*/import java.util.Scanner;import cn.jxufe.gjp.controller.ZhangWuController;public class MainView {private ZhangWuController controller = new ZhangWuController();/** 實現界面效果* 接收用戶的輸入* 根據輸入調用不同的功能方法*/public void run() {// 創(chuàng)建Scanner對象,可以反復的鍵盤輸入Scanner scanner = new Scanner(System.in);while (true) {System.out.println("---------------管家婆家庭記賬軟件---------------");System.out.println("1.添加賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統");System.out.println("請輸入要操作的功能序號[1-5]:");// 接收用戶的菜單選擇int choose = scanner.nextInt();// 對選擇的菜單判斷,調用不同的功能switch (choose) {// 選擇添加賬務,調用添加賬務的方法case 1:break;// 選擇的編輯賬務,調用編輯賬務方法case 2:break;// 選擇的刪除賬務,調用刪除賬務方法case 3:break;// 選擇的是查詢賬務,調用查詢方法case 4:break;//退出系統case 5:System.out.println("再見");System.exit(0);default:System.out.println("輸入錯誤,請重新輸入");;}}} }3.4查詢所有賬務
1.功能實現步驟
- 編寫MainView類中selectZhangWu方法
- 通過輸出語句,顯示出要查詢賬務的方式
- 接收鍵盤的輸入項,調用對應的方法(1.查詢所有 2.按條件查詢)
- 編寫MainView類中selectAll查詢所有賬務方法
- 調用ZhangWuContrler類selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
- 調用MainView類中print方法,實現控制臺顯示所有賬務數據
- 編寫MainView類中print方法
- 使用輸出語句,打印出賬務表的表頭名稱
- 遍歷賬務集合,將每個賬務信息輸出打印
- 編寫ZhangWuController類中selectAll方法
- 調用ZhangWuService類中selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
- 編寫ZhangWuService類中selectAll方法
- 調用ZhangWuDao類中selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
- 編寫ZhangWuDao類中selectAll()方法
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含所有賬務數據的List<ZhangWu>集合
2.功能實現代碼
- 編寫MainView類中selectZhangWu方法
?
- 編寫MainView類中selectAll方法
?
- 編寫ZhangWuController類中selectAll方法
?
- 編寫ZhangWuService類中selectAll方法
?
- 編寫ZhangWuDao類中selectAll()方法
3.5多條件查詢賬務
1)功能分析
- 編寫MainView類中select方法
- 通過鍵盤輸入查詢日期的范圍
- 調用ZhangWuController類中select方法,返回查詢日期范圍內的賬務信息集合List<ZhangWu>
- 調用MainView類中的print方法,將賬務信息集合中的內容顯示在控制臺中
- 編寫ZhangWuController類中select方法
- 編寫ZhangWuController類中select方法
- 調用ZhangWuService類中select方法,返回查詢日期范圍內的賬務信息集合List<ZhangWu>
- 編寫ZhangWuService類中select方法
- 調用ZhangWuDao 類中select方法,返回查詢日期范圍內的賬務信息集合List<ZhangWu>
- 編寫ZhangWuDao類中select方法
- 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含查詢日期范圍內的賬務數據List<ZhangWu>集合
2)功能實現步驟
1. 編寫MainView類中select方法
/** 定義方法,實現條件查詢賬務數據* 提供用戶的輸入日期,開始日期結束日期* 就2個日期,傳遞到controller層* 調用controller的方法,傳遞2個日期參數* 獲取到controller查詢的結果集,打印出來*/public void select() {System.out.println("選擇條件查詢,輸入日期格式XXXX-XX-XX");Scanner sc = new Scanner(System.in);System.out.print("請輸入開始日期:");String startDate = sc.nextLine();System.out.print("請輸入結果日期:");String endDate = sc.nextLine();// 調用controller層的方法,傳遞日期,獲取查詢結果集List<ZhangWu> list = controller.select(startDate, endDate);if (list.size() != 0)print(list);elseSystem.out.println("沒有查詢到數據");}?
2. 編寫ZhuangWuController類中select方法
/** 定義方法,實現條件查詢賬務* 方法由試圖層調用,傳遞兩個日期的字符串* 調用service層的方法,傳遞兩個日期字符串,獲取結果集* 結果集返回給試圖*/public List<ZhangWu> select(String startDate, String endDate) {return service.select(startDate, endDate);}?
3.編寫ZhangWuService類中select方法
/** 定義方法,實現條件查詢賬務* 方法由控制層調用,傳遞2個日期字符串* 調用dao層的方法,傳遞2個日期字符串* 獲取到查詢結果集*/public List<ZhangWu> select(String startDate, String endDate) {return dao.select(startDate, endDate);}?
4. 編寫ZhangWuDao類中select方法
/** 定義方法,查詢數據庫,帶有條件去查詢賬務表* 由業(yè)務層調用,查詢結果集存儲到Bean對象,存儲到List集合* 調用者傳遞2個日期字符串*/public List<ZhangWu> select(String startDate, String endDate) {try {// 拼寫條件查詢的SQL語句String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";// 定義對象數組,存儲?占位符Object[] params = { startDate, endDate };// 調用qr對象的方法query查詢數據表,獲取結果集return qr.query(sql, new BeanListHandler<>(ZhangWu.class), params);} catch (SQLException ex) {System.out.println(ex);throw new RuntimeException("條件查詢失敗");}}3.6添加賬務
1)功能分析
編寫MainView類中addZhangWu方法
- 鍵盤輸入新添加的賬務信息
- 調用ZhangWuController類中addZhangWu方法,用來指定賬務的添加
- 添加完畢后,使用輸出語句,提示“添加賬務成功!”
編寫ZhangWuController類中addZhangWu方法
- 調用ZhangWuService類中addZhangWu方法,用來指定賬務的添加
編寫ZhangWuService類中addZhangWu方法
- 調用ZhangWuDao類中addZhangWu方法,用來指定賬務的添加
?編寫ZhangWuDao類中addZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成指定賬務添加到數據庫表中
2)功能實現步驟
1. 編寫MainView類中addZhangWu方法
/** 定義方法addZhangWu* 添加賬務的方法,用戶在界面中選擇菜單1的時候調用、* 實現思想:* 接收鍵盤輸入,5項輸入,調用controller層方法*/public void addZhangWu() {System.out.println("選擇的添加賬務功能,請輸入以下內容");Scanner sc = new Scanner(System.in);System.out.println("輸入分類名稱");String flname = sc.next();System.out.println("輸入金額");double money = sc.nextDouble();System.out.println("輸入賬戶");String zhanghu = sc.next();System.out.println("輸入日期:格式XXXX-XX-xx");String createtime = sc.next();System.out.println("輸入具體描述");String description = sc.next();// 將接收到的數據,調用controller層的方法,傳遞參數,實現數據添加// 將用戶輸入的所有參數,封裝成ZhangWu對象ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);controller.addZhangWu(zw);System.out.println("恭喜添加賬務成功");}?
2. 編寫ZhangWuController類中addZhangWu方法
/** 定義方法,實現賬務添加功能* 由視圖層調用,傳遞參數(傳遞過來的參數不能是5個數據,傳遞的是一個ZhangWu類型的對象)* 本方法調用service層的方法,傳遞ZhangWu對象,獲取到添加后的結果集(添加成功影響的行數,int)*/public void addZhangWu(ZhangWu zw) {service.addZhangWu(zw);}?
3.編寫ZhangWuService類中addZhangWu方法
/** 定義方法,實現添加賬務* 是由控制層調用,傳遞ZhangWu對象*/public void addZhangWu(ZhangWu zw) {dao.addZhangWu(zw);}?
4.編寫ZhangWuDao類中addZhangWu方法
/** 定義方法,實現添加賬務功能* 由業(yè)務層調用,傳遞ZhangWu對象* 將ZhangWu對象中的數據,添加到數據庫*/public void addZhangWu(ZhangWu zw) {try {// 拼接添加數據的sqlString sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";// 創(chuàng)建對象數組,處處5個占位符的實際參數// 實際參數來源是傳遞過來的對象ZhangWuObject[] params = { zw.getFlname(), zw.getMoney(), zw.getZhanghu(), zw.getCreatetime(),zw.getDescription() };// 調用qr對象中的方法update執(zhí)行添加 qr.update(sql, params);} catch (SQLException ex) {System.out.println(ex);throw new RuntimeException("賬務添加失敗");}}?
3.7編輯賬務
1)功能分析
- 編寫MainView類中editZhangWu方法
- 鍵盤輸入要編輯的賬務信息ID號
- 鍵盤輸入要修改的賬務信息內容
- 調用ZhangWuController類中editZhangWu方法,用來將指定的賬務信息進行更新
- 更新完畢后,使用輸出語句,提示 “編輯賬務成功!”
- 編寫ZhangWuController類中editZhangWu方法
- 調用ZhangWuService類中ZhangWuService方法,用來將指定的賬務信息進行更新
?
- 編寫ZhangWuService類中editZhangWu方法
- 調用ZhangWuDao類中editZhangWu方法,用來將指定的賬務信息進行更新
?
- 編寫ZhangWuDao類中editZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務更新操作
2)功能實現步驟
1. 編寫MainView類中editZhangWu方法
/** 定義方法,實現對賬務的編輯功能* 實現思想:* 接收用戶的輸入的信息* 封裝成ZhangWu對象* 調用控制層的方法,傳遞ZhangWu對象,實現編輯* */public void editZhangWu() {// 調用查詢所有賬務數據的功能,顯示出來// 看到所有數據,從中選擇一項,進行修改 selectAll();System.out.println("選擇的是編輯功能,請輸入數據");Scanner sc = new Scanner(System.in);System.out.print("請輸入ID");int zwid = sc.nextInt();System.out.println("輸入分類名稱");String flname = sc.next();System.out.println("輸入金額");double money = sc.nextDouble();System.out.println("輸入賬戶");String zhanghu = sc.next();System.out.println("輸入日期:格式XXXX-XX-xx");String createtime = sc.next();System.out.println("輸入具體描述");String description = sc.next();// 將用戶輸入的數據,封裝到ZhangWu對象中// 用戶輸入的ID,必須封裝到到對象中ZhangWu zw = new ZhangWu(zwid, flname, money, zhanghu, createtime, description);// 調用controller層中的方法,實現編輯賬務 controller.editZhangWu(zw);System.out.println("賬務編輯成功");}?
2. 編寫ZhuangWuController類中editZhangWu方法
/** 定義方法,實現編輯賬務功能* 由視圖層調用,傳遞參數,也是ZhangWu對象* 調用service層的方法,也是ZhangWu對象*/public void editZhangWu(ZhangWu zw) {service.editZhangWu(zw);}?
?
3.編寫ZhangWuService類中editZhangWu方法
/** 定義方法,實現編輯賬務* 由控制層調用,傳遞ZhangWu對象* 調用dao層的方法,傳遞ZhangWu對象*/public void editZhangWu(ZhangWu zw) {dao.editZhangWu(zw);} }?
4.編寫ZhangWuDao類中editZhangWu方法
/** 定義方法,實現編輯功能* 由業(yè)務層調用,傳遞ZhangWu對象* 將對象中的數據,更新到數據表*/public void editZhangWu(ZhangWu zw) {try {// 更新數據的SQLString sql = "UPDATE gjp_zhangwu SET flname=?,money=?,zhanghu=?,createtime=?,description=? WHERE zwid=?";// 定義對象數組,封裝所有數據Object[] params = { zw.getFlname(), zw.getMoney(), zw.getZhanghu(), zw.getCreatetime(), zw.getDescription(),zw.getZwid() };// 調用qr對象方法update執(zhí)行更新 qr.update(sql, params);} catch (SQLException ex) {System.out.println(ex);throw new RuntimeException("編輯賬務失敗");}}3.8.刪除賬務
?
1)功能分析
- 編寫MainView類中deleteZhangWu方法
- 鍵盤輸入要刪除的賬務信息ID號
- 調用ZhangWuService類中deleteZhangWu方法,用來將指定的賬務信息刪除
- 刪除完畢后,使用輸出語句,提示 “刪除賬務成功!”
- 編寫ZhangWuController類中deleteZhangWu方法
- 調用ZhangWuService類中deleteZhangWu方法,用來將指定的賬務信息刪除
- 編寫ZhangWuService類中deleteZhangWu方法
- 調用ZhangWuDao類中deleteZhangWu方法,用來將指定的賬務信息刪除
- 編寫ZhangWuDao類中deleteZhangWu方法
- 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務刪除操作
2)功能實現步驟
1. 編寫MainView類中deleteZhangWu方法
/** 定義方法,實現賬務刪除* 實現思想:* 接收用戶的輸入,輸入一個主鍵數據* 調用控制層方法,傳遞一個主鍵*/public void deleteZhangWu() {//調用查詢所有賬務數據的功能,顯示出來//看到所有數據,從中選擇一項,進行修改 selectAll();System.out.println("選擇的是刪除功能,請輸入序號即可");int zwid = new Scanner(System.in).nextInt();//調用控制層方法,傳遞主鍵id即可 controller.deleteZhangWu(zwid);System.out.println("刪除賬務成功");}?
2.編寫ZhangWuController類中deleteZhangWu方法
/** 定義方法,實現刪除功能* 視圖層調用,傳遞int類型主鍵* 調用service層方法,傳遞int主鍵*/public void deleteZhangWu(int zwid) {service.deleteZhangWu(zwid);}?
3.編寫ZhangWuService類中deleteZhangWu方法
/** 定義方法,實現刪除賬務功能* 由控制層調用,傳遞主鍵id* 調用dao層方法,傳遞主鍵id*/public void deleteZhangWu(int zwid) {dao.deleteZhangWu(zwid);}?
4.編寫ZhangWuDao類中deleteZhangWu方法
/** 定義方法,實現刪除業(yè)務* 業(yè)務層調用,傳遞主鍵id*/public void deleteZhangWu(int zwid) {try {// 拼寫刪除數據SQLString sql = "DELETE FROM gjp_zhangwu WHERE zwid=?";qr.update(sql, zwid);} catch (SQLException ex) {System.out.println(ex);throw new RuntimeException("刪除賬務失敗");}}?
轉載于:https://www.cnblogs.com/xinmomoyan/p/11061272.html
總結
- 上一篇: C++--day06
- 下一篇: Java NIO之Channel(通道)