Java_管家婆项目(三十一)——管家婆家庭记账软件(项目环境搭建、功能模块、代码)、后附网盘链接

管家婆家庭记账软件

目录

第一章 项目介绍

1.1 项目安排

1.1.1 项目目标

1.2 项目功能分析

1.2.1 项目功能介绍

第二章 项目环境搭建

2.1 技术选型和jar包介绍

2.2 工具类介绍

2.3 数据表创建

2.3.1 创建数据库

2.3.2 创建数据库表

2.3.3 添加表数据

2.4 项目分层(分包)的作用

2.5 工程创建及包管理

第三章  功能模块

3.1 相关类创建

3.2 账务JavaBean

3.3 功能界面菜单

3.3.1 功能实现步骤

3.3.2 功能实现代码

3.4 查询所有账务

3.4.1 功能分析

3.4.2 功能实现代码

3.5 多条件查询账务

3.5.1 功能分析

3.5.2 功能实现步骤

3.6 添加账务

3.6.1 功能分析

3.6.2 功能实现步骤

3.7 编辑账务

3.7.1功能分析

3.7.2 功能实现步骤

3.8 删除账务

3.8.1 功能分析

3.8.2 功能实现步骤

第四章 总结


第一章 项目介绍

管家婆家庭记账软件

1.1 项目安排

1.1.1 项目目标

本项目为JAVAEE基础班综合项目,包含了若干个知识点,达到将基础班所学知识综合使用,提高了我们对项目的理解与知识点的运用。

熟练View层、Service层、Dao层之间的方法相互调用操作、

熟练dbutils操作数据库表完成增删改查

通过本项目,让我们了解公司项目开发的流程,充分的掌握项目需求分析、设计与功能的代码实现。提高同学们独立分析需求与功能实现的能力。

 

1.2 项目功能分析

1.2.1 项目功能介绍

 

  • 查询账务
  • 多条件组合查询账务
  • 添加账务
  • 编辑账务
  • 删除账务

 

第二章 项目环境搭建

2.1 技术选型和jar包介绍

每个项目都要使用一些已经成熟的技术,它们通常是由一些专业组织或团队所提供的开源免费技术。在今后的学习过程中,我们会逐渐对这些专业组织有所了解。本项目中使用的技术如下:

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包。

 

2.2 工具类介绍

每个项目都会用到一些工具类,本项目也不例外。我们不会教大家如何实现这些类,而是让大家知道在项目我们如何使用这些工具类,下面是本项目中所使用的工具类以及介绍:

JDBCUtils:用来创建数据库连接池对象;

在项目的实现过程中,我们会说明工具类的使用,这里就不再过多介绍。

 

2.3 数据表创建

对一个项目而言,表设计是非常重要的,因为应用程序中所有的操作都是基于数据库表而进行的,所以我们第一步就是创建数据库表。

管家婆项目的数据库设计很简单,我们只需找到gjp.sql文件,然后执行之即可。下面是创建库及表的SQL语句:

 

2.3.1 创建数据库

/*
  创建管家婆的数据库
  名字 gjp
*/
CREATE DATABASE gjp;

 

2.3.2 创建数据库表

CREATE TABLE gjp_zhangwu (
  zwid INT PRIMARY KEY AUTO_INCREMENT,
  flname VARCHAR(200),
  money DOUBLE,
  zhangHu VARCHAR(100),
  createtime DATE,
  description VARCHAR(1000) 
);

 

2.3.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','又开资');

 

 

2.4 项目分层(分包)的作用

程序为什么要分包分层?

以顾客去饭店吃饭案例分析一下:

    小饭店: 一个服务员搞定(接待顾客\点菜\炒菜)

    大饭店:

  • 迎宾员(是否有预定\ 询问吃中餐还是西餐或者烧烤等\ 几位用餐 \ 领路到指定的包间\ 找点菜员为顾客点菜 )
  • 点菜员(记录顾客点餐内容\ 记录是否有忌口等问题\ 找厨师为顾客炒菜)
  • 厨师(按照顾客菜肴清单,进行炒菜)

通过案例发现,当程序规模小的时候,可以一个人全部完成;但程序规模大的时候,一个人难以完成,这时,要采用多人合作的方式来完成程序开发。

         多人合作方式将会碰到工作任务分配问题,这时我们会想,每个人负责完成项目的一块内容就可以了。那么,这一块块内容的划分,就需要我们采用分层(分包)的方式完成了。

         通过下图(用户注册功能)来讲解下,项目中常见的分层(分包)。

 

  • view层作用: 视图层,即项目中的界面
  • controller层作用: 控制层, 获取界面上的数据,为界面设置数据; 将要实现的功能交给业务层处理
  • service层作用: 业务层, 功能的实现, 与controller控制层和数据访问层DAO交互, 将对数据库的操作交给DAO数据访问层来处理
  • dao层作用: 数据访问层, 用来操作数据库表的数据
  • db数据库: 这里指MySQL
  • domain 实体包: 存放JavaBean
  • tools工具包:存放项目中使用到的工具类
  • test 测试包: 存放项目功能测试的代码

 

2.5 工程创建及包管理

1.使用Eclipse创建Java工程,命名为gjp

2. 创建工程包

  • cn.itcast.gjp.app: 存放main方法类;
  • cn.itcast.gjp.domain: 存放JavaBean;domain包与数据库是有关联的
  • cn.itcast.gjp.view: 存放界面,及表现层类;
  • cn.itcast.gjp.service: 存放业务层类;
  • cn.itcast.gjp.dao: 存放数据访问层类;
  • cn.itcast.gjp.tools:存放工具类
  • cn.itcast.gjp.controller: 存放从界面上获取的数据。

3. 创建lib文件夹,用来存储使用的jar包

 

第三章  功能模块

3.1 相关类创建

完成本项目中类的创建,无需在类中添加代码。

  1. 复制已编写好的工具类JDBCUtils.java 到 tools包中;
  2. 复制jar包mysql-connector-java-5.1.28-bin.jar[L1] 、commons-dbutils-1.4.jar[L2] 、commons-dbcp-1.4.jar[L3] 、commons-pool-1.3.jar[L4],到lib文件夹中,通过Build Path操作,添加到classPath路径中,提供给JDBCUtils使用;
  3. 在app包中,创建类MainApp.java,编写main主方法,用来完成本项目的启动
  4. 在domain包中,创建类ZhangWu.java,它是用来封装账务信息的JavaBean。
  5. 在dao包中,创建类ZhangWuDao.java,给ZhangWuDao类添加一个成员变量QueryRunner对象,因为我们使用dbutils来操作数据库。
  6. 在service包中,创建类ZhangWuService.java,给ZhangWuService类添加一个类型为ZhangWuDao的成员变量,因为service依赖dao。
  7. 在view包中,创建类MainView.java,给MainView类添加一个类型为ZhangWuService的成员变量,因为本项目中view依赖service。

MySQL的JDBC驱动包,用JDBC连接MySQL数据库必须使用该JAR包

封装并简化了JDBC

apache commons提供的数据库连接池组件,命名为DBCP

DBCP连接池依赖该jar包

1. 编写tools中的JDBCUtils.java:
package cn.itcast.gjp.tools;

/*
 *  获取数据库连接的工具类
 *  实现连接池,dbcp连接池
 */
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils{
    //创建BasicDataSource对象
	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("");
		datasource.setMaxActive(10);
		datasource.setMaxIdle(5);
		datasource.setMinIdle(2);
		datasource.setInitialSize(10);
	}
	public static DataSource getDataSource(){
		return datasource;
	}
}
/*
 * private static DataSource datasource1 ;
 * datasource1= BasicDataSourceFactory.createDataSource(Properties键值对)
 * createDataSource返回值,返回的是DataSource接口实现类
 */ 

2.编写domain包中ZhangWu.java:

package cn.itcast.gjp.domain;

public class ZhangWu {
}

3.编写app包中MainApp.java

package cn.itcast.gjp.app;

public class MainApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

4.编写Dao包中ZhangWuDao.java

package cn.itcast.gjp.dao;

import org.apache.commons.dbutils.QueryRunner;

import cn.itcast.gjp.tools.JDBCUtils;

public class ZhangWuDao {
	private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
	
}

5.编写Service包,ZhangWuService.java

package cn.itcast.gjp.service;

import cn.itcast.gjp.dao.ZhangWuDao;

public class ZhangWuService {
	private ZhangWuDao dao = new ZhangWuDao();
	
}

6.编写controller包,ZhangWuController.java

package cn.itcast.gjp.controller;

import cn.itcast.gjp.service.ZhangWuService;

public class ZhangWuController {
	private ZhangWuService service = new ZhangWuService();
}

7.编写view包,MainView.java

package cn.itcast.gjp.view;

import cn.itcast.gjp.controller.ZhangWuController;

public class MainView {
	private ZhangWuController controller = new ZhangWuController();
}

 

 

3.2 账务JavaBean

JavaBean是指的是Java中的类,该类中的成员变量与数据库表中的字段相对应(变量名对应数据库表字段名、变量数据类型对应数据库表字段类型),并提供空参数构造方法、set、get方法。

我们现在来完成账务类的代码编写,如下:

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(int zwid, String flname, double money, String zhanghu, String createtime, String description) {
		super();
		this.zwid = zwid;
		this.flname = flname;
		this.money = money;
		this.zhanghu = zhanghu;
		this.createtime = createtime;
		this.description = description;
	}
	public ZhangWu() {
		super();
		// TODO Auto-generated constructor stub
	}
	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;
	}
	@Override
	public String toString() {
		return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu
				+ ", createtime=" + createtime + ", description=" + description + "]";
	}

	 
}

 

3.3 功能界面菜单

界面菜单的完成,是项目编写的第一步。

我们通过输出语句,完成界面菜单的输出,之后再根据输入的功能序号,进行对应功能的调用执行。

 

3.3.1 功能实现步骤

1.编写MainView类run方法

  • 完成功能界面菜单显示
  • 接收键盘输入的功能选项
  • 根据选项值,调用对应的功能方法

2. 编写MainApp类的main主方法

  • 调用MainView类中run方法,实现将程序执行起来,显示功能界面菜单。

3.3.2 功能实现代码

1.在view包MainView类中编写run方法

package cn.itcast.gjp.view;

import java.util.Scanner;

import cn.itcast.gjp.controller.ZhangWuController;

public class MainView {
	private ZhangWuController controller = new ZhangWuController();
	/*
	 *  实现界面效果
	 *  接收用户的输入
	 *  根据数据,调用不同的功能方法
	 */
	public void run(){
		//创建Scanner类对象,反复键盘输入
		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;
			}
		}
	}
	/*
	 * 定义方法 selectZhangWu()
	 * 显示查询的方式 1 所有查询   2 条件查询
	 * 接收用户的选择
	 */
	 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;
		 }
	 }
	public void select() {
		
		
	}
	public void selectAll() {
		 //调用控制层中的方法,查询所有的账务数据
		
	}
	public void deleteZhangWu() {
		
		
	}
	public void editZhangWu() {
		
		
	}
	public void addZhangWu() {
		
		
	}
}

2.app包MainApp类的main主方法中,调用MainView类中run方法

public static void main(String[] args) {
	new MainView().run();
}

 

3.4 查询所有账务

 

3.4.1 功能分析

1.编写MainView类中selectZhangWu方法

  • 通过输出语句,显示出要查询账务的方式
  • 接收键盘的输入项,调用对应的方法(1.查询所有 2.按条件查询

2. 编写MainView类中selectAll查询所有账务方法

  • 调用ZhangWuService类selectAll方法,返回包含所有账务数据的List<ZhangWu>集合
  • 调用MainView类中print方法,实现控制台显示所有账务数据

3. 编写controller类的selectAll方法

4..编写ZhangWuService类中selectAll方法

  • 调用ZhangWuDao类中selectAll方法,返回包含所有账务数据的List<ZhangWu>集合

5. 编写ZhangWuDao类中selectAll()方法

  • 通过QueryRunner对象,调用query方法查询数据库表gjp_zhangwu,返回包含所有账务数据的List<ZhangWu>集合
  • 控制层调用业务层,业务层调用dao层,dao层查询数据库。
  • 查询结果的返回值是数据库中的多行数据,因此返回值应该为每行封装成Bean,然后组成的List集合。即javabean对象,因为domain包中为ZhangWu类。因此返回对象应为List<ZhangWu>对象。

 

3.4.2 功能实现代码

1.编写MainView类中selectZhangWu、selectAll方法

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类对象,反复键盘输入
		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;
			}
		}
	}
	/*
	 * 定义方法 selectZhangWu()
	 * 显示查询的方式 1 所有查询   2 条件查询
	 * 接收用户的选择
	 */
	 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;
		 }
	 }
	public void select() {
		
		
	}
	public void selectAll() {
		 //调用控制层中的方法,查询所有的账务数据
		 List<ZhangWu> list = controller.selectAll();
		//输出表头
		 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());
		 }
	}
	public void deleteZhangWu() {
		
		
	}
	public void editZhangWu() {
		
		
	}
	public void addZhangWu() {
		
		
	}
	//输出账务数据方法,接收List集合,遍历集合,输出表格
		
	
}

2. 编写controller类的selectAll方法

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();
	
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由试图层调用,传递两个日期的字符串
	 * 调用service层的方法,传递两个日期字符串,获取结果集
	 * 结果集返回给试图
	 */
//	public List<ZhangWu> select(){
//		return service.select();
//	}
	
	/*
	 * 控制层类定义方法,实现查询所有的账务数据
	 * 方法由试图层调用,方法调用service层
	 */
	public List<ZhangWu> selectAll(){
		return service.selectAll();
	}
}

3.编写ZhangWuService类中selectAll方法

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();
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由控制层调用,传递2个日期字符串
	 * 调用dao层的方法,传递2个日期字符串
	 * 获取到查询结果集
	 */
//	public List<ZhangWu> select(){
//		return dao.select();
//	}
	
	/*
	 *  定义方法,实现查询所有的账务数据
	 *  此方法,由控制层调用, 去调用dao层的方法
	 *  返回存储ZhangWu对象的List集合
	 */
	public List<ZhangWu> selectAll(){
		return dao.selectAll();
	}
}

4.编写ZhangWuDao类中selectAll()方法

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());
	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("查询所有账务失败");
			}
	}
	
//	public List<ZhangWu> select(){
//		
//	}
}

 

3.5 多条件查询账务

3.5.1 功能分析

1. 编写MainView类中select方法

  • 通过键盘输入查询日期的范围
  • 调用ZhangWuSerice类中select方法,返回查询日期范围内的账务信息集合List<ZhangWu>
  • 调用MainView类中的print方法,将账务信息集合中的内容显示在控制台中

2. 编写MainView类中print方法

  • 使用输出语句,打印出账务表的表头名称
  • 遍历账务集合,将每个账务信息输出打印

3. 编写ZhangWuController类中select方法

4. 编写ZhangWuService类中select方法

  • 调用ZhangWuDao 类中select方法,返回查询日期范围内的账务信息集合List<ZhangWu>

5. 编写ZhangWuDao类中select方法

  • 通过QueryRunner对象,调用query方法查询数据库表gjp_zhangwu,返回包含查询日期范围内的账务数据List<ZhangWu>集合
  • 打印信息,代码重复率太高,因此将打印信息的代码进行方法抽取,alt+shift+m

 

3.5.2 功能实现步骤

1. 编写MainView类中select方法

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类对象,反复键盘输入
		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;
			}
		}
	}
	/*
	 * 定义方法 selectZhangWu()
	 * 显示查询的方式 1 所有查询   2 条件查询
	 * 接收用户的选择
	 */
	 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;
		 }
	 }
	 /*
	  * 定义方法,实现条件查询账务数据
	  * 提供用户的输入日期,开始日期结束日期
	  * 就2个日期,传递到controller层
	  * 调用controller的方法,传递2个日期参数
	  * 获取到controller查询的结果集,打印出来
	  */
	 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();
		 //调用controller层的方法,传递日期,获取查询结果集
		 List<ZhangWu> list = controller.select(startDate, endDate);
		 if(list.size()!=0)
			 print(list);
		 else
			 System.out.println("没有查询到数据");
	 }
	public void selectAll() {
		 //调用控制层中的方法,查询所有的账务数据
		 List<ZhangWu> list = controller.selectAll();
		print(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());
		 }
	}
	public void deleteZhangWu() {
		
		
	}
	public void editZhangWu() {
		
		
	}
	public void addZhangWu() {
		
		
	}
	//输出账务数据方法,接收List集合,遍历集合,输出表格
		
	
}

2. 编写ZhangWuController类中select方法

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();
	
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由试图层调用,传递两个日期的字符串
	 * 调用service层的方法,传递两个日期字符串,获取结果集
	 * 结果集返回给试图
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		return service.select(startDate, endDate);
	}
	
	/*
	 * 控制层类定义方法,实现查询所有的账务数据
	 * 方法由试图层调用,方法调用service层
	 */
	public List<ZhangWu> selectAll(){
		return service.selectAll();
	}
}

3. 编写ZhangWuService类中select方法

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();
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由控制层调用,传递2个日期字符串
	 * 调用dao层的方法,传递2个日期字符串
	 * 获取到查询结果集
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		return dao.select(startDate, endDate);
	}
	
	/*
	 *  定义方法,实现查询所有的账务数据
	 *  此方法,由控制层调用, 去调用dao层的方法
	 *  返回存储ZhangWu对象的List集合
	 */
	public List<ZhangWu> selectAll(){
		return dao.selectAll();
	}
}

4.编写ZhangWuDao类中select方法

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());
	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集合
	 * 调用者传递2个日期字符串
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		try{
			//拼写条件查询的SQL语句
			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("条件查询失败");
		}
	}
}

 运行结果:

只需要运行MainApp.java

 

3.6 添加账务

3.6.1 功能分析

1.  编写MainView类中addZhangWu方法

  • 键盘输入新添加的账务信息
  • 调用ZhangWuService类中addZhangWu方法,用来指定账务的添加
  • 添加完毕后,使用输出语句,提示“添加账务成功!”

2. 编写ZhangWuController类中addZhangWu方法

  • 调用ZhangWuService类中addZhangWu方法

3. 编写ZhangWuService类中addZhangWu方法

  • 调用ZhangWuDao类中addZhangWu方法,用来指定账务的添加

4. 编写ZhangWuDao类中addZhangWu方法

  • 通过QueryRunner对象,调用update方法更新数据库表gjp_zhangwu,完成指定账务添加到数据库表中

 

3.6.2 功能实现步骤

1. 编写MainView类中addZhangWu方法

数据库中自动增加的值,不用传递。写的时候,写默认值0即可。

//将用户输入的所有参数,封装成ZhangWu对象
ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);
/*
	 * 定义方法addZhangWu
	 * 添加账务的方法,用户在界面中选择菜单1的时候调用、
	 * 实现思想:
	 * 	  接收键盘输入,5项输入,调用controller层方法
	 */
	public void addZhangWu() {
		System.out.println("选择的添加账务功能,请输入以下内容");
		Scanner sc = new Scanner(System.in);
		System.out.println("输入分类名称");
		String flname = sc.next();
		System.out.println("输入金额");
		double money = sc.nextDouble();
		System.out.println("输入账户");
		String zhanghu = sc.next();
		System.out.println("输入日期:格式XXXX-XX-xx");
		String createtime = sc.next();
		System.out.println("输入具体描述");
		String description = sc.next();
		//将接收到的数据,调用controller层的方法,传递参数,实现数据添加
		//将用户输入的所有参数,封装成ZhangWu对象
		ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);
		controller.addZhangWu(zw);
		System.out.println("恭喜添加账务成功");
	}

 

2.编写controller中的ZhangWuController.java

传递参数(传递过来的参数不能是5个数据,传递的是一个ZhangWu类型的对象)

/*
	 * 定义方法,实现账务添加功能
	 * 由视图层调用,传递参数(传递过来的参数不能是5个数据,传递的是一个ZhangWu类型的对象)
	 * 本方法调用service层的方法,传递ZhangWu对象,获取到添加后的结果集(添加成功影响的行数,int)
	 * 
	 */
	public void addZhangWu(ZhangWu zw) {
		service.addZhangWu(zw);
	}

 

3. 编写ZhangWuService类中addZhangWu方法

/*
	 * 定义方法,实现添加账务
	 * 是由控制层调用,传递ZhangWu对象
	 */
	public void addZhangWu(ZhangWu zw) {
		dao.addZhangWu(zw);
	}

4.编写ZhangWuDao类中addZhangWu方法

/*
	 * 定义方法,实现添加账务功能
	 * 由业务层调用,传递ZhangWu对象
	 * 将ZhangWu对象中的数据,添加到数据库
	 */
	public void addZhangWu(ZhangWu zw) {
		try{
			 //拼接添加数据的sql
			String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
			//创建对象数组,处处5个占位符的实际参数
			//实际参数来源是传递过来的对象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("账务添加失败");
		}
	}

 

3.7 编辑账务

3.7.1功能分析

1.编写MainView类中editZhangWu方法

  • 键盘输入要编辑的账务信息ID号
  • 键盘输入要修改的账务信息内容
  • 调用ZhangWuService类中editZhangWu方法,用来将指定的账务信息进行更新
  • 更新完毕后,使用输出语句,提示 “编辑账务成功!”

2.编写ZhangWuController中的editZhangWu方法

3.编写ZhangWuService类中editZhangWu方法

  • 调用ZhangWuDao类中editZhangWu方法,用来将指定的账务信息进行更新

4.编写ZhangWuDao类中editZhangWu方法

  • 通过QueryRunner对象,调用update方法更新数据库表gjp_zhangwu,完成数据库表中指定账务更新操作

 

3.7.2 功能实现步骤

1. 编写MainView类中editZhangWu方法

/*
	 * 定义方法,实现对账务的编辑功能
	 * 实现思想:
	 * 	接收用户的输入的信息
	 *  封装成ZhangWu对象
	 *  调用控制层的方法,传递ZhangWu对象,实现编辑
	 * 
	 */
	public void editZhangWu() {
		//调用查询所有账务数据的功能,显示出来
		//看到所有数据,从中选择一项,进行修改
		selectAll();
		System.out.println("选择的是编辑功能,请输入数据");
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入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("输入日期:格式XXXX-XX-xx");
		String createtime = sc.next();
		System.out.println("输入具体描述");
		String description = sc.next();
		//将用户输入的数据,封装到ZhangWu对象中
		//用户输入的ID,必须封装到到对象中
		ZhangWu zw = new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
		//调用controller层中的方法,实现编辑账务
		controller.editZhangWu(zw);
		System.out.println("账务编辑成功");
	}

2.编写ZhangWuController中的editZhangWu方法

/*
	 * 定义方法,实现编辑账务功能
	 * 由视图层调用,传递参数,也是ZhangWu对象
	 * 调用service层的方法,也是ZhangWu对象
	 */
	public void editZhangWu(ZhangWu zw) {
		service.editZhangWu(zw);
	}

 

3. 编写ZhangWuService类中editZhangWu方法


	/*
	 * 定义方法,实现编辑账务
	 * 由控制层调用,传递ZhangWu对象
	 * 调用dao层的方法,传递ZhangWu对象
	 */
	public void editZhangWu(ZhangWu zw) {
		dao.editZhangWu(zw);
	}

4.编写ZhangWuDao类中editZhangWu方法

/*
	 * 定义方法,实现编辑功能
	 * 由业务层调用,传递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("编辑账务失败");
		}
		
	}

 

3.8 删除账务

3.8.1 功能分析

1. 编写MainView类中deleteZhangWu方法

  • 键盘输入要删除的账务信息ID号
  • 调用ZhangWuService类中deleteZhangWu方法,用来将指定的账务信息删除
  • 删除完毕后,使用输出语句,提示 “删除账务成功!”

2. 编写ZhangWuController 类中deleteZhangWu方法

3. 编写ZhangWuService类中deleteZhangWu方法

  • 调用ZhangWuDao类中deleteZhangWu方法,用来将指定的账务信息删除

4. 编写ZhangWuDao类中deleteZhangWu方法

  • 通过QueryRunner对象,调用update方法更新数据库表gjp_zhangwu,完成数据库表中指定账务删除操作

 

3.8.2 功能实现步骤

1. 编写MainView类中deleteZhangWu方法

/*
	 * 定义方法,实现账务删除
	 * 实现思想:
	 * 	接收用户的输入,输入一个主键数据
	 *  调用控制层方法,传递一个主键
	 */
	public void deleteZhangWu() {
		//调用查询所有账务数据的功能,显示出来
		//看到所有数据,从中选择一项,进行修改
		selectAll();
		System.out.println("选择的是删除功能,请输入序号即可");
		int zwid = new Scanner(System.in).nextInt();
		//调用控制层方法,传递主键id即可
		controller.deleteZhangWu(zwid);
		System.out.println("删除账务成功");
	}

2. 编写ZhangWuController 类中deleteZhangWu方法

/*
	 * 定义方法,实现删除功能
	 * 视图层调用,传递int类型主键
	 * 调用service层方法,传递int主键
	 */
	public void deleteZhangWu(int zwid) {
		service.deleteZhangWu(zwid);
	}

3. 编写ZhangWuService类中deleteZhangWu方法

/*
	 * 定义方法,实现删除账务功能
	 * 由控制层调用,传递主键id
	 * 调用dao层方法,传递主键id
	 */
	public void deleteZhangWu(int zwid) {
		dao.deleteZhangWu(zwid);
	}

4. 编写ZhangWuDao类中deleteZhangWu方法

/*
	 * 定义方法,实现删除业务
	 * 业务层调用,传递主键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("删除账务失败");
		}
	}

 

第四章 总结

通过分类模块功能的实现,大家可能会发现如下几个问题:

1. 难度大的地方:自行功能分析的能力欠缺,需要讲师来分析;

2. 代码实现:

  • View(Controller):代码量最大;
  • Service层:代码量最小;
  • DAO层:相似度高,难度不大;

view层的作用是“界面”,用来完成数据显示给用户。当前项目view层中,包含了Controller层代码。

Controller层的作用是“调度”,调度的是表现层view和业务层Service,主要功能分为:一是把表现层的数据交给业务层处理;二是把业务层返回的数据交给表现层显示。至于为什么这一层View(Controller)的代码量大,这里我要说明一下,其实不是View(Controller)层的代码量大,而是其他层代码量少,所以你会感觉View(Controller)层代码量大。

Service层的作用是“业务”,我们也可以把“业务”当成是“功能”。那为什么Service层代码量少呢?原因是现在我们写的项目很小,没有什么复杂的业务,而今后大家要写的大型项目代码量最大的就是Service层。

DAO层是操作数据库,现在我们使用的是commons-dbutils工具来简化JDBC,所以我们发现代码不多,比较简单。最后我们还会学习其他DAO层的工具,例如:hibernate和mybatis,他们都是JDBC的封装,用来简化JDBC。

全部代码:

app包中的MainApp.java:

package cn.itcast.gjp.app;

import cn.itcast.gjp.view.MainView;
/*
 *  主程序类,作用,开启软件程序
 */
public class MainApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MainView().run();
	}

}

view包中的MainView.java:

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;
/*
 *  视图层,用户看到和操作的界面
 *  数据传递给controller层实现
 *  成员位置,创建controller对象
 */
public class MainView {
	private ZhangWuController controller = new ZhangWuController();
	/*
	 *  实现界面效果
	 *  接收用户的输入
	 *  根据数据,调用不同的功能方法
	 */
	public void run(){
		//创建Scanner类对象,反复键盘输入
		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;
			}
		}
	}
	
	
	/*
	 * 定义方法,实现对账务的编辑功能
	 * 实现思想:
	 * 	接收用户的输入的信息
	 *  封装成ZhangWu对象
	 *  调用控制层的方法,传递ZhangWu对象,实现编辑
	 * 
	 */
	public void editZhangWu() {
		//调用查询所有账务数据的功能,显示出来
		//看到所有数据,从中选择一项,进行修改
		selectAll();
		System.out.println("选择的是编辑功能,请输入数据");
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入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("输入日期:格式XXXX-XX-xx");
		String createtime = sc.next();
		System.out.println("输入具体描述");
		String description = sc.next();
		//将用户输入的数据,封装到ZhangWu对象中
		//用户输入的ID,必须封装到到对象中
		ZhangWu zw = new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
		//调用controller层中的方法,实现编辑账务
		controller.editZhangWu(zw);
		System.out.println("账务编辑成功");
	}
	
	
	/*
	 * 定义方法 selectZhangWu()
	 * 显示查询的方式 1 所有查询   2 条件查询
	 * 接收用户的选择
	 */
	 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;
		 }
	 }
	 /*
	  * 定义方法,实现条件查询账务数据
	  * 提供用户的输入日期,开始日期结束日期
	  * 就2个日期,传递到controller层
	  * 调用controller的方法,传递2个日期参数
	  * 获取到controller查询的结果集,打印出来
	  */
	 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();
		 //调用controller层的方法,传递日期,获取查询结果集
		 List<ZhangWu> list = controller.select(startDate, endDate);
		 if(list.size()!=0)
			 print(list);
		 else
			 System.out.println("没有查询到数据");
	 }
	public void selectAll() {
		 //调用控制层中的方法,查询所有的账务数据
		 List<ZhangWu> list = controller.selectAll();
		print(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());
		 }
	}


	/*
	 * 定义方法addZhangWu
	 * 添加账务的方法,用户在界面中选择菜单1的时候调用、
	 * 实现思想:
	 * 	  接收键盘输入,5项输入,调用controller层方法
	 */
	public void addZhangWu() {
		System.out.println("选择的添加账务功能,请输入以下内容");
		Scanner sc = new Scanner(System.in);
		System.out.println("输入分类名称");
		String flname = sc.next();
		System.out.println("输入金额");
		double money = sc.nextDouble();
		System.out.println("输入账户");
		String zhanghu = sc.next();
		System.out.println("输入日期:格式XXXX-XX-xx");
		String createtime = sc.next();
		System.out.println("输入具体描述");
		String description = sc.next();
		//将接收到的数据,调用controller层的方法,传递参数,实现数据添加
		//将用户输入的所有参数,封装成ZhangWu对象
		ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);
		controller.addZhangWu(zw);
		System.out.println("恭喜添加账务成功");
	}
	//输出账务数据方法,接收List集合,遍历集合,输出表格
	/*
	 * 定义方法,实现账务删除
	 * 实现思想:
	 * 	接收用户的输入,输入一个主键数据
	 *  调用控制层方法,传递一个主键
	 */
	public void deleteZhangWu() {
		//调用查询所有账务数据的功能,显示出来
		//看到所有数据,从中选择一项,进行修改
		selectAll();
		System.out.println("选择的是删除功能,请输入序号即可");
		int zwid = new Scanner(System.in).nextInt();
		//调用控制层方法,传递主键id即可
		controller.deleteZhangWu(zwid);
		System.out.println("删除账务成功");
	}
	
}

controller包中的ZhangWuController.java 

package cn.itcast.gjp.controller;
/*
 *  控制器层
 *  接收视图层的数据,数据传递给service层
 *  成员位置,创建service对象
 */
import java.util.List;

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

public class ZhangWuController {
	private ZhangWuService service = new ZhangWuService();
	
	/*
	 * 定义方法,实现编辑账务功能
	 * 由视图层调用,传递参数,也是ZhangWu对象
	 * 调用service层的方法,也是ZhangWu对象
	 */
	public void editZhangWu(ZhangWu zw) {
		service.editZhangWu(zw);
	}
	/*
	 * 定义方法,实现删除功能
	 * 视图层调用,传递int类型主键
	 * 调用service层方法,传递int主键
	 */
	public void deleteZhangWu(int zwid) {
		service.deleteZhangWu(zwid);
	}
	/*
	 * 定义方法,实现账务添加功能
	 * 由视图层调用,传递参数(传递过来的参数不能是5个数据,传递的是一个ZhangWu类型的对象)
	 * 本方法调用service层的方法,传递ZhangWu对象,获取到添加后的结果集(添加成功影响的行数,int)
	 * 
	 */
	public void addZhangWu(ZhangWu zw) {
		service.addZhangWu(zw);
	}
	
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由试图层调用,传递两个日期的字符串
	 * 调用service层的方法,传递两个日期字符串,获取结果集
	 * 结果集返回给试图
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		return service.select(startDate, endDate);
	}
	
	/*
	 * 控制层类定义方法,实现查询所有的账务数据
	 * 方法由试图层调用,方法调用service层
	 */
	public List<ZhangWu> selectAll(){
		return service.selectAll();
	}
}

service包中的ZhangWuService.java:

package cn.itcast.gjp.service;

import java.util.List;

import cn.itcast.gjp.dao.ZhangWuDao;
import cn.itcast.gjp.domain.ZhangWu;
/*
 *  业务层类
 *  接收上一层,控制层controller的数据
 *  经过计算,传递给dao层,操作数据库
 *  调用dao层中的类,类成员位置,创建Dao类的对象
 */
public class ZhangWuService {
	private ZhangWuDao dao = new ZhangWuDao();
	
	/*
	 * 定义方法,实现删除账务功能
	 * 由控制层调用,传递主键id
	 * 调用dao层方法,传递主键id
	 */
	public void deleteZhangWu(int zwid) {
		dao.deleteZhangWu(zwid);
	}

	/*
	 * 定义方法,实现编辑账务
	 * 由控制层调用,传递ZhangWu对象
	 * 调用dao层的方法,传递ZhangWu对象
	 */
	public void editZhangWu(ZhangWu zw) {
		dao.editZhangWu(zw);
	}
	/*
	 * 定义方法,实现添加账务
	 * 是由控制层调用,传递ZhangWu对象
	 */
	public void addZhangWu(ZhangWu zw) {
		dao.addZhangWu(zw);
	}
	
	/*
	 * 定义方法,实现条件查询账务
	 * 方法由控制层调用,传递2个日期字符串
	 * 调用dao层的方法,传递2个日期字符串
	 * 获取到查询结果集
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		return dao.select(startDate, endDate);
	}
	
	/*
	 *  定义方法,实现查询所有的账务数据
	 *  此方法,由控制层调用, 去调用dao层的方法
	 *  返回存储ZhangWu对象的List集合
	 */
	public List<ZhangWu> selectAll(){
		return dao.selectAll();
	}
}

dao包中的ZhangWuDao.java:

package cn.itcast.gjp.dao;
/*
 *  实现对数据表 gjp_zhangwu 数据增删改查操作
 *  dbuils工具类完成,类成员创建QueryRunner对象,指定数据源
 */

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对象
	 * 将对象中的数据,更新到数据表
	 */
	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("删除账务失败");
		}
	}
	
	/*
	 * 定义方法,实现添加账务功能
	 * 由业务层调用,传递ZhangWu对象
	 * 将ZhangWu对象中的数据,添加到数据库
	 */
	public void addZhangWu(ZhangWu zw) {
		try{
			 //拼接添加数据的sql
			String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
			//创建对象数组,处处5个占位符的实际参数
			//实际参数来源是传递过来的对象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("账务添加失败");
		}
	}
	
	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集合
	 * 调用者传递2个日期字符串
	 */
	public List<ZhangWu> select(String startDate,String endDate){
		try{
			//拼写条件查询的SQL语句
			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("条件查询失败");
		}
	}
}

domain中的ZhangWu.java:

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(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;
	}
	public ZhangWu() {
		
	}
	@Override
	public String toString() {
		return "Zhangwu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu
				+ ", 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 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;
	}
}

tools中的JDBCUtils.java:

package cn.itcast.gjp.tools;
/*
 *  获取数据库连接的工具类
 *  实现连接池,dbcp连接池
 */
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils{
    //创建BasicDataSource对象
	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("");
		datasource.setMaxActive(10);
		datasource.setMaxIdle(5);
		datasource.setMinIdle(2);
		datasource.setInitialSize(10);
	}
	public static DataSource getDataSource(){
		return datasource;
	}
}
/*
 * private static DataSource datasource1 ;
 * datasource1= BasicDataSourceFactory.createDataSource(Properties键值对)
 * createDataSource返回值,返回的是DataSource接口实现类
 */ 

gjp.sql:

/*
  创建管家婆的数据库
  名字 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','又开资');

代码和环境配置的jar包

网盘链接:https://pan.baidu.com/s/1cZq2US675Zrc0z89il3DUw 
提取码:u41g 
 

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值