目錄
項目要求
開發環境搭建
工具類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文件:
1 /* 2 創建管家婆的數據庫 3 名字 gjp 4 */ 5 CREATE DATABASE gjp; 6 7 USE gjp; 8 9 /* 10 創建數據表,表名賬務 11 字段,列 12 主鍵 13 分類名稱 可變字符 14 金額 double 15 賬戶 可變字符 (支付,收入方法) 16 創建日期 date 17 賬務描述 可變字符 18 */ 19 20 CREATE TABLE gjp_zhangwu( 21 -- 主鍵 22 zwid INT PRIMARY KEY AUTO_INCREMENT, 23 -- 分類名稱 24 flname VARCHAR(200), 25 -- 金額 26 money DOUBLE, 27 -- 賬戶 28 zhanghu VARCHAR(100), 29 -- 創建日期 30 createtime DATE, 31 -- 賬務描述 32 description VARCHAR(1000) 33 ); 34 SELECT * FROM gjp_zhangwu 35 36 -- 寫入測試的數據 37 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (1,'吃飯支出',247,'交通銀行','2016-03-02','家庭聚餐'); 38 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (2,'工資收入',12345,'現金','2016-03-15','開工資了'); 39 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (3,'服裝支出',1998,'現金','2016-04-02','買衣服'); 40 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (4,'吃飯支出',325,'現金','2016-06-18','朋友聚餐'); 41 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (5,'股票收入',8000,'工商銀行','2016-10-28','股票大漲'); 42 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (6,'股票收入',5000,'工商銀行','2016-10-28','股票又大漲'); 43 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (7,'工資收入',5000,'交通銀行','2016-10-28','又開工資了'); 44 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (8,'禮金支出',5000,'現金','2016-10-28','朋友結婚'); 45 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (9,'其他支出',1560,'現金','2016-10-29','丟錢了'); 46 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (10,'交通支出',2300,'交通銀行','2016-10-29','油價還在漲啊'); 47 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (11,'吃飯支出',1000,'工商銀行','2016-10-29','又吃飯'); 48 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (12,'工資收入',1000,'現金','2016-10-30','開資'); 49 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (13,'交通支出',2000,'現金','2016-10-30','機票好貴'); 50 INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (14,'工資收入',5000,'現金','2016-10-30','又開資');

項目分層
不允許跨層調用

MainApp層
1 package gjp.app; 2 3 import gjp.view.MainView; 4 5 /* 6 * 主程序類用來啟動結束程序 7 */ 8 public class MainApp { 9 public static void main(String[] args) { 10 new MainView().run();//啟動run方法 11 } 12 }
MainView層
1 package gjp.view; 2 3 import java.util.List; 4 import java.util.Scanner; 5 6 import gjp.controller.ZhangWuController; 7 import gjp.domain.ZhangWu; 8 9 /* 10 * 視圖層,用戶操作的界面將數據傳遞給controller層實現 11 *功能實現:完成功能界面菜單顯示 12 * 接收鍵盤輸入的功能選項 13 * 根據選項值,調用對應的功能方法 14 */ 15 public class MainView { 16 private ZhangWuController controller =new ZhangWuController(); 17 Scanner sc=new Scanner(System.in); 18 public void run(){ 19 //Scanner sc=new Scanner(System.in); 20 boolean flag = true; 21 while(true){ 22 System.out.println("---------------管家婆家庭記賬軟件---------------"); 23 System.out.println("1.添加賬務 2.編輯賬務 3.刪除賬務 4.查詢賬務 5.退出系統"); 24 System.out.println("請輸入要操作的功能序號[1-5]:"); 25 int choose=sc.nextInt(); 26 switch(choose){ 27 case 1: 28 addZhangWu(); 29 break; 30 case 2: 31 editZhangWu(); 32 break; 33 case 3: 34 deleteZhangWu(); 35 break; 36 case 4: 37 selectZhangWu(); 38 break; 39 case 5: 40 System.out.println("再見!"); 41 flag = false; 42 break; 43 default: 44 System.out.println("輸入錯誤!"); 45 } 46 } 47 } 48 49 //添加賬務方法 50 public void addZhangWu(){ 51 //Scanner sc=new Scanner(System.in); 52 System.out.println("選擇的是添加賬務功能,請輸入以下內容:"); 53 System.out.println("輸入分類名稱:"); 54 String flname=sc.next();//不要使用sc.nextLine()因為輸入數據時會有空格就被下一個接收到了 55 System.out.println("輸入金額:"); 56 double money=sc.nextDouble(); 57 System.out.println("輸入賬戶:"); 58 String zhanghu =sc.next(); 59 System.out.println("請輸入日期格式為:YYYY-MM-DD"); 60 String createtime=sc.next(); 61 System.out.println("輸入具體描述:"); 62 String description=sc.next(); 63 //將用戶輸入的數據封裝成一個對象,id是沒有輸入的,也不能修改可以寫成0,其實在構造函數時也可以把id這一項刪去 64 ZhangWu zw=new ZhangWu(0, flname, money, zhanghu, createtime, description); 65 //調用comtroller層的添加方法 66 controller.addZhangWu(zw); 67 System.out.println("添加成功!"); 68 } 69 70 71 /* 72 * 查詢方法實現--1 所有查詢 2 條件查詢 73 */ 74 public void selectZhangWu() { 75 System.out.println("1.查詢所有 2.按條件查詢"); 76 Scanner in = new Scanner(System.in); 77 int choose = in.nextInt(); 78 switch (choose) { 79 case 1: 80 selectAll(); 81 break; 82 case 2: 83 select(); 84 break; 85 default: 86 System.out.println("輸入錯誤!"); 87 } 88 } 89 //全部查詢 90 public void selectAll() { 91 //調用控制層的方法查詢所有的賬務數據 92 List<ZhangWu> list =controller.selectAll(); 93 print(list); 94 } 95 /* 96 * 實現條件查詢,用戶輸入開始日期和結束日期 97 * 將兩個參數傳遞到controller層,並獲取結果集打印出來 98 */ 99 public void select(){ 100 Scanner sc=new Scanner(System.in); 101 System.out.println("選擇的為條件查詢,請輸入日期格式為:YYYY-MM-DD"); 102 System.out.println("請輸入開始日期:"); 103 String startDate=sc.nextLine(); 104 System.out.println("請輸入結束日期:"); 105 String endDate=sc.nextLine(); 106 List<ZhangWu> list =controller.select(startDate,endDate); 107 //不寫在ptrint里面是因為避免浪費 108 if(list.size()!=0) 109 print(list); 110 else 111 System.out.println("沒有查詢到數據"); 112 } 113 114 //使用快捷鍵alt+shift+m抽取方法 115 private void print(List<ZhangWu> list) { 116 //輸出表頭 117 System.out.println("ID\t\t類別\t\t賬戶\t\t金額\t\t時間\t\t說明"); 118 for(ZhangWu zw:list){ 119 System.out.println(zw.getZwid()+"\t\t"+zw.getFlname()+"\t\t"+zw.getZhanghu() + "\t\t" 120 + zw.getMoney() + "\t\t" + zw.getCreatetime() + "\t" + zw.getDescription()); 121 } 122 } 123 124 private void editZhangWu(){ 125 126 //先把所有的信息顯示出來 127 selectAll(); 128 System.out.println("選擇是編輯功能,請輸入數據"); 129 System.out.println("輸入ID"); 130 int zwid=sc.nextInt(); 131 System.out.println("輸入分類名稱:"); 132 String flname=sc.next(); 133 System.out.println("輸入金額:"); 134 double money=sc.nextDouble(); 135 System.out.println("輸入賬戶:"); 136 String zhanghu =sc.next(); 137 System.out.println("請輸入日期格式為:YYYY-MM-DD"); 138 String createtime=sc.next(); 139 System.out.println("輸入具體描述:"); 140 String description=sc.next(); 141 //將用戶輸入的數據封裝成一個對象,輸入的有id必須要封裝 142 ZhangWu zw=new ZhangWu(zwid, flname, money, zhanghu, createtime, description); 143 //調用comtroller層的添加方法 144 controller.editZhangWu(zw); 145 System.out.println("添加成功!"); 146 } 147 148 //刪除賬務 149 public void deleteZhangWu(){ 150 selectAll(); 151 System.out.println("選擇的刪除功能,請輸入需要刪除的ID:"); 152 int zwid=sc.nextInt(); 153 //調用comtroller層的刪除方法 154 controller.deletehangWu(zwid); 155 System.out.println("刪除成功!"); 156 } 157 }
ZhangWuController層
1 package gjp.controller; 2 3 import java.util.List; 4 5 import gjp.domain.ZhangWu; 6 import gjp.service.ZhangWuService; 7 8 /* 9 * 控制器層,接收視圖層數據傳遞給service層 10 */ 11 public class ZhangWuController { 12 private static ZhangWuService service=new ZhangWuService(); 13 /* 14 * 定義查詢所有賬務數據的方法由視圖層調用 15 * 去調用service層的方法 16 */ 17 public List<ZhangWu> selectAll(){ 18 return service.selectAll(); 19 } 20 //定義條件查詢 21 public List<ZhangWu> select(String startDate,String endDate){ 22 return service.select(startDate,endDate); 23 } 24 25 //添加賬務,由視圖層調用,傳遞過來的不是5個參數而是一個zhangwu對象 26 public void addZhangWu(ZhangWu zw) { 27 service.addZhangWu(zw); 28 } 29 30 //修改賬務 31 public void editZhangWu(ZhangWu zw){ 32 service.editZhangWu(zw); 33 } 34 //刪除賬務 35 public void deletehangWu(int zwid) { 36 // TODO Auto-generated method stub 37 service.deletehangWu(zwid); 38 } 39 }
ZhangWuService層
1 package gjp.service; 2 3 import java.util.List; 4 5 import gjp.dao.ZhangWuDao; 6 import gjp.domain.ZhangWu; 7 8 /* 9 * 業務層類,接收上一層controller的數據,經過計算傳遞給dao層 10 */ 11 public class ZhangWuService { 12 private static ZhangWuDao dao=new ZhangWuDao(); 13 /* 14 * 定義方法查詢所有數據,此方法由控制層調用 15 * 去調用dao層的方法 16 * 返回存儲ZhangWu對象的List集合 17 */ 18 public List<ZhangWu> selectAll(){ 19 return dao.selectAll(); 20 } 21 //定義條件查詢 22 public List<ZhangWu> select(String startDate,String endDate){ 23 return dao.select(startDate,endDate); 24 } 25 26 //添加賬務 27 public static void addZhangWu(ZhangWu zw) { 28 dao.addZhangWu(zw); 29 } 30 //編輯賬務 31 public void editZhangWu(ZhangWu zw) { 32 // TODO Auto-generated method stub 33 dao.editZhangWu(zw); 34 } 35 //刪除賬務 36 public void deletehangWu(int zwid) { 37 // TODO Auto-generated method stub 38 dao.deletehangWu(zwid); 39 } 40 }
ZhangWuDao層
1 package gjp.dao; 2 3 import java.sql.SQLException; 4 import java.util.List; 5 6 import org.apache.commons.dbutils.QueryRunner; 7 import org.apache.commons.dbutils.handlers.BeanListHandler; 8 9 import gjp.domain.ZhangWu; 10 import gjp.tools.JDBCUtils; 11 12 /* 13 * 用來實現對數據表數據的增刪該查操作 14 * 使用工具類完成QueryRunnerd對象的創建,指定數據源 15 */ 16 17 public class ZhangWuDao { 18 private QueryRunner qr= new QueryRunner(JDBCUtils.getDataSource()); 19 /* 20 * 定義方法查詢數據庫,獲取所有賬務的數據 21 * 由業務層調用 22 * 查詢到的是一個結果集將所有的賬務數據存儲到Bean對象的及集合中。 23 */ 24 public List<ZhangWu> selectAll(){ 25 try{ 26 //查詢賬務數據的SQL語句 27 String sql="select * from gjp_zhangwu"; 28 //調用qr對象的query方法,使用結果集BeanListHandler 29 List<ZhangWu> list =qr.query(sql,new BeanListHandler<>(ZhangWu.class)); 30 return list; 31 }catch(SQLException ex){ 32 System.out.println(ex); 33 throw new RuntimeException("查詢所有賬務失敗!"); 34 } 35 } 36 //條件查詢 37 public List<ZhangWu> select(String startDate,String endDate){ 38 try{ 39 //查詢賬務數據的SQL語句 40 String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?"; 41 //定義數組對象存儲問號占位符 42 Object[] params ={startDate,endDate}; 43 //調用qr對象的query方法,使用結果集BeanListHandler 44 List<ZhangWu> list =qr.query(sql,new BeanListHandler<>(ZhangWu.class),params); 45 return list; 46 }catch(SQLException ex){ 47 System.out.println(ex); 48 throw new RuntimeException("條件查詢賬務失敗!"); 49 } 50 } 51 52 //添加賬務方法 53 public void addZhangWu(ZhangWu zw) { 54 try{ 55 //獲取sql語句 56 String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)"; 57 //保存占位符參數 58 Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()}; 59 //更新數據 60 qr.update(sql, params); 61 }catch(SQLException ex) { 62 System.out.println(ex); 63 throw new RuntimeException("添加賬務失敗!"); 64 } 65 } 66 //編輯賬務 67 public void editZhangWu(ZhangWu zw) { 68 // TODO Auto-generated method stub 69 try { 70 // 修改sql語句 71 String sql = "UPDATE gjp_zhangwu SET flname=?,money=?,zhanghu=?,createtime=?,description=? WHERE zwid=?"; 72 // 存儲占位符 73 Object[] params = { zw.getFlname(), zw.getMoney(), zw.getZhanghu(), zw.getCreatetime(), zw.getDescription(),zw.getZwid() }; 74 qr.update(sql, params); 75 } catch (SQLException ex) { 76 System.out.println(ex); 77 throw new RuntimeException("編輯賬務失敗"); 78 } 79 } 80 81 public void deletehangWu(int zwid) { 82 // TODO Auto-generated method stub 83 try { 84 //刪除語句 85 String sql = "DELETE FROM gjp_zhangwu WHERE zwid=?"; 86 qr.update(sql, zwid); 87 } catch (SQLException ex) { 88 System.out.println(ex); 89 throw new RuntimeException("數據刪除失敗!"); 90 } 91 } 92 }
ZhangWu bean層
1 package gjp.domain; 2 3 /* 4 * 用來封裝信息的JavaBean,復用代碼 5 */ 6 public class ZhangWu { 7 private int zwid; 8 private String flname; 9 private double money; 10 private String zhanghu; 11 private String createtime;//把日期用字符串類型存儲方便轉換 12 private String description; 13 14 //無參構造 15 public ZhangWu(){} 16 public ZhangWu(int zwid, String flname, double money, String zhanghu, String createtime, String description) { 17 this.zwid = zwid; 18 this.flname = flname; 19 this.money = money; 20 this.zhanghu = zhanghu; 21 this.createtime = createtime; 22 this.description = description; 23 } 24 25 //生成get set方法 26 public int getZwid() { 27 return zwid; 28 } 29 public void setZwid(int zwid) { 30 this.zwid = zwid; 31 } 32 public String getFlname() { 33 return flname; 34 } 35 public void setFlname(String flname) { 36 this.flname = flname; 37 } 38 public double getMoney() { 39 return money; 40 } 41 public void setMoney(double money) { 42 this.money = money; 43 } 44 public String getZhanghu() { 45 return zhanghu; 46 } 47 public void setZhanghu(String zhanghu) { 48 this.zhanghu = zhanghu; 49 } 50 public String getCreatetime() { 51 return createtime; 52 } 53 public void setCreatetime(String createtime) { 54 this.createtime = createtime; 55 } 56 public String getDescription() { 57 return description; 58 } 59 public void setDescription(String description) { 60 this.description = description; 61 } 62 63 }
0
