java實(shí)戰(zhàn)項(xiàng)目之記賬軟件
本文給大家分享記賬軟件的實(shí)現(xiàn)代碼,一起看看吧!
1. 項(xiàng)目介紹
1.1. 項(xiàng)目安排
1.1.1. 項(xiàng)目目標(biāo)
本項(xiàng)目為JAVAEE基礎(chǔ)班綜合項(xiàng)目,包含了若干個(gè)知識(shí)點(diǎn),達(dá)到將基礎(chǔ)班所學(xué)知識(shí)綜合使用,提高了我們對(duì)項(xiàng)目的理解與知識(shí)點(diǎn)的運(yùn)用。
熟練View層、Service層、Dao層之間的方法相互調(diào)用操作、熟練dbutils操作數(shù)據(jù)庫(kù)表完成增刪改查通過(guò)本項(xiàng)目,讓我們了解公司項(xiàng)目開(kāi)發(fā)的流程,充分的掌握項(xiàng)目需求分析、設(shè)計(jì)與功能的代碼實(shí)現(xiàn)。提高同學(xué)們獨(dú)立分析需求與功能實(shí)現(xiàn)的能力。
1.1.2. 項(xiàng)目時(shí)間
本項(xiàng)目通過(guò)1天課程時(shí)間完成。
1.2. 項(xiàng)目功能分析
1.2.1. 項(xiàng)目演示
1.2.2. 項(xiàng)目功能介紹
l 查詢賬務(wù)
l 多條件組合查詢賬務(wù)
l 添加賬務(wù)
l 編輯賬務(wù)
l 刪除賬務(wù)
2. 項(xiàng)目環(huán)境搭建
2.1. 技術(shù)選型和jar包介紹
每個(gè)項(xiàng)目都要使用一些已經(jīng)成熟的技術(shù),它們通常是由一些專業(yè)組織或團(tuán)隊(duì)所提供的開(kāi)源免費(fèi)技術(shù)。在今后的學(xué)習(xí)過(guò)程中,我們會(huì)逐漸對(duì)這些專業(yè)組織有所了解。本項(xiàng)目中使用的技術(shù)如下:l apache的commons組件:Ø commons-dbutils-1.4.jar:封裝并簡(jiǎn)化了JDBC;Ø commons-dbcp-1.4.jar:apache commons提供的數(shù)據(jù)庫(kù)連接池組件,命名為DBCP;Ø commons.pool-1.3.jar:DBCP連接池依賴該jar包;l mysql-connector-java-5.1.28-bin.jar:MySQL的JDBC驅(qū)動(dòng)包,用JDBC連接MySQL數(shù)據(jù)庫(kù)必須使用該JAR包。
2.2. 工具類介紹
每個(gè)項(xiàng)目都會(huì)用到一些工具類,本項(xiàng)目也不例外。我們不會(huì)教大家如何實(shí)現(xiàn)這些類,而是讓大家知道在項(xiàng)目我們?nèi)绾问褂眠@些工具類,下面是本項(xiàng)目中所使用的工具類以及介紹:l JDBCUtils:用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)連接池對(duì)象;在項(xiàng)目的實(shí)現(xiàn)過(guò)程中,我們會(huì)說(shuō)明工具類的使用,這里就不再過(guò)多介紹。
JDBCUtils.java public class JDBCUtils { public static final StringDRIVER_CLASS_NAME ="com.mysql.jdbc.Driver"; public static final StringURL = "jdbc:mysql://localhost:3306/gjp"; public static final StringUSERNAME = "root"; public static final StringPASSWORD = "root"; private static BasicDataSourcedataSource = new BasicDataSource(); static { dataSource.setDriverClassName(DRIVER_CLASS_NAME); dataSource.setUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); } public static DataSource getDataSource() { return dataSource; } }
2.3. 數(shù)據(jù)表創(chuàng)建
對(duì)一個(gè)項(xiàng)目而言,表設(shè)計(jì)是非常重要的,因?yàn)閼?yīng)用程序中所有的操作都是基于數(shù)據(jù)庫(kù)表而進(jìn)行的,所以我們第一步就是創(chuàng)建數(shù)據(jù)庫(kù)表。管家婆項(xiàng)目的數(shù)據(jù)庫(kù)設(shè)計(jì)很簡(jiǎn)單,我們只需找到gjp.sql文件,然后執(zhí)行之即可。下面是創(chuàng)建庫(kù)及表的SQL語(yǔ)句:
2.3.1. 創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建管家婆數(shù)據(jù)庫(kù) gjpCREATE DATABASE gjp;
2.3.2. 創(chuàng)建數(shù)據(jù)庫(kù)表
創(chuàng)建賬務(wù)表gjp_zhangwu
CREATE TABLE gjp_zhangwu ( zwid INT PRIMARY KEY AUTO_INCREMENT, flname VARCHAR(200), money DOUBLE, zhangHu VARCHAR(100), createtime DATE, description VARCHAR(1000) );
2.3.3. 添加表數(shù)據(jù)
添加賬務(wù)表數(shù)據(jù)
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (1,'吃飯支出',247,'交通銀行','2016-03-02','家庭聚餐'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (2,'工資收入',12345,'現(xiàn)金','2016-03-15','開(kāi)工資了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (3,'服裝支出',1998,'現(xiàn)金','2016-04-02','買衣服'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (4,'吃飯支出',325,'現(xiàn)金','2016-06-18','朋友聚餐'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (5,'股票收入',8000,'工商銀行','2016-10-28','股票大漲'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (6,'股票收入',5000,'工商銀行','2016-10-28','股票又大漲'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (7,'工資收入',5000,'交通銀行','2016-10-28','又開(kāi)工資了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (8,'禮金支出',5000,'現(xiàn)金','2016-10-28','朋友結(jié)婚'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (9,'其他支出',1560,'現(xiàn)金','2016-10-29','丟錢了'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (10,'交通支出',2300,'交通銀行','2016-10-29','油價(jià)還在漲啊'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (11,'吃飯支出',1000,'工商銀行','2016-10-29','又吃飯'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (12,'工資收入',1000,'現(xiàn)金','2016-10-30','開(kāi)資'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (13,'交通支出',2000,'現(xiàn)金','2016-10-30','機(jī)票好貴'); INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description)VALUES (14,'工資收入',5000,'現(xiàn)金','2016-10-30','又開(kāi)資');
2.4. 項(xiàng)目分層(分包)的作用
程序?yàn)槭裁匆职謱?#63;
以顧客去飯店吃飯案例分析一下:
小飯店: 一個(gè)服務(wù)員搞定(接待顧客\點(diǎn)菜\炒菜)
大飯店:
l 迎賓員(是否有預(yù)定\詢問(wèn)吃中餐還是西餐或者燒烤等\幾位用餐 \領(lǐng)路到指定的包間\找點(diǎn)菜員為顧客點(diǎn)菜 )
l 點(diǎn)菜員(記錄顧客點(diǎn)餐內(nèi)容\記錄是否有忌口等問(wèn)題\找廚師為顧客炒菜)
l 廚師(按照顧客菜肴清單,進(jìn)行炒菜)
通過(guò)案例發(fā)現(xiàn),當(dāng)程序規(guī)模小的時(shí)候,可以一個(gè)人全部完成;但程序規(guī)模大的時(shí)候,一個(gè)人難以完成,這時(shí),要采用多人合作的方式來(lái)完成程序開(kāi)發(fā)。
多人合作方式將會(huì)碰到工作任務(wù)分配問(wèn)題,這時(shí)我們會(huì)想,每個(gè)人負(fù)責(zé)完成項(xiàng)目的一塊內(nèi)容就可以了。那么,這一塊塊內(nèi)容的劃分,就需要我們采用分層(分包)的方式完成了。
通過(guò)下圖(用戶注冊(cè)功能)來(lái)講解下,項(xiàng)目中常見(jiàn)的分層(分包)。
l view層作用:視圖層,即項(xiàng)目中的界面
l controller層作用:控制層,獲取界面上的數(shù)據(jù),為界面設(shè)置數(shù)據(jù);將要實(shí)現(xiàn)的功能交給業(yè)務(wù)層處理
l service層作用:業(yè)務(wù)層,功能的實(shí)現(xiàn),與controller控制層和數(shù)據(jù)訪問(wèn)層DAO交互,將對(duì)數(shù)據(jù)庫(kù)的操作交給DAO數(shù)據(jù)訪問(wèn)層來(lái)處理
l dao層作用:數(shù)據(jù)訪問(wèn)層,用來(lái)操作數(shù)據(jù)庫(kù)表的數(shù)據(jù)
l db數(shù)據(jù)庫(kù):這里指MySQL
l domain 實(shí)體包:存放JavaBean
l tools工具包:存放項(xiàng)目中使用到的工具類
l test 測(cè)試包:存放項(xiàng)目功能測(cè)試的代碼
2.5. 工程創(chuàng)建及包管理
1. 使用Eclipse創(chuàng)建Java工程,命名為gjp
2. 創(chuàng)建工程包
Ø cn.itcast.gjp.app:存放main方法類;
Ø cn.itcast.gjp.domain:存放JavaBean;
Ø cn.itcast.gjp.view:存放界面,及表現(xiàn)層類;
Ø cn.itcast.gjp.service:存放業(yè)務(wù)層類;
Ø cn.itcast.gjp.dao:存放數(shù)據(jù)訪問(wèn)層類;
Ø cn.itcast.gjp.tools:存放工具類
3. 創(chuàng)建lib文件夾,用來(lái)存儲(chǔ)使用的jar包
3. 功能模塊
3.1. 相關(guān)類創(chuàng)建
完成本項(xiàng)目中類的創(chuàng)建,無(wú)需在類中添加代碼。
1. 復(fù)制已編寫(xiě)好的工具類JDBCUtils.java 到 tools包中;
2. 復(fù)制jar包mysql-connector-java-5.1.28-bin.jar、commons-dbutils-1.4.jar、commons-dbcp-1.4.jar、commons-pool-1.3.jar,到lib文件夾中,通過(guò)Build Path操作,添加到classPath路徑中,提供給JDBCUtils使用;
3. 在app包中,創(chuàng)建類MainApp.java,編寫(xiě)main主方法,用來(lái)完成本項(xiàng)目的啟動(dòng)
4. 在domain包中,創(chuàng)建類ZhangWu.java,它是用來(lái)封裝賬務(wù)信息的JavaBean。
5. 在dao包中,創(chuàng)建類ZhangWuDao.java,給ZhangWuDao類添加一個(gè)成員變量QueryRunner對(duì)象,因?yàn)槲覀兪褂胐butils來(lái)操作數(shù)據(jù)庫(kù)。
6. 在service包中,創(chuàng)建類ZhangWuService.java,給ZhangWuService類添加一個(gè)類型為ZhangWuDao的成員變量,因?yàn)閟ervice依賴dao。
7. 在view包中,創(chuàng)建類MainView.java,給MainView類添加一個(gè)類型為ZhangWuService的成員變量,因?yàn)楸卷?xiàng)目中view依賴service。
編寫(xiě)app包中MainApp.java
/** * 主方法類 */ public class MainApp { public static void main(String[]args) { } }
編寫(xiě)domain包中ZhangWu.java
/** * 賬務(wù)類 */ public class ZhangWu {}
編寫(xiě)Dao包中ZhangWuDao.java
/** * 賬務(wù)數(shù)據(jù)層類 */ public class ZhangWuDao{ //獲取數(shù)據(jù)庫(kù)連接池,得到操作表數(shù)據(jù)的對(duì)象 QueryRunnerQueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); }
編寫(xiě)Service包,ZhangWuService.java
/** * 賬務(wù)業(yè)務(wù)層類 */ public class ZhangWuService { //service都依賴daoprivate ZhangWuDao zhangWuDao =new ZhangWuDao(); }
編寫(xiě)view包,
MainView.javapublic class MainView { //本項(xiàng)目中view依賴serviceprivate ZhangWuServicezhangWuService = new ZhangWuService(); }
3.2. 賬務(wù)JavaBean
JavaBean是指的是Java中的類,該類中的成員變量與數(shù)據(jù)庫(kù)表中的字段相對(duì)應(yīng)(變量名對(duì)應(yīng)數(shù)據(jù)庫(kù)表字段名、變量數(shù)據(jù)類型對(duì)應(yīng)數(shù)據(jù)庫(kù)表字段類型),并提供空參數(shù)構(gòu)造方法、set、get方法。我們現(xiàn)在來(lái)完成賬務(wù)類的代碼編寫(xiě),如下
/** * 賬務(wù)類 */ public class ZhangWu {private int zwid;// id private String flname;// 分類名稱 private String zhangHu;// 賬戶名稱 private double money;//金額 private String createtime;// 創(chuàng)建時(shí)間 private String description;// 說(shuō)明 public String getFlname() {return flname;}public void setFlname(Stringflname) {this.flname =flname;}public String getZhangHu() {return zhangHu;}public void setZhangHu(StringzhangHu) {this.zhangHu =zhangHu;} public int getZwid() {return zwid;}public void setZwid(int zwid) {this.zwid =zwid;}public double getMoney() {return money;} public void setMoney(double money) {this.money =money;}public String getCreatetime() {return createtime;} public void setCreatetime(Stringcreatetime) {this.createtime =createtime;}public String getDescription() {return description;} public void setDescription(Stringdescription) {this.description =description;}}
3.3. 功能界面菜單
界面菜單的完成,是項(xiàng)目編寫(xiě)的第一步。我們通過(guò)輸出語(yǔ)句,完成界面菜單的輸出,之后再根據(jù)輸入的功能序號(hào),進(jìn)行對(duì)應(yīng)功能的調(diào)用執(zhí)行。
3.3.1. 功能實(shí)現(xiàn)步驟
1 編寫(xiě)MainView類run方法
1.1 完成功能界面菜單顯示
1.2 接收鍵盤輸入的功能選項(xiàng)
1.3 根據(jù)選項(xiàng)值,調(diào)用對(duì)應(yīng)的功能方法
2 編寫(xiě)MainApp類的main主方法
2.1 調(diào)用MainView類中run方法,實(shí)現(xiàn)將程序執(zhí)行起來(lái),顯示功能界面菜單。
3.3.2. 功能實(shí)現(xiàn)代碼
1.在view包MainView類中編寫(xiě)run方法
/** * 運(yùn)行方法 */ public void run() { /* * 1. 打印菜單2. 獲取用戶輸入 3. 調(diào)用對(duì)應(yīng)方法 */ boolean flag =true; Scanner in = new Scanner(System.in); while (flag) { System.out.println("---------------管家婆家庭記賬軟件---------------"); System.out.println(1.添加賬務(wù) 2.編輯賬務(wù) 3.刪除賬務(wù) 4.查詢賬務(wù) 5.退出系統(tǒng)"); System.out.println("請(qǐng)輸入要操作的功能序號(hào)[1-5]:"); int op =in.nextInt(); switch (op) { case 1:addZhangWu(); break; case 2:editZhangWu(); break; case 3:deleteZhangWu(); break; case 4:selectZhangWu(); break; case 5:System.out.println("再見(jiàn)!"); flag = false; break; default:System.out.println("輸入錯(cuò)誤!");}}} 2.app包MainApp類的main主方法中,調(diào)用MainView類中run方法 public static void main(String[]args) { new MainView().run();}
3.4. 查詢所有賬務(wù)
3.4.1. 功能實(shí)現(xiàn)步驟
1 編寫(xiě)MainView類中selectZhangWu方法
1.1 通過(guò)輸出語(yǔ)句,顯示出要查詢賬務(wù)的方式
1.2 接收鍵盤的輸入項(xiàng),調(diào)用對(duì)應(yīng)的方法(1.查詢所有 2.按條件查詢)
2 編寫(xiě)MainView類中selectAll查詢所有賬務(wù)方法
2.1 調(diào)用ZhangWuService類selectAll方法,返回包含所有賬務(wù)數(shù)據(jù)的List<ZhangWu>集合
2.2 調(diào)用MainView類中print方法,實(shí)現(xiàn)控制臺(tái)顯示所有賬務(wù)數(shù)據(jù)
3 編寫(xiě)MainView類中print方法
3.1 使用輸出語(yǔ)句,打印出賬務(wù)表的表頭名稱
3.2 遍歷賬務(wù)集合,將每個(gè)賬務(wù)信息輸出打印
4 編寫(xiě)ZhangWuService類中selectAll方法
4.1 調(diào)用ZhangWuDao類中selectAll方法,返回包含所有賬務(wù)數(shù)據(jù)的List<ZhangWu>集合
5 編寫(xiě)ZhangWuDao類中selectAll()方法
5.1 通過(guò)QueryRunner對(duì)象,調(diào)用query方法查詢數(shù)據(jù)庫(kù)表gjp_zhangwu,返回包含所有賬務(wù)數(shù)據(jù)的List<ZhangWu>集合
3.4.2. 功能實(shí)現(xiàn)代碼
1. 編寫(xiě)MainView類中selectZhangWu方法
/** * 查詢賬務(wù)方法 */ public void selectZhangWu() { System.out.println("1.查詢所有 2.按條件查詢"); Scanner in = new Scanner(System.in); int op =in.nextInt(); switch (op) { case 1:selectAll(); break; case 2:select(); break; default: System.out.println("輸入錯(cuò)誤!");}}
2. 編寫(xiě)MainView類中selectAll方法
/** * 查詢所有賬務(wù)方法 */ public void selectAll() { List<ZhangWu> zhangWuList = zhangWuService.selectAll(); print(zhangWuList);}
3. 編寫(xiě)MainView類中print方法
/* * 輸出賬務(wù)方法 */private void print(List<ZhangWu>zhangWuList) { System.out.println("ID\t類別\t\t賬戶\t\t金額\t\t時(shí)間\t\t說(shuō)明"); for (ZhangWu zw : zhangWuList) { System.out.println(zw.getZwid() +"\t" + zw.getFlname() + "\t\t"+ zw.getZhangHu() + "\t\t" + zw.getMoney() + "\t\t"+ zw.getCreatetime() + "\t" + zw.getDescription());}}
4. 編寫(xiě)ZhangWuService類中selectAll方法
/** * 查詢所有 */ public List<ZhangWu> selectAll() { return zhangWuDao.selectAll();}
5. 編寫(xiě)ZhangWuDao類中selectAll()方法
/** * 查詢所有賬務(wù) */ public List<ZhangWu> selectAll() { String sql = "select * from gjp_zhangwu"; try { return qr.query(sql,new BeanListHandler<ZhangWu>(ZhangWu.class));} catch (SQLExceptione) {throw new RuntimeException(e);}}
3.5. 多條件查詢賬務(wù)
3.5.1. 功能分析
1 編寫(xiě)MainView類中select方法
1.1 通過(guò)鍵盤輸入查詢?nèi)掌诘姆秶?/p>
1.2 調(diào)用ZhangWuSerice類中select方法,返回查詢?nèi)掌诜秶鷥?nèi)的賬務(wù)信息集合List<ZhangWu>
1.3 調(diào)用MainView類中的print方法,將賬務(wù)信息集合中的內(nèi)容顯示在控制臺(tái)中
2 編寫(xiě)ZhangWuService類中select方法
2.1 調(diào)用ZhangWuDao 類中select方法,返回查詢?nèi)掌诜秶鷥?nèi)的賬務(wù)信息集合List<ZhangWu>
3 編寫(xiě)ZhangWuDao類中select方法
3.1 通過(guò)QueryRunner對(duì)象,調(diào)用query方法查詢數(shù)據(jù)庫(kù)表gjp_zhangwu,返回包含查詢?nèi)掌诜秶鷥?nèi)的賬務(wù)數(shù)據(jù)List<ZhangWu>集合
3.5.2. 功能實(shí)現(xiàn)步驟
1. 編寫(xiě)MainView類中select方法
/** * 按條件查詢賬務(wù)方法 */ public void select() {/* * 1. 獲取用戶輸入查詢?nèi)掌诜秶?* 2. 調(diào)用service的select()方法完成條件查詢功能 */ Scanner in = new Scanner(System.in); System.out.print("請(qǐng)輸入查詢起始時(shí)間:"); String start = in.next(); System.out.print("請(qǐng)輸入查詢結(jié)束時(shí)間:"); String end = in.next(); List<ZhangWu> zhangWuList = zhangWuService.select(start, end); print(zhangWuList);}
2. 編寫(xiě)ZhangWuService類中select方法
/** * 按條件查詢賬務(wù)方法 * @param start * @param end * @return */ public List<ZhangWu> select( Stringstart, String end) { return zhangWuDao.select(start,end);}
3. 編寫(xiě)ZhangWuDao類中select方法
/** * 按條件查詢賬務(wù)方法 * @param start * @param end * @return */ public List<ZhangWu> select( Stringstart, String end) { String sql = "select * from gjp_zhangwu where createtime between ? and ?"; Object[] params = {start,end}; try { return qr.query(sql,new BeanListHandler<ZhangWu>(ZhangWu.class),params);} catch (SQLExceptione) {throw new RuntimeException(e);}}
3.6. 添加賬務(wù)
3.6.1. 功能分析
1 編寫(xiě)MainView類中addZhangWu方法
1.1 鍵盤輸入新添加的賬務(wù)信息
1.2 調(diào)用ZhangWuService類中addZhangWu方法,用來(lái)指定賬務(wù)的添加
1.3 添加完畢后,使用輸出語(yǔ)句,提示“添加賬務(wù)成功!”
2 編寫(xiě)ZhangWuService類中addZhangWu方法
2.1 調(diào)用ZhangWuDao類中addZhangWu方法,用來(lái)指定賬務(wù)的添加
3 編寫(xiě)ZhangWuDao類中addZhangWu方法
3.1 通過(guò)QueryRunner對(duì)象,調(diào)用update方法更新數(shù)據(jù)庫(kù)表gjp_zhangwu,完成指定賬務(wù)添加到數(shù)據(jù)庫(kù)表中
3.6.2. 功能實(shí)現(xiàn)步驟
1. 編寫(xiě)MainView類中addZhangWu方法
/** * 添加賬務(wù)方法 */ public void addZhangWu() { /* * 1. 獲取用戶輸入,封裝到bean中。 * 2. 調(diào)用service的addZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("請(qǐng)輸入類別:"); zw.setFlname(in.next()); System.out.print("請(qǐng)輸入賬戶:"); zw.setZhangHu(in.next()); System.out.print("請(qǐng)輸入金額:"); zw.setMoney(in.nextDouble()); System.out.print("請(qǐng)輸入時(shí)間:"); zw.setCreatetime(in.next()); System.out.print("請(qǐng)輸入說(shuō)明:"); zw.setDescription(in.next());zhangWuService.addZhangWu(zw); System.out.println("添加賬務(wù)成功!");}
2. 編寫(xiě)ZhangWuService類中addZhangWu方法
/** * 添加賬務(wù) * @param zw */ public void addZhangWu(ZhangWuzw) {zhangWuDao.addZhangWu(zw);}
3. 編寫(xiě)ZhangWuDao類中addZhangWu方法
/** * 添加賬務(wù) * @param zw */ public void addZhangWu(ZhangWuzw) { String sql = "insert into gjp_zhangwu(flname,money,zhanghu,createtime,description) values(?,?,?,?,?)"; try {Object[] params = { zw.getFlname(), zw.getMoney(), zw.getZhangHu(), zw.getCreatetime(), zw.getDescription()}; qr.update(sql,params);} catch (SQLExceptione) { throw new RuntimeException(e);} }
3.7. 編輯賬務(wù)
3.7.1. 功能分析
1 編寫(xiě)MainView類中editZhangWu方法
1.1 鍵盤輸入要編輯的賬務(wù)信息ID號(hào)
1.2 鍵盤輸入要修改的賬務(wù)信息內(nèi)容
1.3 調(diào)用ZhangWuService類中editZhangWu方法,用來(lái)將指定的賬務(wù)信息進(jìn)行更新
1.4 更新完畢后,使用輸出語(yǔ)句,提示 “編輯賬務(wù)成功!”
2 編寫(xiě)ZhangWuService類中editZhangWu方法
2.1 調(diào)用ZhangWuDao類中editZhangWu方法,用來(lái)將指定的賬務(wù)信息進(jìn)行更新
3 編寫(xiě)ZhangWuDao類中editZhangWu方法
3.1 通過(guò)QueryRunner對(duì)象,調(diào)用update方法更新數(shù)據(jù)庫(kù)表gjp_zhangwu,完成數(shù)據(jù)庫(kù)表中指定賬務(wù)更新操作
3.7.2. 功能實(shí)現(xiàn)步驟
1. 編寫(xiě)MainView類中editZhangWu方法
/** * 編輯賬務(wù)方法 */ public void editZhangWu() { /* *1. 獲取用戶輸入,封裝到bean中。 *2. 調(diào)用service的editZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("請(qǐng)輸入ID:"); zw.setZwid(in.nextInt()); System.out.print("請(qǐng)輸入新類別:"); zw.setFlname(in.next()); System.out.print("請(qǐng)輸入新賬戶:"); zw.setZhangHu(in.next()); System.out.print("請(qǐng)輸入新金額:"); zw.setMoney(in.nextDouble()); System.out.print("請(qǐng)輸入新時(shí)間:"); zw.setCreatetime(in.next()); System.out.print("請(qǐng)輸入新說(shuō)明:"); zw.setDescription(in.next()); zhangWuService.editZhangWu(zw); System.out.println("編輯賬務(wù)成功!"); }
2. 編寫(xiě)ZhangWuService類中editZhangWu方法
/** * 編輯賬務(wù) * @param zw */ public void editZhangWu(ZhangWuzw) { zhangWuDao.editZhangWu(zw); }
3. 編寫(xiě)ZhangWuDao類中editZhangWu方法
/** * 編輯賬務(wù) * @param zw */ public void editZhangWu(ZhangWuzw) { String sql = "update gjp_zhangwu set flname=?, money=?,zhanghu=?,createtime=?,description=? where zwid=?"; try { Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhangHu(),zw.getCreatetime(),zw.getDescription(),zw.getZwid()}; qr.update(sql,params); } catch (SQLExceptione) { throw new RuntimeException(e); } }
3.8. 刪除賬務(wù)
3.8.1. 功能分析
1 編寫(xiě)MainView類中deleteZhangWu方法
1.1 鍵盤輸入要?jiǎng)h除的賬務(wù)信息ID號(hào)
1.2 調(diào)用ZhangWuService類中deleteZhangWu方法,用來(lái)將指定的賬務(wù)信息刪除
1.3 刪除完畢后,使用輸出語(yǔ)句,提示 “刪除賬務(wù)成功!”
2 編寫(xiě)ZhangWuService類中deleteZhangWu方法
2.1 調(diào)用ZhangWuDao類中deleteZhangWu方法,用來(lái)將指定的賬務(wù)信息刪除
3 編寫(xiě)ZhangWuDao類中deleteZhangWu方法
3.1 通過(guò)QueryRunner對(duì)象,調(diào)用update方法更新數(shù)據(jù)庫(kù)表gjp_zhangwu,完成數(shù)據(jù)庫(kù)表中指定賬務(wù)刪除操作
3.8.2. 功能實(shí)現(xiàn)步驟
1. 編寫(xiě)MainView類中deleteZhangWu方法
/** * 刪除賬務(wù)方法 */ public void deleteZhangWu() { /* * 1. 獲取用戶輸入,封裝到bean中。 * 2. 調(diào)用service的deleteZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); System.out.print("請(qǐng)輸入ID:"); zhangWuService.deleteZhangWu(in.nextInt()); System.out.println("刪除賬務(wù)成功!"); }
2. 編寫(xiě)ZhangWuService類中deleteZhangWu方法
/** * 刪除賬務(wù) * @param zwid */ public void deleteZhangWu(int zwid) { zhangWuDao.deleteZhangWu(zwid); }
3. 編寫(xiě)ZhangWuDao類中deleteZhangWu方法
/** * 刪除賬務(wù) * @param zwid */ public void deleteZhangWu(int zwid) { String sql = "delete from gjp_zhangwu where zwid=?"; try { qr.update(sql,zwid); } catch (SQLExceptione) { throw new RuntimeException(e); } }
3.9. 功能模塊總結(jié)
恭喜大家,我們已經(jīng)完成了分類模塊所有功能。通過(guò)分類模塊功能的實(shí)現(xiàn),大家可能會(huì)發(fā)現(xiàn)如下幾個(gè)問(wèn)題:
l 難度大的地方:自行功能分析的能力欠缺,需要講師來(lái)分析;
l 代碼實(shí)現(xiàn):
Ø View(Controller):代碼量最大;
Ø Service層:代碼量最小;
Ø DAO層:相似度高,難度不大;
view層的作用是“界面”,用來(lái)完成數(shù)據(jù)顯示給用戶。當(dāng)前項(xiàng)目view層中,包含了Controller層代碼。
Controller層的作用是“調(diào)度”,調(diào)度的是表現(xiàn)層view和業(yè)務(wù)層Service,主要功能分為:一是把表現(xiàn)層的數(shù)據(jù)交給業(yè)務(wù)層處理;二是把業(yè)務(wù)層返回的數(shù)據(jù)交給表現(xiàn)層顯示。至于為什么這一層View(Controller)的代碼量大,這里我要說(shuō)明一下,其實(shí)不是View(Controller)層的代碼量大,而是其他層代碼量少,所以你會(huì)感覺(jué)View(Controller)層代碼量大。
Service層的作用是“業(yè)務(wù)”,我們也可以把“業(yè)務(wù)”當(dāng)成是“功能”。那為什么Service層代碼量少呢?原因是現(xiàn)在我們寫(xiě)的項(xiàng)目很小,沒(méi)有什么復(fù)雜的業(yè)務(wù),而今后大家要寫(xiě)的大型項(xiàng)目代碼量最大的就是Service層。
DAO層是操作數(shù)據(jù)庫(kù),現(xiàn)在我們使用的是commons-dbutils工具來(lái)簡(jiǎn)化JDBC,所以我們發(fā)現(xiàn)代碼不多,比較簡(jiǎn)單。
最后我們還會(huì)學(xué)習(xí)其他DAO層的工具,例如:hibernate和mybatis,他們都是JDBC的封裝,用來(lái)簡(jiǎn)化JDBC。
到此這篇關(guān)于java實(shí)戰(zhàn)項(xiàng)目之記賬軟件的文章就介紹到這了,更多相關(guān)java編譯項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析
這篇文章主要介紹了SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11SpringBoot整合RocketMQ實(shí)現(xiàn)消息發(fā)送和接收的詳細(xì)步驟
這篇文章主要介紹了SpringBoot整合RocketMQ實(shí)現(xiàn)消息發(fā)送和接收功能,我們使用主流的SpringBoot框架整合RocketMQ來(lái)講解,使用方便快捷,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08解析Mybatis SqlSessionFactory初始化原理
本文主要介紹了Mybatis SqlSessionFactory初始化原理,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07MyBatis傳入?yún)?shù)為L(zhǎng)ist對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了MyBatis傳入?yún)?shù)為L(zhǎng)ist對(duì)象的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄及解決方案
這篇文章主要介紹了Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09SpringBoot之配置logging日志及在控制臺(tái)中輸出過(guò)程
這篇文章主要介紹了SpringBoot之配置logging日志及在控制臺(tái)中輸出過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06淺談HashMap、HashTable的key和value是否可為null
這篇文章主要介紹了淺談HashMap、HashTable的key和value是否可為null,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09springboot如何獲取request請(qǐng)求的原始url與post參數(shù)
這篇文章主要介紹了springboot如何獲取request請(qǐng)求的原始url與post參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12