1. 程式人生 > >【Java專案】管家婆

【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;
	}
}