Java学习笔记51(综合项目:家庭记账系统)

javaEE的开发模式

1.什么是模式

模式在开发过程中总结出的“套路”,总结出的一套约定俗成的设计模式

2.javaEE经历的模式

model1模式:

技术组成:jsp+javaBean

model1的弊端:随着业务复杂性 导致jsp页面比较混乱

model2模式

技术组成:jsp+servlet+javaBean

model2的优点:开发中 使用各个技术擅长的方面

servlet:擅长处理java业务代码

jsp:擅长页面的现实

 

MVC:---- web开发的设计模式

M:Model---模型 javaBean:封装数据

V:View-----视图 jsp:单纯进行页面的显示

C:Controller----控制器 Servelt:获取数据--对数据进行封装--传递数据-- 指派显示的jsp页面

 

 

3.javaEE的三层架构

服务器开发时 分为三层

web层:与客户端交互

service层:复杂业务处理

dao层:与数据库进行交互

开发实践时 三层架构通过包结构体现

 

 

这个案例几乎用到了前50篇的所有内容,实现一个简易的家庭记账软件

功能:账务增删改查,按条件查询

需要的jar包:

commons-dbcp-1.4.jar

commons-pool-1.5.6.jar

mysql-connector-java-5.1.37-bin.jar

commons-dbutils-1.6.jar

 

数据库表创建:

/*
  创建数据库
  名字 gjp
*/
CREATE DATABASE gjp;

USE gjp;

CREATE TABLE gjp_zhangwu(
   -- 主键
   zwid INT PRIMARY KEY AUTO_INCREMENT,
   -- 分类名称   
   flname VARCHAR(200),
   -- 金额
   money DOUBLE,
   -- 账户
   zhanghu VARCHAR(100),
   -- 创建日期
   createtime DATE,
   -- 账务描述
   description  VARCHAR(1000)
);

加入一些数据:

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

效果:

 

 

创建工程,新建包,导入jar包,完成后结果:

 

 

 

 

domain包创建类:

保证成员变量名和表的列名一致

package 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) {
        super();
        this.zwid = zwid;
        this.flname = flname;
        this.money = money;
        this.zhanghu = zhanghu;
        this.createtime = createtime;
        this.description = 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;
    }

    @Override
    public String toString() {
        return "Zhangwu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu
                + ", createtime=" + createtime + ", description=" + description + "]";
    }

}
View Code

 

tools包创建工具类:

package gjp.tools;
//获取数据库连接的工具类

//实现DBCP连接池

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("xuyiqing");
        dataSource.setInitialSize(10);
        dataSource.setMaxActive(10);
        dataSource.setMaxIdle(5);
        dataSource.setMinIdle(1);
    }

    public static DataSource getDataSource() {
        return dataSource;
    }
}
View Code

 

app包:

package gjp.app;

import gjp.view.MainView;

//主程序类,用于开启软件程序
public class MainApp {
    public static void main(String[] args) {
        new MainView().run();
    }
}
View Code

 

view包:

package gjp.view;

import java.util.List;
import java.util.Scanner;

import gjp.controller.ZhangWuController;
import gjp.domain.Zhangwu;

public class MainView {
    // 用户看到和操作的界面
    // 数据传递给controller层实现
    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();
        System.out.println("删除功能,请输入要删除的ID");
        int zwid = new Scanner(System.in).nextInt();
        System.out.println("确定要删除吗?Y/N");
        String flag = new Scanner(System.in).next();
        if(flag.equals("Y")){
            controller.deleteZhangWu(zwid);
            System.out.println("删除账务成功!");
        }else if(flag.equals("N")){
            System.out.println("输入任意键返回");
            new Scanner(System.in).next();
            deleteZhangWu();
        }else{
            System.out.println("输入有误,输入任意键返回");
            new Scanner(System.in).next();
            deleteZhangWu();
        }
    }
    
    public void editZhangWu(){
        selectAll();
        System.out.println();
        System.out.println("编辑功能,请输入数据");
        Scanner sc = new Scanner(System.in);
        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("输入日期(格式XXXX-XX-XX):");
        String createtime = sc.next();
        System.out.println("输入具体描述");
        String description = sc.next();
        Zhangwu zw = new Zhangwu(zwid, flname, money, zhanghu, createtime, description);
        controller.editZhangWu(zw);
        System.out.println("账务编辑成功!");
    }
    
    public void addZhangWu(){
        System.out.println("添加账务功能,请输入一下内容");
        Scanner sc = new Scanner(System.in);
        System.out.println("输入分类名称:");
        String flname = sc.next();
        System.out.println("输入金额:");
        double money = sc.nextDouble();
        System.out.println("输入账户:");
        String zhanghu = sc.next();
        System.out.println("输入日期(格式XXXX-XX-XX):");
        String createtime = sc.next();
        System.out.println("输入具体描述");
        String description = sc.next();
        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;
        }
    }

    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");
        System.out.println("例如:2018-01-22");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入开始日期:");
        String startDate = sc.nextLine();
        System.out.println("请输入结束日期:");
        String endDate = sc.nextLine();
        List<Zhangwu> list = controller.select(startDate, endDate);
        if (list.size() != 0) {
            print(list);
        } else {
            System.out.println("没有查询到数据");
        }
    }

    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());
        }
    }
}
View Code

 

controller包:

package gjp.controller;

import java.util.List;

import gjp.domain.Zhangwu;
import gjp.service.ZhangWuService;

public class ZhangWuController {
    // 接收view层数据,传递给service层
    private ZhangWuService service = new ZhangWuService();
    
    public void deleteZhangWu(int zwid){
        service.deleteZhangWu(zwid);
    }
    
    public void addZhangWu(Zhangwu zw){
        service.addZhangWu(zw);
    }
    
    public void editZhangWu(Zhangwu zw){
        service.editZhangWu(zw);
    }
    
    public List<Zhangwu> select(String startDate,String endDate){
        return service.select(startDate, endDate);
    }
    
    public List<Zhangwu> selectAll(){
        return service.selectAll();
    }
    
}
View Code

 

service包:

package gjp.service;
//业务层

import java.util.List;

//接收controller的数据
//计算后传递给dao层操作数据库

import gjp.dao.ZhangWuDao;
import gjp.domain.Zhangwu;

public class ZhangWuService {
    private ZhangWuDao dao = new ZhangWuDao();
    
    public void deleteZhangWu(int zwid){
        dao.deleteZhangWu(zwid);
    }
    
    public void editZhangWu(Zhangwu zw){
        dao.editZhangWu(zw);
    }
    
    public void addZhangWu(Zhangwu zw){
        dao.addZhangWu(zw);
    }
    
    public List<Zhangwu> select(String startDate, String endDate) {
        return dao.select(startDate, endDate);
    }

    public List<Zhangwu> selectAll() {
        return dao.selectAll();
    }
}
View Code

 

dao包:

package gjp.dao;
//实现对数据库表gjp_zhangwu的增删改查操作

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;

public class ZhangWuDao {
    private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

    public void deleteZhangWu(int zwid){
        try{
        String sql = "DELETE FROM gjp_zhangwu WHERE zwid=?";
        qr.update(sql,zwid);}catch(SQLException ex){
            System.out.println(ex);
            throw new RuntimeException("删除账务失败");
        }
    }
    
    public void editZhangWu(Zhangwu zw) {
        try {
            String sql = "UPDATE gjp_zhangwu SET flname=?,money=?,zhanghu=?,createtime=?,description=? WHERE zwid=?";
            Object[] params = { zw.getFlname(), zw.getMoney(), zw.getCreatetime(), zw.getDescription(), zw.getZwid() };
            qr.update(sql, params);
        } catch (SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("账户编辑失败");
        }
    }

    public void addZhangWu(Zhangwu zw) {
        try {
            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 List<Zhangwu> select(String startDate, String endDate) {
        try {
            String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";
            Object[] params = { startDate, endDate };
            List<Zhangwu> list = qr.query(sql, new BeanListHandler<Zhangwu>(Zhangwu.class), params);
            return list;
        } catch (SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("条件查询失败");
        }
    }

    public List<Zhangwu> selectAll() {
        try {
            String sql = "SELECT * FROM gjp_zhangwu";
            List<Zhangwu> list = qr.query(sql, new BeanListHandler<Zhangwu>(Zhangwu.class));
            return list;
        } catch (SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("查询所有账务失败");
        }
    }
}
View Code

 

结构图:

 

本程序并不完整,没有包含输入的判断,使用时候保证输入正确的格式

完善它并不复杂

 

运行效果图:

 

 

 

完成

 

转载于:https://www.cnblogs.com/xuyiqing/p/8329245.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值