Java基礎之賬本小項目

1.前言

斷斷續續學習了將近兩個月吧。JavaSe基礎差不多學完了,感覺看得懂代碼,卻不知道怎麼自己寫程序,這幾天特意找了些小項目練練手。參考項目鏈接:https://blog.csdn.net/opera95/article/details/61923495 潛水這麼久第一次寫博客,如有問題還請多多指教!

2.功能實現效果圖

賬本爲字符版在控制檯輸出部分功能
在這裏插入圖片描述

Navicat界面的數據庫
在這裏插入圖片描述

3.使用技能和軟件

1.類和SQL語句的增刪減改
2.List集合
3.JDBC
4.常用類:String、Scanner
5.分類模塊功能的實現

IntelliJ IDEA19.2+Navicat12+jdk1.8+Mysql5.5
還有項目所需jar包(附百度雲盤鏈接)
在這裏插入圖片描述
鏈接: https://pan.baidu.com/s/1_oyPMbDtx7nlN9whl8eCOw 提取碼: 9917 複製這段內容後打開百度網盤手機App,操作更方便哦

4.UML圖

在這裏插入圖片描述

5.代碼

/*
主方法類---用於運行程序
 */
public class MainApp {
    public static void main(String[] args) {
        new MainView().run();
    }
}
/*

 賬務數據層類

 */
public class AccountingDao {
    //獲取數據連接池,得到操作表數據的對象QueryRunner
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

    //查詢所有賬務
    public List<Accounting> selectAll() {
        String sql = "select * from gjp_account";
        try {
            return qr.query(sql, new BeanListHandler<Accounting>(Accounting.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public List<Accounting> select(String start, String end) {
        String sql = "select * from gjp_account where createtime between ? and ?";
        Object[] params = {start, end};
        try {
            return qr.query(sql, new BeanListHandler<Accounting>(Accounting.class), params);
        } catch (SQLException e) {
           throw  new RuntimeException(e);
        }
    }
    public void addAccounting(Accounting accounting){
        String sql = "insert into gjp_account values(null,?,?,?,?,?)";
        Object[] params = {accounting.getFlname(),accounting.getMoney(),accounting.getAccounting(),accounting.getCreatetime(), accounting.getDescription()
        };
        try {
            qr.update(sql,params);
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }
    }
    public void editAccounting(Accounting accounting){
        String sql = "update gjp_account set flname = ?,money = ?,Accounting = ?,createtime = ?,description = ? where Serialnumber = ?";
        Object[] params = {accounting.getSerialnumber(),accounting.getFlname(),accounting.getMoney(),accounting.getAccounting(),accounting.getCreatetime(), accounting.getDescription()
        };
        try {
            qr.update(sql,params);
        } catch (SQLException e) {
           throw new RuntimeException(e);
        }
    }
    public void  deleteAcounting(Accounting accounting){
        String sql = "delete from gjp_account where serialnumber = ?";
        Object[] params = { accounting.getSerialnumber()};
        try {
            qr.update(sql,params);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
/*
數據庫操作
 */
public class MySQL {
    public static void main(String[] args) throws SQLException {
//        創建數據庫gjp
        String sql = "CREATE DATABASE gjp";
//            new Operate().createDataBase("CREATE DATABASE gjp");
//        設置表
        String sql1 = "create table gjp_Account(serialnumber INT PRIMARY KEY AUTO_INCREMENT,flname VARCHAR(200)," +
                "money DOUBLE,Accounting VARCHAR(100),createtime DATE,description VARCHAR(1000))";
//        導入數據
        String sql2 = "INSERT  INTO gjp_Account(serialnumber,flname,money,Accounting,createtime,description)VALUES (1,'吃飯支出',247,'交通銀行','2016-03-02','家庭聚餐')";
        String sql3 = "INSERT  INTO gjp_Account VALUES (null,'工資收入',12345,'現金','2016-03-15','開工資了')";
        String sql4 = "INSERT  INTO gjp_Account VALUES (3,'服裝支出',1998,'現金','2016-04-02','買衣服')";
        String sql5 = "INSERT  INTO gjp_Account VALUES (null,'股票收入',8000,'工商銀行','2016-04-28','股票大漲')";
        new Operate().createDataBase(sql5);



    }
}
//數據庫操作
class Operate{
//    創建數據庫
    public void createDataBase(String sql)  {
        Connection connection = null;
        PreparedStatement ps = null;
//        此處可以用try-catch-resource
        try {
//        創建數據庫連接對象
            DataSource  dataSource=  JDBCUtils.getDataSource();
//      連接對象轉型對接
            connection = dataSource.getConnection();
//         創建預編譯語句
            ps = connection.prepareStatement(sql);
            ps.execute();
            System.out.println("操作成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
//        關閉資源
            if(null!=ps){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(null!=connection){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

/*
賬務類

JavaBean是指的是Java中的類,該類中的成員變量與數據庫表中的字段相對
應(變量名對應數據庫表字段名、變量數據類型對應數據庫表字段類型),並
提供空參數構造方法、set、get方法。
 */

public class Accounting {
    private int serialnumber;//流水號
    private String flname;//分類
    private String Accounting;//賬務名稱
    private double money;//金額
    private String createtime;//創建時間
    private String description;//說明

    @Override
    public String toString() {
        return
                serialnumber + "\t\t"+
                flname + "\t\t" +
                Accounting + "\t\t" +
                money + "\t\t" +
                 createtime + "\t\t" +
                description
                ;
    }

    public int getSerialnumber() {
        return serialnumber;
    }

    public void setSerialnumber(int serialnumber) {
        this.serialnumber = serialnumber;
    }

    public String getFlname() {
        return flname;
    }

    public void setFlname(String flname) {
        this.flname = flname;
    }

    public String getAccounting() {
        return Accounting;
    }

    public void setAccounting(String accounting) {
        Accounting = accounting;
    }

    public String getCreatetime() {
        return createtime;
    }

    public void setCreatetime(String createtime) {
        this.createtime = createtime;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}


/*
賬務業務層次類
 */
public class AccountingService {
//    service層都依賴於dao層
    private AccountingDao accountingDao = new AccountingDao();
//    查詢所有
    public List<Accounting> selectAll(){
        return accountingDao.selectAll();
    }
    /**
     * 按條件查詢賬務方法
     * @param start
     * @param end
     * @return
     */
    public List<Accounting> select(String start, String end) {
        return accountingDao.select(start,end);
    }
//    增加賬務方法
    public void addAccounting(Accounting accounting){
       accountingDao.addAccounting(accounting);
    }
//    編輯功能
    public void editAccounting(Accounting accounting){
        accountingDao.editAccounting(accounting);
    }
//    刪除功能
    public void deleteAcounting(Accounting accounting){
        accountingDao.deleteAcounting(accounting);
    }

}

/*
工具類爲數據庫使用做鋪墊
 */

//導入數據類
public class JDBCUtils {
public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";//數據庫驅動
public static final String URL = "jdbc:mysql://localhost:3306/gjp";//數據庫地址
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
private static BasicDataSource dataSource = new BasicDataSource();//連接池--設置參數
static {
    dataSource.setDriverClassName(DRIVER_CLASS_NAME);
    dataSource.setUrl(URL);
    dataSource.setUsername(USERNAME);
    dataSource.setPassword(PASSWORD);
    }
//    創建數據庫連接方法
public static DataSource getDataSource(){//返回連接對象
    return dataSource;
}
//連接池不用資源關閉
}

/*
視圖框
 */
public class MainView {
    //  本項目中view依賴service
    private AccountingService accountingService = new AccountingService();

    /*
    運行方法
     */
    public void run(){
//        1,打印菜單 2,獲取用戶輸入3,調用對應方法
        boolean flag = true;
        Scanner scanner = new Scanner(System.in);
        while (flag){
            System.out.println("---------------管家婆家庭記賬軟件---------------");
            System.out.println("1.添加賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統");
            System.out.println("請輸入要操作的功能序號[1-5]:");
            int choose = scanner.nextInt();
            switch(choose){
                case 1:
                    addAccounting();
                   break;
                case 2:
                    editAccounting();
                    break;
                case 3:
                    deleteAccounting();
                    break;
                case 4:
                    selectAccounting();
                    break;
                case 5:
                    System.out.println("歡迎下次使用!拜拜!");
                    System.exit(-1);
                default:
                    System.out.println("輸入有誤,功能還在路上。。。");
            }
        }
    }
//    查詢賬務方法
    public void selectAccounting(){
        System.out.println("1.查詢所有 2.按條件查詢");
        Scanner scanner = new Scanner(System.in);
        int choose = scanner.nextInt();
        switch (choose){
            case 1:
                selectAll();
                break;
            case 2:
                select();
                break;
            default:
                System.out.println("輸入錯誤!");
        }
    }
//    選擇查詢全部
    public void selectAll(){
        List<Accounting> AccountingList = accountingService.selectAll();
        print(AccountingList);
    }
//打印方法
    private void print(List<Accounting> accountingList) {
        System.out.println("流水號\t類別\t\t賬戶\t\t金額\t\t時間\t\t說明");
        for (Accounting accounting:accountingList
             ) {
            System.out.println(accounting.toString());
        }
    }
//    按條件查詢
    public void select(){
        /*
         * 1. 獲取用戶輸入查詢日期範圍。
         * 2. 調用service的select()方法完成條件查詢功能
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入查詢起始時間:");
        String start = scanner.next();
        System.out.println("請輸入查詢結束時間:");
        String end = scanner.next();
        List<Accounting> accountingList = accountingService.select(start,end);
        print(accountingList);
    }

//    添加賬務
    public void addAccounting(){
        Scanner scanner = new Scanner(System.in);
        Accounting accounting = new Accounting();
        System.out.println("輸入類別:");
        accounting.setFlname(scanner.next());
        System.out.println("輸入賬務名:");
        accounting.setAccounting(scanner.next());
        System.out.println("請輸入金額:");
        accounting.setMoney(scanner.nextDouble());
        System.out.println("請輸入時間:");
        accounting.setCreatetime(scanner.next());
        System.out.println("請輸入備註說明:");
        accounting.setDescription(scanner.next());
        //導入賬務對象
        accountingService.addAccounting(accounting);
        System.out.println("添加成功");
    }
//    編輯賬務
    public void editAccounting(){
        Scanner scanner = new Scanner(System.in);
        Accounting accounting = new Accounting();
        System.out.println("輸入流水號:");
        accounting.setSerialnumber(scanner.nextInt());
        System.out.println("輸入類別:");
        accounting.setFlname(scanner.next());
        System.out.println("輸入賬務名:");
        accounting.setAccounting(scanner.next());
        System.out.println("請輸入金額:");
        accounting.setMoney(scanner.nextDouble());
        System.out.println("請輸入時間:");
        accounting.setCreatetime(scanner.next());
        System.out.println("請輸入備註說明:");
        accounting.setDescription(scanner.next());
        //導入賬務對象
        accountingService.editAccounting(accounting);
        System.out.println("修改成功");
    }
//    刪除賬務
    public void deleteAccounting(){
        System.out.println("請輸入要刪除的流水號");
        Scanner scanner = new Scanner(System.in);
        Accounting accounting = new Accounting();
        accounting.setSerialnumber(scanner.nextInt());
        //導入賬務對象
        accountingService.deleteAcounting(accounting);
        System.out.println("刪除成功");
    }
}

6.總結

經過一天的實訓,我在回顧舊知識點的前提下,還了解了開源免費技術的使用方式,並且認識到項目的結構化,框架化。這個項目也使我熟悉了未來工作開發流程,以學會開發項目的邏輯思維。
本項目中,有部分bug。如操作表時輸入值的判斷。小項目功能比較簡單,還可以加入的功能,利用IO流將其打印到文件中,Swing圖形界面化,運用時間類記錄操作時間等等。

發佈了9 篇原創文章 · 獲贊 7 · 訪問量 4823
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章