管家婆家庭記賬小項目

這個只是我的學習筆記,不是我做的小項目,很詳細,給各位參考,給初學者一個大概做小項目的框架

                 ******管家婆家庭記賬小項目******

1、功能:

  • 添加賬務
  • 編輯賬務
  • 刪除賬務
  • 查詢賬務
  • 退出系統

2、開發環境:eclipse、SQLyog

3、本項目使用的技術:
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包。

4、項目分層:不允許跨層調用
view視圖層 — controller控制層----service業務層—dao操作數據表-----database domain----tools工具包—test測試包

view視圖層:信息錄入提示
controller控制層:調用接上層數據,傳遞下一層;根據結果,控制view的顯示結果
service業務層:數據,來自控制層很多計算;計算後的數據給下一層,對結果集進行計算,過濾
dao:操作數據表,接到業務層數據;查詢數據
domain:JavaBean,數據存儲到了javabean類對象
tools工具包:DBUtils
test測試包:存放項目功能,測試的代碼

創建管家婆數據庫gjp,創建數據表,表名爲gjp_zhangwu,添加數據,保存爲gjp.sql
/*
  創建管家婆的數據庫
  名字 gjp
*/
CREATE DATABASE gjp;

USE gjp;

/*
  創建數據表,表名賬務
  字段,列
  主鍵
  分類名稱  可變字符
  金額  double
  賬戶  可變字符 (支付,收入方法)
  創建日期 date
  賬務描述 可變字符
*/

CREATE TABLE gjp_zhangwu(
   -- 主鍵
   zwid INT PRIMARY KEY AUTO_INCREMENT ,
   -- 分類名稱   
   flname VARCHAR(200),
   -- 金額
   money FLOAT,
   -- 賬戶
   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','又開資');

SELECT * FROM gjp_zhangwu;

                  創建JAVA工程,命名爲gjp
  **記得導入四個jar包**                     

1、創建工程包6個

  • cn.itcast.gjp.app

  • cn.itcast.gjp.dao

  • cn.itcast.gjp.domain

  • cn.itcast.gjp.tools

  • cn.itcast.gjp.view

  • cn.itcast.gjp.service

  • cn.itcast.gjp.controller

    1、 在domain包下新建Class名爲ZhangWu,用來封裝賬務信息的JavaBean
    

    可以右鍵快捷鍵添加Getter/Setter方法,ToString方法、有參無參構造方法

package cn.itcast.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() {
	
	// 無參構造方法
}
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;
}
//ToString方法
public String toString() {
	return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money
			+ ", zhanghu=" + zhanghu + ", createtime=" + createtime
			+ ", description=" + description + "]";
}
//Getter/Setter方法
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;
}

}

  2、  在tools包下,獲取數據庫連接的工具類DBUtils,實現連接池DBCP連接池
package cn.itcast.gjp.tools;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class JDBCUtils {
  private static BasicDataSource  datasource=new BasicDataSource();
  static{
	  datasource.setDriverClassName("com.mysql.jdbc.Driver");
	  datasource.setUrl("jdbc:mysql://localhost:3306/gjp");
	  datasource.setUsername("root");
	  datasource.setPassword("123");
	  datasource.setMaxActive(10);
	  datasource.setMaxIdle(5);
	  datasource.setMinIdle(2);
	  datasource.setInitialSize(5);	  
  }
  public static DataSource getDataSource(){
	  return datasource;
	  
  }
}

  3、 在app包下,創建類MainApp.java,編寫main主方法,用來完成本項目的啓動
package cn.itcast.gjp.app;

import cn.itcast.gjp.view.MainView;

public class MainApp {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
     new MainView().run();
	}

}

4、在dao包下,創建類ZhangWuDao.java,給ZhangWuDao類添加一個成員變量QueryRunner對象,因此使用DBUtils來操作數據庫。

package cn.itcast.gjp.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import cn.itcast.gjp.domain.ZhangWu;
import cn.itcast.gjp.tools.JDBCUtils;

public class ZhangWuDao {
private QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
/*定義方法,實現賬務添加功能
 * 由業務層調用,傳遞ZhangWu對象
 * 將ZhangWu對象中的數據添加到數據表
 *
 * */
public void addZhangWu(ZhangWu zw){
	try{
		//拼寫添加數據的sql
		String sql="INSERT INTO gjp_zhangwu(flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
		//創建對象數組,存儲五個?佔位符的實際參數,實際參數來源是,傳遞過來的對象ZhangWu
		Object[] params={zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()};
		//調用qr對象中的方法update執行即可
		qr.update(sql,params);
	}catch(SQLException ex){
		System.out.println(ex);
		throw new RuntimeException("賬務添加失敗");
	}
}
//定義方法,查詢數據庫,獲取所有的賬務數據
//方法,由業務層調用
//結果集,將所有的賬務數據,存儲到Bean對象中,存儲到集合中
public List<ZhangWu> selectAll(){
	try{	
	//查詢賬務的SqL語句	
	 String sql="SELECT * FROM gjp_zhangwu";
	 //調用qr對象的方法,query方法,結果集BeanListHandler
	 	List<ZhangWu> list=qr.query(sql, new BeanListHandler<>(ZhangWu.class));
	 	return list;
	}catch(SQLException ex){
		System.out.println(ex);
		throw new RuntimeException("查詢所有賬務失敗");
	}
}
/*定義方法,查詢數據庫,帶有條件去查詢賬務表
 * 由業務層調用,查詢結果集存儲到Bean對象,存儲到List集合
 * 調用者傳遞兩個日期字符串
 * */
public List<ZhangWu> select(String startDate,String endDate){	
	try{
	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("條件查詢失敗");
	}
}
/*定義方法,實現編輯賬務功能
 * 由業務層調用,傳遞ZhangWu對象
 * 將對象中的數據,更新到數據表
 * */
public void editZhangWu(ZhangWu zw) {
	try{
		//更新數據的SQL
		String 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執行更新
		qr.update(sql,params);
	}catch(SQLException ex){
		System.out.println(ex);
		throw new RuntimeException("賬務編輯失敗");
		
	}
}
/*
 * 定義方法,實現刪除賬務
 * 業務層調用,傳遞主鍵ID值
 * 
 * */

public void deleteZhangWu(int zwid) {
	try
	{
	//拼寫刪除數據的Sql
	String sql="DELETE FROM gjp_zhangwu WHERE zwid=?";
	qr.update(sql, zwid);
	}catch(SQLException ex){
		System.out.println(ex);
		throw new RuntimeException("賬務刪除失敗");
	}
}

}

5、在Service包下,創建類ZhangWuService.java,給ZhangWuService類添加一個類型爲ZhangWuDao的成員變量,因爲Service依賴dao

package cn.itcast.gjp.service;

import java.util.List;

import cn.itcast.gjp.dao.ZhangWuDao;
import cn.itcast.gjp.domain.ZhangWu;

public class ZhangWuService {
private ZhangWuDao dao=new ZhangWuDao();
/*定義方法,實現添加賬務
 * 是由控制層調用,傳遞ZhangWu類型對象
 * 調用dao層方法,傳遞ZhangWu對象
 * */
public void addZhangWu(ZhangWu zw){
	dao.addZhangWu(zw);
}
//定義方法,實現查詢所有的賬務數據
//此方法,由控制層擁有,去調用dao層的方法
//返回存儲ZhangWu對象的List集合
public List<ZhangWu> selectAll(){
	//List<ZhangWu> list=dao.selectAll();
	return dao.selectAll();
}
/*定義方法,實現條件查詢服務
 * 方法由控制層調用,傳遞兩個日期的字符串
 * 調用dao層的方法,傳遞兩個日期字符串
 * 獲取到查詢結果集
 * 
 * 
 * */
public List<ZhangWu> select(String startDate,String endDate){	
	return dao.select(startDate, endDate);
	
	
}
/*定義方法,實現編輯賬務
 * 由控制層調用,傳遞ZhangWu對象
 * 調用dao層的方法,傳遞ZhangWu對象
 * */
public void editZhangWu(ZhangWu zw) {
	dao.editZhangWu(zw);
	
}
/*
 * 定義方法,實現刪除賬務功能
 * 由控制層調用,傳遞主鍵id
 * 調用dao層方法,傳遞主鍵id
 * */
public void deleteZhangWu(int zwid) {
	dao.deleteZhangWu(zwid);
	
}
} 

6、在Controller包下,創建ZhangWuController類,接收視圖層的數據,數據傳遞給service層,創建service對象

package cn.itcast.gjp.controller;

import java.util.List;

import cn.itcast.gjp.domain.ZhangWu;
import cn.itcast.gjp.service.ZhangWuService;

public class ZhangWuController {
private  ZhangWuService service=new ZhangWuService();
/*
 * 定義方法,實現刪除賬務功能
 * 視圖層調用,傳遞int類型主鍵
 *調用service層方法,傳遞int主鍵
 * */
public void deleteZhangWu(int zwid){
	service.deleteZhangWu(zwid);
	
}
/*
 * 定義方法,實現編輯賬務功能
 * 由視圖層調用,傳遞參數,也是ZhangWu對象
 * 調用service層的方法,傳遞ZhangWu對象
 * */
public void editZhangWu(ZhangWu zw){
	service.editZhangWu(zw);
}
/*定義方法,實現賬務添加功能
 * 由視圖層調用,傳遞參數(傳遞過來的參數是一個賬務類型的對象)
 * 方法調用service層的方法,傳遞ZhangWu對象,獲取添加後的結果集(添加成功的行數,int)
 *
 * */
public void addZhangWu(ZhangWu zw){
	service.addZhangWu(zw);
}
//控制層類定義方法,實現查詢所有的賬務數據
//方法由視圖層調用,方法調用service層
public List<ZhangWu> selectAll(){	
	return service.selectAll();
}
/*定義方法,實現條件查詢服務
 * 方法由視圖層調用,傳遞兩個日期的字符串
 * 調用service層的方法,傳遞兩個日期字符串
 * 結果集返回給試圖
  */
public List<ZhangWu> select(String startDate,String endDate ){	
	return service.select(startDate,endDate);
}
}

7、在view包下,創建類MainView類,視圖層,數據傳遞給controller層實現,成員位置創建controller對象

package cn.itcast.gjp.view;

import java.util.List;
import java.util.Scanner;

import cn.itcast.gjp.controller.ZhangWuController;
import cn.itcast.gjp.domain.ZhangWu;

public class MainView {
 private ZhangWuController controller=new ZhangWuController();
//實現界面效果,接收用戶輸入,根據數據,調用不同的功能方法
 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.exit(0);
			 break;
		 }		 
	 }	 
 }
 /*
  * 定義方法,實現賬務刪除
  * 接收用戶輸入,輸入一個主鍵數據。調用控制層方法,傳遞一個主鍵
  * */
 public void deleteZhangWu() {
	 //調用查詢所有賬務數據的功能,用戶可以看到所有數據,用戶可以選擇一項進行編輯
	 selectAll();
	 System.out.println("選擇的是刪除功能,請輸入序號");	 
	int zwid=new Scanner(System.in).nextInt();
	// 調用控制層的方法,傳遞主鍵ID
	controller.deleteZhangWu(zwid);
	System.out.println("刪除賬務成功");
}

/*定義方法,實現對賬務的編輯功能
  * 接收用戶的輸入,數據的信息,封裝成ZhangWu對象
  * 調用控制層的方法,傳遞ZhangWu對象,實現編輯
  * */
 public void editZhangWu(){
	 //調用查詢所有賬務數據的功能,用戶可以看到所有數據,用戶可以選擇一項進行編輯
	 selectAll();
	 System.out.println("選擇的是編輯數據,請輸入數據");
	 Scanner sc=new Scanner(System.in);
	 System.out.println("輸入ID:");
	 int zwid=sc.nextInt();
		System.out.print("輸入分類名稱:");
		String flname=sc.next();
		System.out.print("輸入金額:");
		double money=sc.nextDouble();
		System.out.print("輸入賬戶:");
		String zhanghu=sc.next();
		System.out.print("輸入日期:格式XXXX-XX-XX:");
		String createtime=sc.next();
		System.out.print("輸入具體描述:");
		String description=sc.next();
		//將所有用戶輸入的數據封裝到賬務的對象中
		//用戶輸入的ID必須封裝對象
		ZhangWu zw=new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
		//調用controller層中的方法編輯賬戶
		controller.editZhangWu(zw);
		System.out.println("賬務編輯成功");		
 }
 public  void addZhangWu() {
	System.out.println("選擇的是添加賬務,請輸入一下內容");
	Scanner sc=new Scanner(System.in);
	System.out.print("輸入分類名稱:");
	String flname=sc.next();
	System.out.print("輸入金額:");
	double money=sc.nextDouble();
	System.out.print("輸入賬戶:");
	String zhanghu=sc.next();
	System.out.print("輸入日期:(格式XXXX-XX-XX):");
	String createtime=sc.next();
	System.out.print("輸入具體描述:");
	String description=sc.next();
	//將接收到的數據,調用controller層的方法,傳遞參數
	//將用戶輸入的所有參數,封裝成ZhangWu對象
	ZhangWu zw=new ZhangWu(0, flname, money, zhanghu, createtime, description);
	controller.addZhangWu(zw);
	System.out.println("添加賬務成功");
}
//查詢數據,有查詢全部跟條件查詢
 public void selectZhangWu(){
	 System.out.println("1.查詢所有   2。條件查詢");
	 Scanner sc=new Scanner(System.in);
	 int selectChooser=sc.nextInt();
	 switch(selectChooser){
	 case 1:selectAll();break;
	 case 2:select();break;
	 default:System.out.println("輸入錯誤!");	 
	 }	 
 }
 //定義方法,實現查詢所有的賬務數據
 public void selectAll(){
	 //調用控制層中的方法,查詢所有的賬務數據
	List<ZhangWu> list= controller.selectAll();
	if(list.size()!=0)
		print(list);
		else 
		System.out.println("沒有查詢到數據");	
 }

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();
	List<ZhangWu> list=controller.select(startDate, endDate);
	if(list.size()!=0)
	print(list);
	else 
	System.out.println("沒有查詢到數據");
}
//輸出賬務數據方法,接受List集合,遍歷集合,輸出表格
private void print(List<ZhangWu> list) {
	//輸出表頭 
		System.out.println("ID\t\t類別\t\t賬戶\t\t金額\t\t時間\t\t說明");
		//遍歷集合,結果輸出控制檯
		for(ZhangWu zw:list){
			System.out.println(zw.getZwid()+"\t\t"+zw.getFlname()+"\t\t"+zw.getZhanghu()
					+"\t\t"+zw.getMoney()+"\t\t"+zw.getCreatetime()+"\t"+zw.getDescription());		
		}
}
}

運行:點擊MainApp.java,因爲它是用來完成本項目的啓動的。

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 1941
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章