Java學習筆記51(綜合項目:家庭記賬系統)

来源:https://www.cnblogs.com/xuyiqing/archive/2018/01/22/8329245.html
-Advertisement-
Play Games

這個案例幾乎用到了前50篇的所有內容,實現一個簡易的家庭記賬軟體 功能:賬務增刪改查,按條件查詢 需要的jar包: commons-dbcp-1.4.jar commons-pool-1.5.6.jar mysql-connector-java-5.1.37-bin.jar commons-dbut ...


這個案例幾乎用到了前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

 

結構圖:

 

本程式並不完整,沒有包含輸入的判斷,使用時候保證輸入正確的格式

完善它並不複雜

 

運行效果圖:

 

 

 

完成

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,放上項目github地址: https://github.com/codethereforam/java design patterns, 我是用java實現的 一、前言 題目中的這三個設計模式屬於 ,作用是為了 抽象實例化過程 。 我之前學過這三個設計模式,但最近發現又無法釐清這三個的區別了 ...
  • 什麼是設計模式?我們為什麼要學習和使用設計模式?設計模式又有哪些?這裡博主根據自己所瞭解的內容做一簡單介紹。 1、什麼是設計模式? 設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的代碼設計經驗的總結。 2、我們為什麼要學習和使用設計模式? 設計模式(Design p ...
  • 互聯網移動業務服務端系統架構設計演化------------------------------------------------------------------今天先到這兒,希望對您在系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感興趣的文章: 國際化... ...
  • 上次談到了Java的基本數據類型,今天接著聊Java的變數、運算符。 一、變數 1、變數的分類 變數分為成員變數、局部變數和常量,其中成員變數又分為實例變數、類變數。 2、變數的定義 語法:變數類型(可以是基本類型,也可以是其他) 變數名 = 變數值 英文;結尾。 2.1 可以單次聲明一個變數,也可 ...
  • 這篇文章我們開始分析LinkedHashMap的源碼,LinkedHashMap繼承了HashMap,也就是說LinkedHashMap是在HashMap的基礎上擴展而來的,因此在看LinkedHashMap源碼之前,讀者有必要先去瞭解HashMap的源碼,可以查看我上一篇文章的介紹《Java集合系 ...
  • Django視圖(一) 一、 概述 作用:視圖接受web請求,並相應請求 本質:視圖是自定義的一個python中的函數 響應內容:正常視圖,重定向視圖,錯誤視圖(404,500,400) 響應過程: 二、 url配置 配置流程 url的反向解析 三、 視圖函數 1、 概述 其本質是一個函數,一般在v ...
  • 本文主要給大家分享了Spring boot 對靜態資源的處理方式,Spring boot 預設可以訪問classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/四個目錄下的靜態資... ...
  • std::function Lambda 表達式的本質是一個函數對象。當 Lambda 表達式的捕獲列表為空時,Lambda 表達式還能夠作為一個函數指針進行傳遞,例如: #include using foo = void(int); // 定義函數指針, using 的使用見上一節中的別名語法vo... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...