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

猜你喜欢

转载自blog.csdn.net/qq_42370146/article/details/83624926