这个只是我的学习笔记,不是我做的小项目,很详细,给各位参考,给初学者一个大概做小项目的框架
******管家婆家庭记账小项目******
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,因为它是用来完成本项目的启动的。