管家婆家庭记账小项目

这个只是我的学习笔记,不是我做的小项目,很详细,给各位参考,给初学者一个大概做小项目的框架

                 ******管家婆家庭记账小项目******

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章