Java数据库练习02--管家婆项目
Posted windy杨树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java数据库练习02--管家婆项目相关的知识,希望对你有一定的参考价值。
目录
项目要求
开发环境搭建
工具类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 名字 gjp 4 */ 5 CREATE DATABASE gjp; 6 7 USE gjp; 8 9 /* 10 创建数据表,表名账务 11 字段,列 12 主键 13 分类名称 可变字符 14 金额 double 15 账户 可变字符 (支付,收入方法) 16 创建日期 date 17 账务描述 可变字符 18 */ 19 20 CREATE TABLE gjp_zhangwu( 21 -- 主键 22 zwid INT PRIMARY KEY AUTO_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 * FROM gjp_zhangwu 35 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 package gjp.app; 2 3 import gjp.view.MainView; 4 5 /* 6 * 主程序类用来启动结束程序 7 */ 8 public class MainApp { 9 public static void main(String[] args) { 10 new MainView().run();//启动run方法 11 } 12 }
MainView层
1 package gjp.view; 2 3 import java.util.List; 4 import java.util.Scanner; 5 6 import gjp.controller.ZhangWuController; 7 import gjp.domain.ZhangWu; 8 9 /* 10 * 视图层,用户操作的界面将数据传递给controller层实现 11 *功能实现:完成功能界面菜单显示 12 * 接收键盘输入的功能选项 13 * 根据选项值,调用对应的功能方法 14 */ 15 public class MainView { 16 private ZhangWuController controller =new ZhangWuController(); 17 Scanner sc=new Scanner(System.in); 18 public void run(){ 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 void addZhangWu(){ 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 void selectZhangWu() { 75 System.out.println("1.查询所有 2.按条件查询"); 76 Scanner in = new Scanner(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 void selectAll() { 91 //调用控制层的方法查询所有的账务数据 92 List<ZhangWu> list =controller.selectAll(); 93 print(list); 94 } 95 /* 96 * 实现条件查询,用户输入开始日期和结束日期 97 * 将两个参数传递到controller层,并获取结果集打印出来 98 */ 99 public void select(){ 100 Scanner sc=new Scanner(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<ZhangWu> 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(List<ZhangWu> list) { 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 void editZhangWu(){ 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=new ZhangWu(zwid, flname, money, zhanghu, createtime, description); 143 //调用comtroller层的添加方法 144 controller.editZhangWu(zw); 145 System.out.println("添加成功!"); 146 } 147 148 //删除账务 149 public void deleteZhangWu(){ 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 package gjp.controller; 2 3 import java.util.List; 4 5 import gjp.domain.ZhangWu; 6 import gjp.service.ZhangWuService; 7 8 /* 9 * 控制器层,接收视图层数据传递给service层 10 */ 11 public class ZhangWuController { 12 private static ZhangWuService service=new ZhangWuService(); 13 /* 14 * 定义查询所有账务数据的方法由视图层调用 15 * 去调用service层的方法 16 */ 17 public List<ZhangWu> selectAll(){ 18 return service.selectAll(); 19 } 20 //定义条件查询 21 public List<ZhangWu> select(String startDate,String endDate){ 22 return service.select(startDate,endDate); 23 } 24 25 //添加账务,由视图层调用,传递过来的不是5个参数而是一个zhangwu对象 26 public void addZhangWu(ZhangWu zw) { 27 service.addZhangWu(zw); 28 } 29 30 //修改账务 31 public void editZhangWu(ZhangWu zw){ 32 service.editZhangWu(zw); 33 } 34 //删除账务 35 public void deletehangWu(int zwid) { 36 // TODO Auto-generated method stub 37 service.deletehangWu(zwid); 38 } 39 }
ZhangWuService层
1 package gjp.service; 2 3 import java.util.List; 4 5 import gjp.dao.ZhangWuDao; 6 import gjp.domain.ZhangWu; 7 8 /* 9 * 业务层类,接收上一层controller的数据,经过计算传递给dao层 10 */ 11 public class ZhangWuService { 12 private static ZhangWuDao dao=new ZhangWuDao(); 13 /* 14 * 定义方法查询所有数据,此方法由控制层调用 15 * 去调用dao层的方法 16 * 返回存储ZhangWu对象的List集合 17 */ 18 public List<ZhangWu> selectAll(){ 19 return dao.selectAll(); 20 } 21 //定义条件查询 22 public List<ZhangWu> select(String startDate,String endDate){ 23 return dao.select(startDate,endDate); 24 } 25 26 //添加账务 27 public static void addZhangWu(ZhangWu zw) { 28 dao.addZhangWu(zw); 29 } 30 //编辑账务 31 public void editZhangWu(ZhangWu zw) { 32 // TODO Auto-generated method stub 33 dao.editZhangWu(zw); 34 } 35 //删除账务 36 public void deletehangWu(int zwid) { 37 // TODO Auto-generated method stub 38 dao.deletehangWu(zwid); 39 } 40 }
ZhangWuDao层
1 package gjp.dao; 2 3 import java.sql.SQLException; 4 import java.util.List; 5 6 import org.apache.commons.dbutils.QueryRunner; 7 import org.apache.commons.dbutils.handlers.BeanListHandler; 8 9 import gjp.domain.ZhangWu; 10 import gjp.tools.JDBCUtils; 11 12 /* 13 * 用来实现对数据表数据的增删该查操作 14 * 使用工具类完成QueryRunnerd对象的创建,指定数据源 15 */ 16 17 public class ZhangWuDao { 18 private QueryRunner qr= new QueryRunner(JDBCUtils.getDataSource()); 19 /* 20 * 定义方法查询数据库,获取所有账务的数据 21 * 由业务层调用 22 * 查询到的是一个结果集将所有的账务数据存储到Bean对象的及集合中。 23 */ 24 public List<ZhangWu> selectAll(){ 25 try{ 26 //查询账务数据的SQL语句 27 String sql="select * from gjp_zhangwu"; 28 //调用qr对象的query方法,使用结果集BeanListHandler 29 List<ZhangWu> list =qr.query(sql,new BeanListHandler<>(ZhangWu.class)); 30 return list; VSCode自定义代码片段13——Vue的状态大管家