這個案例幾乎用到了前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
結構圖:
本程式並不完整,沒有包含輸入的判斷,使用時候保證輸入正確的格式
完善它並不複雜
運行效果圖:
一
二
三
完成