項目目標:
* 綜合運用前面所學習的知識點
* 熟練View層、Service層、Dao層之間的方法相互調用操作(視圖、業務功能、數據庫訪問)
* 熟練dbutils操作數據庫表完成增刪改查
* 瞭解公司項目開發的流程,充分的掌握項目需求分析、設計與功能的代碼實現。提高同學們獨立分析需求與功能實現的能力。
項目功能分析:賬務查詢 / 多條件組合查詢賬務 / 添加賬務 / 編輯賬務 / 刪除賬務
1. 項目環境搭建
1.1 開發環境相關jar包:
* 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包。
1.2 項目中的工具類:
* 每個項目中都會有很多個工具類,不要求每個工具類對能獨立寫出來,但是要會使用工具類
* 本項目僅使用JDBCUtils:用來創建數據庫連接池對象
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils {
// 創建出BasicDataSource類對象
private static BasicDataSource datasource = new BasicDataSource();
// 靜態代碼塊,對象BasicDataSource對象中的配置,自定義
static {
// 數據庫連接信息
datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost:3307/mysqldata");
datasource.setUsername("root");
datasource.setPassword("root");
// 對象連接池中的連接數量配置
datasource.setInitialSize(10);
datasource.setMaxActive(8);
datasource.setMaxIdle(5);
datasource.setMinIdle(1);
}
// 定義靜態方法,返回BasicDataSource類的對象
public static DataSource getDataSource() { //返回DataSource接口,要靈活與BasicDataSource實現類
return datasource;
}
}
1.3 數據表創建:
/*
創建管家婆的數據庫
名字 gjp
*/
CREATE DATABASE gjp;
USE gjp;
/*
創建數據表,表名賬務
字段,列
主鍵
分類名稱 可變字符
金額 double
賬戶 可變字符 (支付,收入方法)
創建日期 date
賬務描述 可變字符
*/
CREATE TABLE gjp_zhangwu(
-- 主鍵
zwid INT PRIMARY KEY AUTO_INCREMENT,
-- 分類名稱
flname VARCHAR(200),
-- 金額
money DOUBLE,
-- 賬戶
zhanghu VARCHAR(100),
-- 創建日期
createtime DATE,
-- 賬務描述
description VARCHAR(1000)
);
SELECT * FROM gjp_zhangwu
-- 寫入測試的數據
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','又開資');
1.4 項目分層設計:
* view層作用: 視圖層,即項目中的界面
* controller層作用: 控制層, 獲取界面上的數據,爲界面設置數據; 將要實現的功能交給業務層處理
* service層作用: 業務層, 功能的實現, 與controller控制層和數據訪問層DAO交互, 將對數據庫的操作交給DAO數據訪問層來處理
* dao層作用: 數據訪問層, 用來操作數據庫表的數據
* db數據庫: 這裏指MySQL
* domain 實體包: 存放JavaBean
* tools工具包:存放項目中使用到的工具類
* test 測試包: 存放項目功能測試的代碼
2. 項目功能模塊:
2.1 相關類的創建
1.複製已編寫好的工具類JDBCUtils.java 到 tools包中;
2.複製jar包到lib文件夾中,通過Build Path操作,添加到classPath路徑中,提供給JDBCUtils使用:
mysql-connector-java-5.1.28-bin.jar[MySQL的JDBC驅動包,用JDBC連接MySQL數據庫必須使用該JAR包];
commons-dbutils-1.4.jar[封裝並簡化了JDBC]、commons-dbcp-1.4.jar[apache commons提供的數據庫連接池組件,命名爲DBCP];
commons-pool-1.3.jar[DBCP連接池依賴該jar包];
3.在app包中,創建類MainApp.java,編寫main主方法,用來完成本項目的啓動(Test)
4.在domain包中,創建類ZhangWu.java,它是用來封裝賬務信息的JavaBean。
5.在dao包中,創建類ZhangWuDao.java,給ZhangWuDao類添加一個成員變量QueryRunner對象,因爲我們使用dbutils來操作數據庫。
6.在service包中,創建類ZhangWuService.java,給ZhangWuService類添加一個類型爲ZhangWuDao的成員變量,因爲service依賴dao。
7.在controller包中,創建ZhangWuZhangController.java,給ZhangWuController類添加一個類型爲ZhangWuService的成員變量,因爲controller依賴service。
8.在view包中,創建類MainView.java,給MainView類添加一個類型爲ZhangWuController的成員變量,因爲本項目中view依賴controller。
2.1.1 創建Tools包中的類:JDBCUtils
package cn.itcast.gjp.tools;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
/*
* 獲取數據庫連接的工具類
* 實現DBCP連接池
* */
public class JDBCUtils {
// 創建出BasicDataSource類對象
private static BasicDataSource datasource = new BasicDataSource();
// 靜態代碼塊,對象BasicDataSource對象中的配置,自定義
static {
// 數據庫連接信息
datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost:3307/gjp");
datasource.setUsername("root");
datasource.setPassword("root");
// 對象連接池中的連接數量配置
datasource.setInitialSize(10);
datasource.setMaxActive(10);
datasource.setMaxIdle(5);
datasource.setMinIdle(2);
}
// 定義靜態方法,返回BasicDataSource類的對象
public static DataSource getDataSource() { //返回DataSource接口,要靈活與BasicDataSource實現類
return datasource;
}
}
2.1.3 創建app包中的類:MainApp
package cn.itcast.gjp.app;
/*
* 主程序類,開啓主要程序
* */
public class MainApp {
public static void main(String[] args) {
}
}
2.1.4 創建domain包中的類:Zhangwu
package cn.itcast.gjp.domain;
public class Zhangwu {
private int zwid;
private String flname;
private double money;
private String zhangwu;
private String createtime;
private String description;
/**
* @param zwid 賬務ID(主鍵)
* @param flname 分類名稱
* @param money 金額
* @param zhangwu 賬戶
* @param createtime 創建日期
* @param description 賬務描述
*/
public Zhangwu(int zwid, String flname, double money, String zhangwu, String createtime, String description) {
super();
this.zwid = zwid;
this.flname = flname;
this.money = money;
this.zhangwu = zhangwu;
this.createtime = createtime;
this.description = description;
}
/**
* QueryRunner方法需要調用空參構造器
*/
public Zhangwu() {
super();
}
@Override
public String toString() {
return "Zhangwu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhangwu=" + zhangwu
+ ", createtime=" + createtime + ", 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 getZhangwu() {
return zhangwu;
}
public void setZhangwu(String zhangwu) {
this.zhangwu = zhangwu;
}
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;
}
}
2.1.5 創建dao包中的類:ZhangWuDao:
package cn.itcast.gjp.dao;
import org.apache.commons.dbutils.QueryRunner;
import cn.itcast.gjp.tools.JDBCUtils;
/*
* 實現對數據表中數據的增刪改查操作
* 利用工具類dbutils完成,類成員創建QueryRunner對象,關聯datasource
* */
public class ZhangWuDao {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
}
2.1.6 創建service包中的類:ZhangWuService
package cn.itcast.gjp.service;
import cn.itcast.gjp.dao.ZhangWuDao;
/*
* 業務層類:接受控制層controller的數據,經過計算,傳遞到dao層,操作數據庫
* 調用dao層中的類,類成員位置,創建Dao類的對象,
* */
public class ZhangWuService {
private ZhangWuDao dao = new ZhangWuDao();
}
2.1.7 創建controller包中的類:ZhangWuController
package cn.itcast.gjp.controller;
import cn.itcast.gjp.service.ZhangWuService;
/*
* 控制器層:接受視圖層的數據,數據傳遞給service層;
* 成員位置,創建service對象;
* */
public class ZhangWuController {
private ZhangWuService service = new ZhangWuService();
}
2.1.8 創建view包中的類:MainView
package cn.itcast.gjp.view;
import cn.itcast.gjp.controller.ZhangWuController;
/*
* 實現界面效果:接受用戶的信息輸入,根據輸入結果,調用不同的功能方法
* */
public class MainView {
private ZhangWuController controller = new ZhangWuController();
}
3. 項目功能實現
3.1 實現用戶的界面菜單
3.1.1 編寫MainView類run方法
a. 完成功能界面菜單顯示
b. 接收鍵盤輸入的功能選項
c. 根據選項值,調用對應的功能方法
package cn.itcast.gjp.view;
import java.util.Scanner;
import cn.itcast.gjp.controller.ZhangWuController;
/*
* 實現界面效果:接受用戶的信息輸入,根據輸入結果,調用不同的功能方法
* */
public class MainView {
private ZhangWuController controller = new ZhangWuController();
// 創建Scanner類對象,反覆鍵盤輸入
public void run() {
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("---------------管家婆家庭記賬軟件---------------");
System.out.println("1.添加賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統");
System.out.println("請輸入要操作的功能序號[1-5]:");
//接收用戶的菜單選擇
int choose = sc.nextInt();
//對選擇的菜單判斷,調用不同的功能
switch(choose){
case 1:
// 選擇添加賬務,調用添加賬務的方法
addZhangWu();
break;
case 2:
// 選擇的編輯賬務,調用編輯賬務方法
editZhangWu();
break;
case 3:
// 選擇的刪除賬務,調用刪除賬務方法
deleteZhangWu();
break;
case 4:
// 選擇的是查詢賬務,調用查詢方法
selectZhangWu();
break;
case 5:
System.out.println("退出系統,再見!");
System.exit(0);
break;
default:
System.out.println("輸入錯誤,請重新輸入! ");
}
}
}
}
3.1.2 編寫MainApp類的main主方法
a. 調用MainView類中run方法,實現將程序執行起來,顯示功能界面菜單。