目录

项目要求

开发环境搭建

工具类JDBCUtils

创建管家婆数据表

项目分层

MainApp层

MainView层

ZhangWuController层

ZhangWuService层

ZhangWuDao层

ZhangWu bean层

注:一个小技巧,写注释要空一格,要不然不容易导包进去

项目要求

开发环境搭建

mysql-connector-java-5.1.37----MySQL的JDBC驱动包,用于JDBC连接数据库。

commons-dbutils-1.6---封装并简化了JDBC的数据库操作语言

commons-dbcp-1.4------提供数据库连接池组件。

commons-pool-1.5.6-----DBCP连接池依赖该包。

工具类JDBCUtils

使用在Java数据库练习01中自己创建的JDBCUtils,一般来说对于第三方的工具类只要会使用即可。

创建管家婆数据表

gjp.sql文件:

1 /*

2 创建管家婆的数据库3 名字 gjp4 */

5 CREATE DATABASEgjp;6

7 USEgjp;8

9 /*

10 创建数据表,表名账务11 字段,列12 主键13 分类名称 可变字符14 金额 double15 账户 可变字符 (支付,收入方法)16 创建日期 date17 账务描述 可变字符18 */

19

20 CREATE TABLEgjp_zhangwu(21 --主键

22 zwid INT PRIMARY KEYAUTO_INCREMENT,23 --分类名称

24 flname VARCHAR(200),25 --金额

26 money DOUBLE,27 --账户

28 zhanghu VARCHAR(100),29 --创建日期

30 createtime DATE,31 --账务描述

32 description VARCHAR(1000)33 );34 SELECT * FROMgjp_zhangwu35

36 --写入测试的数据

37 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (1,'吃饭支出',247,'交通银行','2016-03-02','家庭聚餐');38 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (2,'工资收入',12345,'现金','2016-03-15','开工资了');39 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (3,'服装支出',1998,'现金','2016-04-02','买衣服');40 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (4,'吃饭支出',325,'现金','2016-06-18','朋友聚餐');41 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (5,'股票收入',8000,'工商银行','2016-10-28','股票大涨');42 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (6,'股票收入',5000,'工商银行','2016-10-28','股票又大涨');43 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (7,'工资收入',5000,'交通银行','2016-10-28','又开工资了');44 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (8,'礼金支出',5000,'现金','2016-10-28','朋友结婚');45 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (9,'其他支出',1560,'现金','2016-10-29','丢钱了');46 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (10,'交通支出',2300,'交通银行','2016-10-29','油价还在涨啊');47 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (11,'吃饭支出',1000,'工商银行','2016-10-29','又吃饭');48 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (12,'工资收入',1000,'现金','2016-10-30','开资');49 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (13,'交通支出',2000,'现金','2016-10-30','机票好贵');50 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (14,'工资收入',5000,'现金','2016-10-30','又开资');

项目分层

不允许跨层调用

MainApp层

1 packagegjp.app;2

3 importgjp.view.MainView;4

5 /*

6 * 主程序类用来启动结束程序7 */

8 public classMainApp {9 public static voidmain(String[] args) {10 new MainView().run();//启动run方法

11 }12 }

MainView层

1 packagegjp.view;2

3 importjava.util.List;4 importjava.util.Scanner;5

6 importgjp.controller.ZhangWuController;7 importgjp.domain.ZhangWu;8

9 /*

10 * 视图层,用户操作的界面将数据传递给controller层实现11 *功能实现:完成功能界面菜单显示12 * 接收键盘输入的功能选项13 * 根据选项值,调用对应的功能方法14 */

15 public classMainView {16 private ZhangWuController controller =newZhangWuController();17 Scanner sc=newScanner(System.in);18 public voidrun(){19 //Scanner sc=new Scanner(System.in);

20 boolean flag = true;21 while(true){22 System.out.println("---------------管家婆家庭记账软件---------------");23 System.out.println("1.添加账务 2.编辑账务 3.删除账务 4.查询账务 5.退出系统");24 System.out.println("请输入要操作的功能序号[1-5]:");25 int choose=sc.nextInt();26 switch(choose){27 case 1:28 addZhangWu();29 break;30 case 2:31 editZhangWu();32 break;33 case 3:34 deleteZhangWu();35 break;36 case 4:37 selectZhangWu();38 break;39 case 5:40 System.out.println("再见!");41 flag = false;42 break;43 default:44 System.out.println("输入错误!");45 }46 }47 }48

49 //添加账务方法

50 public voidaddZhangWu(){51 //Scanner sc=new Scanner(System.in);

52 System.out.println("选择的是添加账务功能,请输入以下内容:");53 System.out.println("输入分类名称:");54 String flname=sc.next();//不要使用sc.nextLine()因为输入数据时会有空格就被下一个接收到了

55 System.out.println("输入金额:");56 double money=sc.nextDouble();57 System.out.println("输入账户:");58 String zhanghu =sc.next();59 System.out.println("请输入日期格式为:YYYY-MM-DD");60 String createtime=sc.next();61 System.out.println("输入具体描述:");62 String description=sc.next();63 //将用户输入的数据封装成一个对象,id是没有输入的,也不能修改可以写成0,其实在构造函数时也可以把id这一项删去

64 ZhangWu zw=new ZhangWu(0, flname, money, zhanghu, createtime, description);65 //调用comtroller层的添加方法

66 controller.addZhangWu(zw);67 System.out.println("添加成功!");68 }69

70

71 /*

72 * 查询方法实现--1 所有查询 2 条件查询73 */

74 public voidselectZhangWu() {75 System.out.println("1.查询所有 2.按条件查询");76 Scanner in = newScanner(System.in);77 int choose =in.nextInt();78 switch(choose) {79 case 1:80 selectAll();81 break;82 case 2:83 select();84 break;85 default:86 System.out.println("输入错误!");87 }88 }89 //全部查询

90 public voidselectAll() {91 //调用控制层的方法查询所有的账务数据

92 List list =controller.selectAll();93 print(list);94 }95 /*

96 * 实现条件查询,用户输入开始日期和结束日期97 * 将两个参数传递到controller层,并获取结果集打印出来98 */

99 public voidselect(){100 Scanner sc=newScanner(System.in);101 System.out.println("选择的为条件查询,请输入日期格式为:YYYY-MM-DD");102 System.out.println("请输入开始日期:");103 String startDate=sc.nextLine();104 System.out.println("请输入结束日期:");105 String endDate=sc.nextLine();106 List list =controller.select(startDate,endDate);107 //不写在ptrint里面是因为避免浪费

108 if(list.size()!=0)109 print(list);110 else

111 System.out.println("没有查询到数据");112 }113

114 //使用快捷键alt+shift+m抽取方法

115 private void print(Listlist) {116 //输出表头

117 System.out.println("ID\t\t类别\t\t账户\t\t金额\t\t时间\t\t说明");118 for(ZhangWu zw:list){119 System.out.println(zw.getZwid()+"\t\t"+zw.getFlname()+"\t\t"+zw.getZhanghu() + "\t\t"

120 + zw.getMoney() + "\t\t" + zw.getCreatetime() + "\t" +zw.getDescription());121 }122 }123

124 private voideditZhangWu(){125

126 //先把所有的信息显示出来

127 selectAll();128 System.out.println("选择是编辑功能,请输入数据");129 System.out.println("输入ID");130 int zwid=sc.nextInt();131 System.out.println("输入分类名称:");132 String flname=sc.next();133 System.out.println("输入金额:");134 double money=sc.nextDouble();135 System.out.println("输入账户:");136 String zhanghu =sc.next();137 System.out.println("请输入日期格式为:YYYY-MM-DD");138 String createtime=sc.next();139 System.out.println("输入具体描述:");140 String description=sc.next();141 //将用户输入的数据封装成一个对象,输入的有id必须要封装

142 ZhangWu zw=newZhangWu(zwid, flname, money, zhanghu, createtime, description);143 //调用comtroller层的添加方法

144 controller.editZhangWu(zw);145 System.out.println("添加成功!");146 }147

148 //删除账务

149 public voiddeleteZhangWu(){150 selectAll();151 System.out.println("选择的删除功能,请输入需要删除的ID:");152 int zwid=sc.nextInt();153 //调用comtroller层的删除方法

154 controller.deletehangWu(zwid);155 System.out.println("删除成功!");156 }157 }

ZhangWuController层

1 packagegjp.controller;2

3 importjava.util.List;4

5 importgjp.domain.ZhangWu;6 importgjp.service.ZhangWuService;7

8 /*

9 * 控制器层,接收视图层数据传递给service层10 */

11 public classZhangWuController {12 private static ZhangWuService service=newZhangWuService();13 /*

14 * 定义查询所有账务数据的方法由视图层调用15 * 去调用service层的方法16 */

17 public ListselectAll(){18 returnservice.selectAll();19 }20 //定义条件查询

21 public Listselect(String startDate,String endDate){22 returnservice.select(startDate,endDate);23 }24

25 //添加账务,由视图层调用,传递过来的不是5个参数而是一个zhangwu对象

26 public voidaddZhangWu(ZhangWu zw) {27 service.addZhangWu(zw);28 }29

30 //修改账务

31 public voideditZhangWu(ZhangWu zw){32 service.editZhangWu(zw);33 }34 //删除账务

35 public void deletehangWu(intzwid) {36 //TODO Auto-generated method stub

37 service.deletehangWu(zwid);38 }39 }

ZhangWuService层

1 packagegjp.service;2

3 importjava.util.List;4

5 importgjp.dao.ZhangWuDao;6 importgjp.domain.ZhangWu;7

8 /*

9 * 业务层类,接收上一层controller的数据,经过计算传递给dao层10 */

11 public classZhangWuService {12 private static ZhangWuDao dao=newZhangWuDao();13 /*

14 * 定义方法查询所有数据,此方法由控制层调用15 * 去调用dao层的方法16 * 返回存储ZhangWu对象的List集合17 */

18 public ListselectAll(){19 returndao.selectAll();20 }21 //定义条件查询

22 public Listselect(String startDate,String endDate){23 returndao.select(startDate,endDate);24 }25

26 //添加账务

27 public static voidaddZhangWu(ZhangWu zw) {28 dao.addZhangWu(zw);29 }30 //编辑账务

31 public voideditZhangWu(ZhangWu zw) {32 //TODO Auto-generated method stub

33 dao.editZhangWu(zw);34 }35 //删除账务

36 public void deletehangWu(intzwid) {37 //TODO Auto-generated method stub

38 dao.deletehangWu(zwid);39 }40 }

ZhangWuDao层

1 packagegjp.dao;2

3 importjava.sql.SQLException;4 importjava.util.List;5

6 importorg.apache.commons.dbutils.QueryRunner;7 importorg.apache.commons.dbutils.handlers.BeanListHandler;8

9 importgjp.domain.ZhangWu;10 importgjp.tools.JDBCUtils;11

12 /*

13 * 用来实现对数据表数据的增删该查操作14 * 使用工具类完成QueryRunnerd对象的创建,指定数据源15 */

16

17 public classZhangWuDao {18 private QueryRunner qr= newQueryRunner(JDBCUtils.getDataSource());19 /*

20 * 定义方法查询数据库,获取所有账务的数据21 * 由业务层调用22 * 查询到的是一个结果集将所有的账务数据存储到Bean对象的及集合中。23 */

24 public ListselectAll(){25 try{26 //查询账务数据的SQL语句

27 String sql="select * from gjp_zhangwu";28 //调用qr对象的query方法,使用结果集BeanListHandler

29 List list =qr.query(sql,new BeanListHandler<>(ZhangWu.class));30 returnlist;31 }catch(SQLException ex){32 System.out.println(ex);33 throw new RuntimeException("查询所有账务失败!");34 }35 }36 //条件查询

37 public Listselect(String startDate,String endDate){38 try{39 //查询账务数据的SQL语句

40 String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";41 //定义数组对象存储问号占位符

42 Object[] params ={startDate,endDate};43 //调用qr对象的query方法,使用结果集BeanListHandler

44 List list =qr.query(sql,new BeanListHandler<>(ZhangWu.class),params);45 returnlist;46 }catch(SQLException ex){47 System.out.println(ex);48 throw new RuntimeException("条件查询账务失败!");49 }50 }51

52 //添加账务方法

53 public voidaddZhangWu(ZhangWu zw) {54 try{55 //获取sql语句

56 String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";57 //保存占位符参数

58 Object[] params ={zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()};59 //更新数据

60 qr.update(sql, params);61 }catch(SQLException ex) {62 System.out.println(ex);63 throw new RuntimeException("添加账务失败!");64 }65 }66 //编辑账务

67 public voideditZhangWu(ZhangWu zw) {68 //TODO Auto-generated method stub

69 try{70 //修改sql语句

71 String sql = "UPDATE gjp_zhangwu SET flname=?,money=?,zhanghu=?,createtime=?,description=? WHERE zwid=?";72 //存储占位符

73 Object[] params ={ zw.getFlname(), zw.getMoney(), zw.getZhanghu(), zw.getCreatetime(), zw.getDescription(),zw.getZwid() };74 qr.update(sql, params);75 } catch(SQLException ex) {76 System.out.println(ex);77 throw new RuntimeException("编辑账务失败");78 }79 }80

81 public void deletehangWu(intzwid) {82 //TODO Auto-generated method stub

83 try{84 //删除语句

85 String sql = "DELETE FROM gjp_zhangwu WHERE zwid=?";86 qr.update(sql, zwid);87 } catch(SQLException ex) {88 System.out.println(ex);89 throw new RuntimeException("数据删除失败!");90 }91 }92 }

ZhangWu bean层

1 packagegjp.domain;2

3 /*

4 * 用来封装信息的JavaBean,复用代码5 */

6 public classZhangWu {7 private intzwid;8 privateString flname;9 private doublemoney;10 privateString zhanghu;11 private String createtime;//把日期用字符串类型存储方便转换

12 privateString description;13

14 //无参构造

15 publicZhangWu(){}16 public ZhangWu(int zwid, String flname, doublemoney, String zhanghu, String createtime, String description) {17 this.zwid =zwid;18 this.flname =flname;19 this.money =money;20 this.zhanghu =zhanghu;21 this.createtime =createtime;22 this.description =description;23 }24

25 //生成get set方法

26 public intgetZwid() {27 returnzwid;28 }29 public void setZwid(intzwid) {30 this.zwid =zwid;31 }32 publicString getFlname() {33 returnflname;34 }35 public voidsetFlname(String flname) {36 this.flname =flname;37 }38 public doublegetMoney() {39 returnmoney;40 }41 public void setMoney(doublemoney) {42 this.money =money;43 }44 publicString getZhanghu() {45 returnzhanghu;46 }47 public voidsetZhanghu(String zhanghu) {48 this.zhanghu =zhanghu;49 }50 publicString getCreatetime() {51 returncreatetime;52 }53 public voidsetCreatetime(String createtime) {54 this.createtime =createtime;55 }56 publicString getDescription() {57 returndescription;58 }59 public voidsetDescription(String description) {60 this.description =description;61 }62

63 }

0

管家婆mysql 数据库_Java数据库小项目02--管家婆项目相关推荐

  1. java mysql开发_Java数据库开发

    Nosql数据库使用场景 首先需要确认一个问题,nosql能做什么?在现在的开发领域中nosql可以实现文档存储(BSON.JSON).缓存存储.图像缓存(图像搜索),但是对于nosql的具体应用场景 ...

  2. unity开发VR的项目02——初始项目的创建和运行(基于xr interaction toolkit和OpenXR)

    一.环境配置 1.Open XR Plugin插件导入 打开Window->Package manager,在unity Registry中找到插件OpenXR Plugin下载并导入. 找到项 ...

  3. MySQL云数据库+微信小程序+Python做项目

    MySQL云数据库+微信小程序+Python做项目 文章目录 MySQL云数据库+微信小程序+Python做项目 云数据库部分 Python连接云数据库 微信小程序连接云数据库 云数据库部分 大学生如 ...

  4. ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...

    如何把sqlserver数据迁移到mysql数据库及需要注意事项 在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Serve ...

  5. Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

    下载地址:Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端) NideShop商城(微信小程序端) 界面高仿网易严选商城(主要是2016年wap版) 测试数据采集自网易 ...

  6. 原创 【ReactJs+springBoot项目——租房】第13章:MySQL主从复制+MyCat数据库中间件+HAProxy+PXC集群

    分析目前系统架构中的数据库层存在的问题 分析MySQL数据库的集群方案 学习主从复制(读写分离)架构方案 掌握MyCat数据库中间件的使用 掌握HAProxy复制均衡的使用 掌握PXC集群的使用 多种 ...

  7. 基于微信小程序共享停车位设计与实现SSM_car.rar(项目源码+数据库文件+微信小程序开发+后端java语言)

    主要功能实现了共享车位的创建,车位的管管理,创建车辆.车辆的管理.附近车位.显示车位的编号,车位的位置,车位的状态,车位.可以查看订单记录车位.停费时间,确认时间计费的时间.可以删除,订单也可以确认是 ...

  8. mysql 手工配置_小姜学网络(MySQL数据库的手工安装与配置)附代码

    完成小姜学网络(先电IaaS云平台基本环境配置二)附带完整代码中所有内容,即先电IaaS云平台基本环境配置,或者从小姜学网络(先电IaaS云平台基本环境配置一)附带完整代码的镜像开始 涉及节点: co ...

  9. MySQL数据库从小白到小菜02

    MySQL数据库从小白到小菜02 在表中的相关操作 增加 在表中插入日期 在表中插入空值 查找(指定列查找.列运算.别名.去重.排序) 模糊查找 日期查询 空查询 条件查询 分页查询 修改(更新) 删 ...

  10. 机构数据分析培训之关于Mysql定义及数据库相关小知识

    机构数据分析培训之关于Mysql定义及数据库相关小知识 一.关于Mysql定义 MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度 ...

最新文章

  1. symfony2 Process 组件的学习笔记
  2. list删除某个元素_Python基础入门之列表(list)
  3. Timers cannot be stopped from another thread
  4. C#基础练习(时间的三连击)
  5. 在进度面前,质量该不该打折?
  6. 金士顿u盘分区工具_使用U盘工具给电脑硬盘快速分区教程
  7. JSch:Java Secure Channel -- java 代码实现 ssh 远程操作
  8. Systemd入门教程:命令篇
  9. 项目验收文档合并技巧
  10. 为了建设我们的飞鸽传书2011
  11. JSP+Servlet+C3P0+Mysql实现的azhuo商城
  12. HTML+CSS---定位(相对定位--绝对定位--固定定位--设置元素的层叠顺序)---表单---设置光标样式---透明度(opacity属性定义元素的不透明度--IE的半透明滤镜)---外边线
  13. 暑假周进度总结报告1
  14. 我可以在CSS中使用onclick效果吗?
  15. 寒冬已至,传统零售业如何打破僵局“逆境生长”
  16. 动态规划(Dynamic Programming)理论篇
  17. Java算法-堆排序
  18. 2017 ACM-ICPC Asia Shenyang (ICPC亚洲沈阳赛区)
  19. opengl编程指南
  20. linux系统开启端口命令

热门文章

  1. win10解压文件时,出错:不能创建符号链接 你可能需要以管理员权限运行Winrar 客户端没有所需的特权
  2. (八)、MultipartFile
  3. 博应用官网交互设计五个层次理论,你怎么看
  4. 如何用python进行数据处理?(一)
  5. Xmind8 Pro 最新版 破解教程(序列号|破解文件)
  6. 浏览器密码查看工具-WebBrowserPassView使用实验 ——合天网安实验室学习笔记
  7. 校园门禁app开发的功能
  8. 抠图 php中文网,ps cs3怎么抠图
  9. 工业相机选型的重要参数
  10. JDK 的下载与安装(非常详细!)