目录

项目要求

开发环境搭建

工具类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文件:

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

项目分层

不允许跨层调用

MainApp层

 package gjp.app;

 import gjp.view.MainView;

 /*
* 主程序类用来启动结束程序
*/
public class MainApp {
public static void main(String[] args) {
new MainView().run();//启动run方法
}
}

MainView层

 package gjp.view;

 import java.util.List;
import java.util.Scanner; import gjp.controller.ZhangWuController;
import gjp.domain.ZhangWu; /*
* 视图层,用户操作的界面将数据传递给controller层实现
*功能实现:完成功能界面菜单显示
* 接收键盘输入的功能选项
* 根据选项值,调用对应的功能方法
*/
public class MainView {
private ZhangWuController controller =new ZhangWuController();
Scanner sc=new Scanner(System.in);
public void run(){
//Scanner sc=new Scanner(System.in);
boolean flag = true;
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.out.println("再见!");
flag = false;
break;
default:
System.out.println("输入错误!");
}
}
} //添加账务方法
public void addZhangWu(){
//Scanner sc=new Scanner(System.in);
System.out.println("选择的是添加账务功能,请输入以下内容:");
System.out.println("输入分类名称:");
String flname=sc.next();//不要使用sc.nextLine()因为输入数据时会有空格就被下一个接收到了
System.out.println("输入金额:");
double money=sc.nextDouble();
System.out.println("输入账户:");
String zhanghu =sc.next();
System.out.println("请输入日期格式为:YYYY-MM-DD");
String createtime=sc.next();
System.out.println("输入具体描述:");
String description=sc.next();
//将用户输入的数据封装成一个对象,id是没有输入的,也不能修改可以写成0,其实在构造函数时也可以把id这一项删去
ZhangWu zw=new ZhangWu(0, flname, money, zhanghu, createtime, description);
//调用comtroller层的添加方法
controller.addZhangWu(zw);
System.out.println("添加成功!");
} /*
* 查询方法实现--1 所有查询 2 条件查询
*/
public void selectZhangWu() {
System.out.println("1.查询所有 2.按条件查询");
Scanner in = new Scanner(System.in);
int choose = in.nextInt();
switch (choose) {
case 1:
selectAll();
break;
case 2:
select();
break;
default:
System.out.println("输入错误!");
}
}
//全部查询
public void selectAll() {
//调用控制层的方法查询所有的账务数据
List<ZhangWu> list =controller.selectAll();
print(list);
}
/*
* 实现条件查询,用户输入开始日期和结束日期
* 将两个参数传递到controller层,并获取结果集打印出来
*/
public void select(){
Scanner sc=new Scanner(System.in);
System.out.println("选择的为条件查询,请输入日期格式为:YYYY-MM-DD");
System.out.println("请输入开始日期:");
String startDate=sc.nextLine();
System.out.println("请输入结束日期:");
String endDate=sc.nextLine();
List<ZhangWu> list =controller.select(startDate,endDate);
//不写在ptrint里面是因为避免浪费
if(list.size()!=0)
print(list);
else
System.out.println("没有查询到数据");
} //使用快捷键alt+shift+m抽取方法
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());
}
} private void editZhangWu(){ //先把所有的信息显示出来
selectAll();
System.out.println("选择是编辑功能,请输入数据");
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("请输入日期格式为:YYYY-MM-DD");
String createtime=sc.next();
System.out.println("输入具体描述:");
String description=sc.next();
//将用户输入的数据封装成一个对象,输入的有id必须要封装
ZhangWu zw=new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
//调用comtroller层的添加方法
controller.editZhangWu(zw);
System.out.println("添加成功!");
} //删除账务
public void deleteZhangWu(){
selectAll();
System.out.println("选择的删除功能,请输入需要删除的ID:");
int zwid=sc.nextInt();
//调用comtroller层的删除方法
controller.deletehangWu(zwid);
System.out.println("删除成功!");
}
}

ZhangWuController层

 package gjp.controller;

 import java.util.List;

 import gjp.domain.ZhangWu;
import gjp.service.ZhangWuService; /*
* 控制器层,接收视图层数据传递给service层
*/
public class ZhangWuController {
private static ZhangWuService service=new ZhangWuService();
/*
* 定义查询所有账务数据的方法由视图层调用
* 去调用service层的方法
*/
public List<ZhangWu> selectAll(){
return service.selectAll();
}
//定义条件查询
public List<ZhangWu> select(String startDate,String endDate){
return service.select(startDate,endDate);
} //添加账务,由视图层调用,传递过来的不是5个参数而是一个zhangwu对象
public void addZhangWu(ZhangWu zw) {
service.addZhangWu(zw);
} //修改账务
public void editZhangWu(ZhangWu zw){
service.editZhangWu(zw);
}
//删除账务
public void deletehangWu(int zwid) {
// TODO Auto-generated method stub
service.deletehangWu(zwid);
}
}

ZhangWuService层

 package gjp.service;

 import java.util.List;

 import gjp.dao.ZhangWuDao;
import gjp.domain.ZhangWu; /*
* 业务层类,接收上一层controller的数据,经过计算传递给dao层
*/
public class ZhangWuService {
private static ZhangWuDao dao=new ZhangWuDao();
/*
* 定义方法查询所有数据,此方法由控制层调用
* 去调用dao层的方法
* 返回存储ZhangWu对象的List集合
*/
public List<ZhangWu> selectAll(){
return dao.selectAll();
}
//定义条件查询
public List<ZhangWu> select(String startDate,String endDate){
return dao.select(startDate,endDate);
} //添加账务
public static void addZhangWu(ZhangWu zw) {
dao.addZhangWu(zw);
}
//编辑账务
public void editZhangWu(ZhangWu zw) {
// TODO Auto-generated method stub
dao.editZhangWu(zw);
}
//删除账务
public void deletehangWu(int zwid) {
// TODO Auto-generated method stub
dao.deletehangWu(zwid);
}
}

ZhangWuDao层

 package gjp.dao;

 import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler; import gjp.domain.ZhangWu;
import gjp.tools.JDBCUtils; /*
* 用来实现对数据表数据的增删该查操作
* 使用工具类完成QueryRunnerd对象的创建,指定数据源
*/ public class ZhangWuDao {
private QueryRunner qr= new QueryRunner(JDBCUtils.getDataSource());
/*
* 定义方法查询数据库,获取所有账务的数据
* 由业务层调用
* 查询到的是一个结果集将所有的账务数据存储到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("查询所有账务失败!");
}
}
//条件查询
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方法,使用结果集BeanListHandler
List<ZhangWu> list =qr.query(sql,new BeanListHandler<>(ZhangWu.class),params);
return list;
}catch(SQLException ex){
System.out.println(ex);
throw new RuntimeException("条件查询账务失败!");
}
} //添加账务方法
public void addZhangWu(ZhangWu zw) {
try{
//获取sql语句
String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
//保存占位符参数
Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()};
//更新数据
qr.update(sql, params);
}catch(SQLException ex) {
System.out.println(ex);
throw new RuntimeException("添加账务失败!");
}
}
//编辑账务
public void editZhangWu(ZhangWu zw) {
// TODO Auto-generated method stub
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(sql, params);
} catch (SQLException ex) {
System.out.println(ex);
throw new RuntimeException("编辑账务失败");
}
} public void deletehangWu(int zwid) {
// TODO Auto-generated method stub
try {
//删除语句
String sql = "DELETE FROM gjp_zhangwu WHERE zwid=?";
qr.update(sql, zwid);
} catch (SQLException ex) {
System.out.println(ex);
throw new RuntimeException("数据删除失败!");
}
}
}

ZhangWu bean层

 package gjp.domain;

 /*
* 用来封装信息的JavaBean,复用代码
*/
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;
} //生成get set方法
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;
} }

0

Java数据库小项目02--管家婆项目的更多相关文章

  1. Java数据库小项目01--实现用户登录注册

    先实现数据库和数据表,检测正常后再做其他的 CREATE TABLE users( username ) NOT NULL, PASSWORD ) NOT NULL); INSERT INTO use ...

  2. Java数据库小项目00---基础知识

    目录 JDBC的简单使用 向JDBC注入攻击 防止注入攻击 自建JDBC工具类 自建工具类优化--使用配置文件 使用数据库连接池优化工具类 JDBC的简单使用 package Test; import ...

  3. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  4. Java 9终于要包含Jigsaw项目了

    当Jigsaw在Java 9中最终发布时,这个项目的历史已经超过八年了. 转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/180.html? ...

  5. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  6. HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问

    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问 代码下载地址: http://download.csdn.net/detail/poiuy19 ...

  7. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  8. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  9. java项目获取根路径(web项目和application项目的区分)

    Java项目中经常要读取配置文件,涉及到读取配置文件的地方,就会要读定位文件的路径.因此,在项目如何正确获取文件路径尤为关键. 根据不同的java项目,在获取文件路径时候有一些 小区别 测试环境:E: ...

随机推荐

  1. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  2. BurpSuite 爆破网页后台登陆

    由于 Burp Suite是由Java语言编写而成,所以你需要首先安装JAVA的运行环境,而Java自身的跨平台性,使得软件几乎可以在任何平台上使用.Burp Suite不像其他的自动化测试工具,它需 ...

  3. MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...

  4. C语言如何才能使用bool类型

    解决办法:加上头文件#include<stdbool.h> ,就可以直接使用类型bool = true/false; #include<stdio.h> 2 #include& ...

  5. 微信小程使用getCurrentPages函数操作父级数据

    微信小程使用getCurrentPages函数操作父级数据 let pages = getCurrentPages(); let prevPage = pages[pages.length - 2]; ...

  6. SpringBoot项目的限流

    开发访问量比较大的系统是,爬虫的目的就是解决访问量大的问题:缓存穿透是为了保护后端数据库查询服务:计数服务解决了接近真实访问量以及数据库服务的压力. 架构图 限流 就拿十万博客来说,如果存在热点文章, ...

  7. 【php设计模式】建造者模式

    <?php /** *建造者模式特点: * 1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象. * 2.每一个具体建造者都相对独立, ...

  8. 关于Highcharts数据量超过1000时无法显示问题

    今天在vue的项目中引入Highcharts,想做一个大数据量的实时刷新曲线图,发现当数据量超过1000就无法显示. 经过排查发现 Highcharts为了保证更好的性能设置了一个性能阈值检查,当数据 ...

  9. web储存的初级运用

    <html> <head> <meta charset="utf-8"> <title>web存储</title>< ...

  10. 使用pycharm 编写代码 并在远程主机上运行

    一 要求 远程主机有python解释器 二 在菜单栏,File -> Settings… -> Project ×× -> Project Interpreter,点击右侧 Add按 ...