【Java專案】管家婆
1.專案目標
熟練View層,Seryice層,Dao層之間方法的相互呼叫
熟練dbutils操作資料庫表完成增刪改查
---------------------------------------------------------------------------------------------------------------------------------------------------
2.專案中的功能模組
①查詢賬務(全部查詢)
②多條件查詢
③新增賬務
④編輯賬務
⑤刪除賬務
---------------------------------------------------------------------------------------------------------------------------------------------------
3.技術的選擇和相關jar包
(1)apache的Commons元件
①Commons-dbutils:封裝簡化JDBC操作
②Commons-dbcp:資料庫連線池元件
③Commons-pool:DBCP連線池依賴該jar包
(2)mysql-connector:MySQL的JDBC驅動包,用JDBC連線資料庫必須使用該jar包
---------------------------------------------------------------------------------------------------------------------------------------------------
4.專案中的工具類
DBCPUtils:封裝了連線池操作,用來建立資料庫連線池物件
import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSource; /* *資料庫連線池的工具類 *將連線池的操作封裝 *呼叫該類靜態方法獲得連線池物件 */ public class DBCPUtils { private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String USERNAME = "root"; private static final String PASSWORD = "yuweijun"; private static BasicDataSource dataSource = new BasicDataSource(); // 靜態程式碼塊,自定義BasicDataSource中的配置 static { // 配置必須項 dataSource.setDriverClassName(DRIVER_CLASS_NAME);// 註冊驅動 dataSource.setUrl(URL);// 資料庫地址 dataSource.setUsername(USERNAME);// 傳入使用者名稱 dataSource.setPassword(PASSWORD);// 傳入密碼 // 配置基本項(可選) dataSource.setInitialSize(10);// 初始化連線數 dataSource.setMaxIdle(5);// 最大空閒數 dataSource.setMinIdle(1);// 最小空閒數 } // BasicDataSource類實現類資料來源的規範介面:javax.sql.DataSource public static DataSource getDataSource() { return dataSource; } }
---------------------------------------------------------------------------------------------------------------------------------------------------
5.資料表的設計
對於一個專案而言,表設計是非常重要的,因為應用程式中所有操作都是基於資料表進行的。
(多個數據表中是可以有聯絡的,分主表和從表)
---------------------------------------------------------------------------------------------------------------------------------------------------
6.建立資料表並寫入測試資料
(1)建立管家婆資料庫
create database gjp;
(2)建立資料表
CREATE TABLE gjp_zhangwu (
zwid INT PRIMARY KEY AUTO_INCREMENT,
flname VARCHAR(200),
money DOUBLE,
zhangHu VARCHAR(100),
createtime DATE,
description VARCHAR(1000)
);
(3)向表中插入測試資料
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','又開資');
--------------------------------------------------------------------------------------------------------------------------------------------------------
7.專案中的分層設計
① view層作用: 檢視層,即專案中的介面
② controller層作用: 控制層, 獲取介面上的資料,為介面設定資料; 將要實現的功能交給業務層處理
③ service層作用: 業務層, 功能的實現, 與controller控制層和資料訪問層DAO互動, 將對資料庫的操作交給DAO資料訪問層來處理
④ dao層作用: 資料訪問層, 用來操作資料庫表的資料
⑤ db資料庫: 這裡指MySQL
⑥ domain 實體包: 存放JavaBean
⑦ tools工具包:存放專案中使用到的工具類
⑧ test 測試包: 存放專案功能測試的程式碼
(實際開發中,是不允許跨層呼叫的)
---------------------------------------------------------------------------------------------------------------------------------------------------------
8.工程建立及包管理
(1)建立Java工程,命名為gjp;
(2)建立工程包
① app:存放main方法類
② domain:存放javaBean
③ view:存放介面,及表現層類
④ service:存放業務層
⑤ dao:存放資料訪問層類
⑥ tools:存放工具類
(3)建立lib資料夾,儲存將要使用的jre包
---------------------------------------------------------------------------------------------------------------------------------------------------------
9.建立domain中的類
類名:zhangwu,封裝賬務資訊的javaBean
私有成員變數:表中所有欄位
方法:成員變數的get和set方法
構造方法:空參構造器和全參構造器
(快捷鍵 Alt+Shift+S 自動生成)
---------------------------------------------------------------------------------------------------------------------------------------------------------
10.建立tools中的類
類名:DBCPUtils
作用:實現連線池,返回連線池物件(往前翻有詳細程式碼)
---------------------------------------------------------------------------------------------------------------------------------------------------------
11.建立其他包中的類
①app包:建立類MainApp,編寫main主方法,作用是完成本專案的啟動
②dao包:建立類ZhangWuDao,給該類新增一個成員變數QueryRunner物件,因為我們使用DBUtils來操作資料庫
③service包:建立類ZhangWuService,給該類新增一個型別為ZhangWuDao的成員變數,因為service依賴dao
④view包:建立類MainView,給該類新增一個型別為ZhangWuService的成員變數,因為view依賴service
(該建的類都建齊了,接下來便是完成每個類的功能,以及類與類建的聯絡)
---------------------------------------------------------------------------------------------------------------------------------------------------------
12.實現使用者的選單介面
(1)編寫MainView類run方法
①完成功能介面選單顯示
②接收鍵盤輸入的功能選項
③根據選項值,呼叫對應的功能方法
(2)編寫MainApp類的main主方法
①呼叫MainView類中的run方法,實現讓程式執行起來,顯示功能介面選單
---------------------------------------------------------------------------------------------------------------------------------------------------------
13.實現查詢的介面選單
1.查詢所有 2.按條件查詢
①在MainView類中定義方法selectZhangWu,顯示查詢方式,接收使用者選擇
②在MainView類中定義方法seleceAll,查詢所有賬務資訊
③在MainView類中定義方法select,實現條件查詢
---------------------------------------------------------------------------------------------------------------------------------------------------------
14.Service層實現查詢所有賬務資訊
方法名:selectAll
作用:呼叫dao層的方法selectAll查詢資料庫,獲取dao層返回的所有賬務資訊
---------------------------------------------------------------------------------------------------------------------------------------------------------
15.Dao層實現查詢所有賬務資訊
方法名:selectAll
作用:呼叫QueryRunner方法,傳入sql語句,返回結果集BeanListHandler
---------------------------------------------------------------------------------------------------------------------------------------------------------
16.View層實現查詢所有賬務資訊
方法名:selectAll
作用:接收service層返回的賬務資訊並輸出
---------------------------------------------------------------------------------------------------------------------------------------------------------
17.實現多條件查詢的介面選單
在select方法中,輸入起始日期和結束日期,傳遞日期到service層,獲取service返回的結果集,並列印
---------------------------------------------------------------------------------------------------------------------------------------------------------
18.Service層實現條件查詢賬務資訊
方法名:select
作用:接收view傳入的日期字串,呼叫dao層方法,獲取dao層返回的結果集
---------------------------------------------------------------------------------------------------------------------------------------------------------
19.Dao層實現條件查詢賬務資訊
SQL語句:select * from gjp_zhangwu where createtime between ? and ? ;
---------------------------------------------------------------------------------------------------------------------------------------------------------
20.抽取列印結果重複程式碼形成方法
我們發現打印表頭及輸出結果的程式碼冗長且重複,我們使用快捷鍵Alt+Shift+M選中程式碼塊,將其抽取成print方法,每次呼叫該方法即可列印資料
---------------------------------------------------------------------------------------------------------------------------------------------------------
後面的功能大同小異,及其簡單,便不在過多描述,貼上程式碼:
Mainapp類
package app;
import view.MainView;
public class MainApp {
public static void main(String[] args) {
new MainView().run();
}
}
MainView類
package view;
import java.util.List;
import java.util.Scanner;
import domain.ZhangWu;
import service.ZhangWuService;
public class MainView {
private static ZhangWuService service = new ZhangWuService();
Scanner sc = new Scanner(System.in);
// 顯示使用者選單介面
public void run() {
while (true) {
System.out.println("-----------------------管家婆家庭記賬軟體-----------------------------------");
System.out.println("1.新增賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統");
System.out.print("請輸入要操作的功能編號:");
int choose = sc.nextInt();
switch (choose) {
case 1:// 新增賬務
addZhangWu();
break;
case 2:// 編輯賬務
updateZhangWu();
break;
case 3:// 刪除賬務
deleteZhangwu();
break;
case 4:// 查詢賬務
selectZhangWu();
break;
case 5:// 退出系統
System.out.println("再見!");
return;
}
}
}
// 刪除指定ID的資料
public void deleteZhangwu() {
System.out.println("請輸入要刪除的資料ID:");
service.deleteZhangWu(sc.nextInt());
System.out.println("刪除成功!");
}
// 編輯財務,對已有的資料進行修改
public void updateZhangWu() {
System.out.println("請輸入要修改資料的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("請輸入修改後的時間:");
String createtime = sc.next();
System.out.println("請輸入修改後的說明:");
String description = sc.next();
service.updateZhangWu(flname, money, zhanghu, createtime, description, zwid);
System.out.println("修改成功!");
}
// 新增賬務,新增使用者新增的資料
public void addZhangWu() {
System.out.println("請輸入新增類別:");
String flname = sc.next();
System.out.println("請輸入新增金額:");
double money = sc.nextDouble();
System.out.println("請輸入新增賬戶:");
String zhanghu = sc.next();
System.out.println("請輸入新增時間:");
String createtime = sc.next();
System.out.println("請輸入新增說明:");
String description = sc.next();
service.addZhangWu(flname, money, zhanghu, createtime, description);
System.out.println("新增賬務成功!");
}
// 顯示查詢方式,接收使用者選擇
public void selectZhangWu() {
System.out.println("1.全部所有 2.條件查詢");
System.out.print("請輸入查詢方式:");
int choose = sc.nextInt();
if (choose == 1)
selectAll();
else if (choose == 2)
select();
else
System.out.println("選項不存在,請重新操作!");
}
// 查詢所有賬戶資訊
public void selectAll() {
List<ZhangWu> list = service.selectAll();
print(list);
}
// 輸出資料,遍歷傳入的集合
private void print(List<ZhangWu> list) {
System.out.println(" id\t\t 類別 \t\t金額 \t\t賬戶\t\t 時間\t\t\t說明");
for (ZhangWu zw : list)
System.out.println(zw);
}
// 按條件查詢賬戶資訊
public void select() {
System.out.println("選擇條件查詢,請輸入日期格式XXXX-XX-XX");
System.out.print("請輸入起始日期:");
String firstDate = sc.next();
System.out.print("請輸入結束日期:");
String lastDate = sc.next();
List<ZhangWu> list = service.select(firstDate, lastDate);
print(list);
}
}
ZhangWuService類
package service;
import java.util.List;
import java.util.Scanner;
import dao.ZhangWuDao;
import domain.ZhangWu;
public class ZhangWuService {
private ZhangWuDao dao = new ZhangWuDao();
// 接收view層的資訊,刪除指定ID的資料
public void deleteZhangWu(int zwid) {
dao.delete(zwid);
}
// 接收view層資訊,修改指定ID的資料
public void updateZhangWu(String flname, double money, String zhanghu, String createtime, String description,
int zwid) {
Object[] params = { flname, money, zhanghu, createtime, description, zwid };
dao.updateZhangWu(params);
}
// 接收view層資訊,新增資料
public void addZhangWu(String flname, double money, String zhanghu, String createtime, String description) {
Object[] params = { flname, money, zhanghu, createtime, description };
dao.addZhangWu(params);
}
// 接受檢視層的日期,呼叫dao層方法,傳入日期,獲得結果集
public List<ZhangWu> select(String firstDate, String lastDate) {
return dao.select(firstDate, lastDate);
}
// 呼叫dao層方法,查詢所有賬務資訊
public List<ZhangWu> selectAll() {
return dao.selectAll();
}
}
ZhangWuDao類
package service;
import java.util.List;
import java.util.Scanner;
import dao.ZhangWuDao;
import domain.ZhangWu;
public class ZhangWuService {
private ZhangWuDao dao = new ZhangWuDao();
// 接收view層的資訊,刪除指定ID的資料
public void deleteZhangWu(int zwid) {
dao.delete(zwid);
}
// 接收view層資訊,修改指定ID的資料
public void updateZhangWu(String flname, double money, String zhanghu, String createtime, String description,
int zwid) {
Object[] params = { flname, money, zhanghu, createtime, description, zwid };
dao.updateZhangWu(params);
}
// 接收view層資訊,新增資料
public void addZhangWu(String flname, double money, String zhanghu, String createtime, String description) {
Object[] params = { flname, money, zhanghu, createtime, description };
dao.addZhangWu(params);
}
// 接受檢視層的日期,呼叫dao層方法,傳入日期,獲得結果集
public List<ZhangWu> select(String firstDate, String lastDate) {
return dao.select(firstDate, lastDate);
}
// 呼叫dao層方法,查詢所有賬務資訊
public List<ZhangWu> selectAll() {
return dao.selectAll();
}
}
ZhangWu類
package domain;
public class ZhangWu {
private int zwid;
private String flname;
private double money;
private String zhanghu;
private String createtime;
private String description;
@Override
public String toString() {
return " " + zwid + "\t\t" + flname + "\t\t" + money + "\t\t" + zhanghu + "\t\t" + createtime + "\t\t"
+ 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;
}
public ZhangWu(int zwid, String flname, double money, String zhangwu, String createtime, String description) {
this.zwid = zwid;
this.flname = flname;
this.money = money;
this.zhanghu = zhangwu;
this.createtime = createtime;
this.description = description;
}
public ZhangWu() {
}
}
DBCPUtils類
package tools;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
public class DBCPUtils {
private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/gjp";
private static final String USERNAME = "root";
private static final String PASSWORD = "yuweijun";
private static BasicDataSource dataSource = new BasicDataSource();
// 靜態程式碼塊,自定義BasicDataSource中的配置
static {
// 配置必須項
dataSource.setDriverClassName(DRIVER_CLASS_NAME);// 註冊驅動
dataSource.setUrl(URL);// 資料庫地址
dataSource.setUsername(USERNAME);// 傳入使用者名稱
dataSource.setPassword(PASSWORD);// 傳入密碼
}
// BasicDataSource類實現類資料來源的規範介面:javax.sql.DataSource
public static DataSource getDataSource() {
return dataSource;
}
}