Java基礎學習筆記二十八 管家婆綜合項目


本項目為JAVA基礎綜合項目,主要包括:

熟練View層、Service層、Dao層之間的方法相互調用操作、熟練dbutils操作數據庫表完成增刪改查。

項目功能分析

 

  •  查詢賬務
  • 多條件組合查詢賬務
  • 添加賬務
  • 編輯賬務
  • 刪除賬務

項目環境搭建

技術選型和jar包介紹

每個項目都要使用一些已經成熟的技術,它們通常是由一些專業組織或團隊所提供的開源免費技術。在今后的學習過程中,我們會逐漸對這些專業組織有所了解。本項目中使用的技術如下:

apache的commons組件:

  • commons-dbutils-1.6.jar:封裝並簡化了JDBC;
  • commons-dbcp-1.4.jar:apache commons提供的數據庫連接池組件,命名為DBCP;
  • commons.pool-1.5.6.jar:DBCP連接池依賴該jar包;

mysql-connector-java-5.1.7-bin.jar:MySQL的JDBC驅動包,用JDBC連接MySQL數據庫必須使用該JAR包。

工具類介紹

每個項目都會用到一些工具類,本項目也不例外。我們不會教大家如何實現這些類,而是讓大家知道在項目我們如何使用這些工具類,下面是本項目中所使用的工具類以及介紹:

JDBCUtils:用來創建數據庫連接池對象;不懂請移步這里

JDBCUtils.java

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 = "123456";
    
    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;
    }
}

數據表創建

對一個項目而言,表設計是非常重要的,因為應用程序中所有的操作都是基於數據庫表而進行的,所以我們第一步就是創建數據庫表。管家婆項目的數據庫設計很簡單,下面是創建庫及表的SQL語句:

/*
  創建管家婆的數據庫
  名字 gjp
*/
CREATE DATABASE gjp;

USE gjp;

/*
  創建數據表,表名賬務
  字段,列
  主鍵
  分類名稱  可變字符
  金額  double
  賬戶  可變字符 (支付,收入方法)
  創建日期 date
  賬務描述 可變字符
*/

CREATE TABLE gjp_zhangwu(
   -- 主鍵
   zwid INT PRIMARY KEY AUTO_INCREMENT,
   -- 分類名稱   
   flname VARCHAR(200),
   -- 金額
   money DOUBLE,
   -- 賬戶
   zhanghu VARCHAR(100),
   -- 創建日期
   createtime DATE,
   -- 賬務描述
   description  VARCHAR(1000)
);
SELECT * FROM gjp_zhangwu

-- 寫入測試的數據
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,'現金','2016-03-15','開工資了');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (3,'服裝支出',1998,'現金','2016-04-02','買衣服');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (4,'吃飯支出',325,'現金','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','又開工資了');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (8,'禮金支出',5000,'現金','2016-10-28','朋友結婚');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (9,'其他支出',1560,'現金','2016-10-29','丟錢了');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (10,'交通支出',2300,'交通銀行','2016-10-29','油價還在漲啊');
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,'現金','2016-10-30','開資');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (13,'交通支出',2000,'現金','2016-10-30','機票好貴');
INSERT  INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (14,'工資收入',5000,'現金','2016-10-30','又開資');

項目分層(分包)的作用

程序為什么要分包分層?

以顧客去飯店吃飯案例分析一下:

小飯店: 一個服務員搞定(接待顧客\點菜\炒菜)

大飯店:

  • 迎賓員(是否有預定\ 詢問吃中餐還是西餐或者燒烤等\ 幾位用餐 \ 領路到指定的包間\ 找點菜員為顧客點菜 )
  • 點菜員(記錄顧客點餐內容\ 記錄是否有忌口等問題\ 找廚師為顧客炒菜)
  • 廚師(按照顧客菜餚清單,進行炒菜)

通過案例發現,當程序規模小的時候,可以一個人全部完成;但程序規模大的時候,一個人難以完成,這時,要采用多人合作的方式來完成程序開發。多人合作方式將會碰到工作任務分配問題,這時我們會想,每個人負責完成項目的一塊內容就可以了。那么,這一塊塊內容的划分,就需要我們采用分層(分包)的方式完成了。

通過下圖(用戶注冊功能)來講解下,項目中常見的分層(分包)。

view層作用: 視圖層,即項目中的界面

controller層作用: 控制層, 獲取界面上的數據,為界面設置數據; 將要實現的功能交給業務層處理

service層作用: 業務層, 功能的實現, 與controller控制層和數據訪問層DAO交互, 將對數據庫的操作交給DAO數據訪問層來處理

dao層作用: 數據訪問層, 用來操作數據庫表的數據

db數據庫: 這里指MySQL

domain 實體包: 存放JavaBean

tools工具包:存放項目中使用到的工具類

test 測試包: 存放項目功能測試的代碼

工程創建及包管理

  • 使用 IntelliJ IDEA創建Java工程,命名為gjp
  • 創建工程包

cn.itcast.gjp.app: 存放main方法類; 

cn.itcast.gjp.domain: 存放JavaBean; 

cn.itcast.gjp.view: 存放界面,及表現層類; 

cn.itcast.gjp.service: 存放業務層類; 

cn.itcast.gjp.dao: 存放數據訪問層類; 

cn.itcast.gjp.tools:存放工具類

  • 創建lib文件夾,用來存儲使用的jar包

 

把jar包拷貝到lib目錄下,並

選擇Dependencies——>點擊+按鈕——>選擇JARS or dirretories...

選擇jar包——>OK

Apply——>OK

功能模塊

相關類創建

完成本項目中類的創建,無需在類中添加代碼。

復制已編寫好的工具類JDBCUtils.java 到 tools包中;

package cn.itcast.gjp.tools;
/*
 *  使用DBCP實現數據庫的連接池
 *  連接池配置,自定義類,
 *  最基本四項完整
 *  對於數據庫連接池其他配置,自定義
 */

import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;

public class JDBCUtils {
    //創建出BasicDataSource類對象
    private static BasicDataSource datasource = new BasicDataSource();

    //靜態代碼塊,對象BasicDataSource對象中的配置,自定義
    static {
        //數據庫連接信息,必須的
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUrl("jdbc:mysql://localhost:3306/gjp");
        datasource.setUsername("root");
        datasource.setPassword("123456");
        //對象連接池中的連接數量配置,可選的
        datasource.setInitialSize(10);//初始化的連接數
        datasource.setMaxActive(8);//最大連接數量
        datasource.setMaxIdle(5);//最大空閑數
        datasource.setMinIdle(1);//最小空閑
    }

    //定義靜態方法,返回BasicDataSource類的對象
    public static DataSource getDataSource() {
        return datasource;
    }
}
JDBCUtils

在app包中,創建類MainApp.java,編寫main主方法,用來完成本項目的啟動

package cn.itcast.gjp.app;

/**
 * 程序入口
 */
public class MainApp {
    public static void main(String[] args) {
        
    }
}
MainApp

在domain包中,創建類ZhangWu.java,它是用來封裝賬務信息的JavaBean。

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

我們現在來完成賬務類的代碼編寫,如下:

package cn.itcast.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(int zwid, String flname, double money, String zhanghu, String createtime, String description) {
        this.zwid = zwid;
        this.flname = flname;
        this.money = money;
        this.zhanghu = zhanghu;
        this.createtime = createtime;
        this.description = description;
    }
    public ZhangWu() {

    }
    @Override
    public String toString() {
        return "Zhangwu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu
                + ", createtime=" + createtime + ", 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;
    }
}
ZhangWu

在dao包中,創建類ZhangWuDao.java,給ZhangWuDao類添加一個成員變量QueryRunner對象,因為我們使用dbutils來操作數據庫。

package cn.itcast.gjp.dao;

import cn.itcast.gjp.tools.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;

/**
 *  實現對數據表 gjp_zhangwu 數據增刪改查操作
 *  dbuils工具類完成,類成員創建QueryRunner對象,指定數據源
 **/
public class ZhangWuDao {
    private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
}
ZhangWuDao

在service包中,創建類ZhangWuService.java,給ZhangWuService類添加一個類型為ZhangWuDao的成員變量,因為service依賴dao。

package cn.itcast.gjp.service;

import cn.itcast.gjp.dao.ZhangWuDao;

/**
 *  業務層類
 *  接收上一層,控制層controller的數據
 *  經過計算,傳遞給dao層,操作數據庫
 *  調用dao層中的類,類成員位置,創建Dao類的對象
 */
public class ZhangWuService {
    private ZhangWuDao dao = new ZhangWuDao();
}
ZhangWuService

在view包中,創建類MainView.java,給MainView類添加一個類型為ZhangWuService的成員變量,因為本項目中view依賴service。

package cn.itcast.gjp.view;

import cn.itcast.gjp.service.ZhangWuService;

/*
 *  視圖層,用戶看到和操作的界面
 */
public class MainView {
    private ZhangWuService service = new ZhangWuService();
}
MainView

功能界面菜單

 

界面菜單的完成,是項目編寫的第一步。我們通過輸出語句,完成界面菜單的輸出,之后再根據輸入的功能序號,進行對應功能的調用執行。

功能實現步驟

 編寫MainView類run方法

  1. 完成功能界面菜單顯示
  2. 接收鍵盤輸入的功能選項
  3. 根據選項值,調用對應的功能方法

編寫MainApp類的main主方法

調用MainView類中run方法,實現將程序執行起來,顯示功能界面菜單。

 功能實現代碼

 1、在view包MainView類中編寫run方法

/*
     *  實現界面效果
     *  接收用戶的輸入
     *  根據數據,調用不同的功能方法
     */
    public void run(){
        //創建Scanner類對象,反復鍵盤輸入
        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;
            }
        }
    }
run方法

2、app包MainApp類的main主方法中,調用MainView類中run方法

 new MainView().run();

查詢所有賬務

 

功能實現步驟

1 編寫MainView類中selectZhangWu方法

  • 通過輸出語句,顯示出要查詢賬務的方式
  • 接收鍵盤的輸入項,調用對應的方法(1.查詢所有 2.按條件查詢)
/*
     * 定義方法 selectZhangWu()
     * 顯示查詢的方式 1 所有查詢   2 條件查詢
     * 接收用戶的選擇
     */
     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;
         }
     }
selectZhangWu方法

2 編寫MainView類中selectAll查詢所有賬務方法

  • 調用ZhangWuService類selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
  • 調用MainView類中print方法,實現控制台顯示所有賬務數據
  • 編寫MainView類中print方法,使用輸出語句,打印出賬務表的表頭名稱,遍歷賬務集合,將每個賬務信息輸出打印
 /*
     * 定義方法,實現查詢所有的賬務數據
     */
    public void selectAll(){
        //調用控制層中的方法,查詢所有的賬務數據
        List<ZhangWu> list = service.selectAll();
        if(list.size()!=0)
            print(list);
        else
            System.out.println("沒有查詢到數據");
    }

    //輸出賬務數據方法,接收List集合,遍歷集合,輸出表格
    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());
        }
    }
selectAll方法

3、編寫ZhangWuService類中selectAll方法

  • 調用ZhangWuDao類中selectAll方法,返回包含所有賬務數據的List<ZhangWu>集合
/*
     *  定義方法,實現查詢所有的賬務數據
     *  此方法,由控制層調用, 去調用dao層的方法
     *  返回存儲ZhangWu對象的List集合
     */
    public List<ZhangWu> selectAll(){
        return dao.selectAll();
    }
selectAll方法

4、編寫ZhangWuDao類中selectAll()方法

  • 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含所有賬務數據的List<ZhangWu>集合
/*
     * 定義方法,查詢數據庫,獲取所有的賬務數據
     * 方法,由業務層調用
     * 結果集,將所有的賬務數據,存儲到Bean對象中,存儲到集合中
     */
    public List<ZhangWu> selectAll(){
        try{
            //查詢賬務數據的SQL語句
            String sql = "SELECT * FROM gjp_zhangwu";
            //調用qr對象的方法,query方法,結果集BeanListHandler
            List<ZhangWu> list = qr.query(sql, new BeanListHandler<>(ZhangWu.class));
            return list;
        }catch(SQLException ex){
            System.out.println(ex);
            throw new RuntimeException("查詢所有賬務失敗");
        }
    }
selectAll方法

多條件查詢賬務 

1 、編寫MainView類中select方法

  • 通過鍵盤輸入查詢日期的范圍
  • 調用ZhangWuSerice類中select方法,返回查詢日期范圍內的賬務信息集合List<ZhangWu>
  • 調用MainView類中的print方法,將賬務信息集合中的內容顯示在控制台中
 /*
     * 定義方法,實現條件查詢賬務數據
     * 提供用戶的輸入日期,開始日期結束日期
     * 就2個日期,傳遞到controller層
     * 調用controller的方法,傳遞2個日期參數
     * 獲取到controller查詢的結果集,打印出來
     */
    public void select(){
        System.out.println("選擇條件查詢,輸入日期格式XXXX-XX-XX");
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入開始日期:");
        String startDate = sc.nextLine();
        System.out.print("請輸入結果日期:");
        String endDate = sc.nextLine();
        //調用controller層的方法,傳遞日期,獲取查詢結果集
        List<ZhangWu> list = service.select(startDate, endDate);
        if(list.size()!=0)
            print(list);
        else
            System.out.println("沒有查詢到數據");
    }
select方法

2、 編寫ZhangWuService類中select方法

  • 調用ZhangWuDao 類中select方法,返回查詢日期范圍內的賬務信息集合List<ZhangWu>
/*
     * 定義方法,實現條件查詢賬務
     * 方法由控制層調用,傳遞2個日期字符串
     * 調用dao層的方法,傳遞2個日期字符串
     * 獲取到查詢結果集
     */
    public List<ZhangWu> select(String startDate,String endDate){
        return dao.select(startDate, endDate);
    }
select方法

3 編寫ZhangWuDao類中select方法

  • 通過QueryRunner對象,調用query方法查詢數據庫表gjp_zhangwu,返回包含查詢日期范圍內的賬務數據List<ZhangWu>集合
/*
     * 定義方法,查詢數據庫,帶有條件去查詢賬務表
     * 由業務層調用,查詢結果集存儲到Bean對象,存儲到List集合
     * 調用者傳遞2個日期字符串
     */
    public List<ZhangWu> select(String startDate,String endDate){
        try{
            //拼寫條件查詢的SQL語句
            String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";
            //定義對象數組,存儲?占位符
            Object[] params = {startDate,endDate};
            //調用qr對象的方法query查詢數據表,獲取結果集
            return qr.query(sql, new BeanListHandler<>(ZhangWu.class),params);
        }catch(SQLException ex){
            System.out.println(ex);
            throw new RuntimeException("條件查詢失敗");
        }
    }
select方法

添加賬務

 

功能實現步驟

1 、編寫MainView類中addZhangWu方法

  • 鍵盤輸入新添加的賬務信息
  • 調用ZhangWuService類中addZhangWu方法,用來指定賬務的添加
  • 添加完畢后,使用輸出語句,提示“添加賬務成功!”
/*
     * 定義方法addZhangWu
     * 添加賬務的方法,用戶在界面中選擇菜單1的時候調用、
     * 實現思想:
     *       接收鍵盤輸入,5項輸入,調用controller層方法
     */
    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();
        //將接收到的數據,調用controller層的方法,傳遞參數,實現數據添加
        //將用戶輸入的所有參數,封裝成ZhangWu對象
        ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);
        controller.addZhangWu(zw);
        System.out.println("恭喜添加賬務成功");
    }
addZhangWu方法

2 、編寫ZhangWuService類中addZhangWu方法

  • 調用ZhangWuDao類中addZhangWu方法,用來指定賬務的添加
/*
     * 定義方法,實現添加賬務
     * 是由控制層調用,傳遞ZhangWu對象
     */
    public void addZhangWu(ZhangWu zw) {
        dao.addZhangWu(zw);
    }
addZhangWu

3、 編寫ZhangWuDao類中addZhangWu方法

  • 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成指定賬務添加到數據庫表中
 /*
     * 定義方法,實現添加賬務功能
     * 由業務層調用,傳遞ZhangWu對象
     * 將ZhangWu對象中的數據,添加到數據庫
     */
    public void addZhangWu(ZhangWu zw) {
        try{
            //拼接添加數據的sql
            String sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
            //創建對象數組,處處5個占位符的實際參數
            //實際參數來源是傳遞過來的對象ZhangWu
            Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()};
            //調用qr對象中的方法update執行添加
            qr.update(sql, params);
        }catch(SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("賬務添加失敗");
        }
    }
addZhangWu

編輯賬務

 

功能實現步驟

1 、編寫MainView類中editZhangWu方法

  • 鍵盤輸入要編輯的賬務信息ID號
  • 鍵盤輸入要修改的賬務信息內容
  • 調用ZhangWuService類中editZhangWu方法,用來將指定的賬務信息進行更新
  • 更新完畢后,使用輸出語句,提示 “編輯賬務成功!”
/*
     * 定義方法,實現對賬務的編輯功能
     * 實現思想:
     *     接收用戶的輸入的信息
     *  封裝成ZhangWu對象
     *  調用控制層的方法,傳遞ZhangWu對象,實現編輯
     * 
     */
    public void editZhangWu() {
        //調用查詢所有賬務數據的功能,顯示出來
        //看到所有數據,從中選擇一項,進行修改
        selectAll();
        System.out.println("選擇的是編輯功能,請輸入數據");
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入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對象中
        //用戶輸入的ID,必須封裝到到對象中
        ZhangWu zw = new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
        //調用controller層中的方法,實現編輯賬務
        controller.editZhangWu(zw);
        System.out.println("賬務編輯成功");
    }
editZhangWu

2 、編寫ZhangWuService類中editZhangWu方法

  • 調用ZhangWuDao類中editZhangWu方法,用來將指定的賬務信息進行更新
/*
     * 定義方法,實現編輯賬務
     * 由控制層調用,傳遞ZhangWu對象
     * 調用dao層的方法,傳遞ZhangWu對象
     */
    public void editZhangWu(ZhangWu zw) {
        dao.editZhangWu(zw);
    }
editZhangWu方法

3 、編寫ZhangWuDao類中editZhangWu方法

  • 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務更新操作
/*
     * 定義方法,實現編輯功能
     * 由業務層調用,傳遞ZhangWu對象
     * 將對象中的數據,更新到數據表
     */
    public void editZhangWu(ZhangWu zw) {
        try {
            //更新數據的SQL
            String sql = "UPDATE gjp_zhangwu SET flname=?,money=?,zhanghu=?,createtime=?,description=? WHERE zwid=?";
            //定義對象數組,封裝所有數據
            Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription(),zw.getZwid()};
            //調用qr對象方法update執行更新
            qr.update(sql, params);
        } catch (SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("編輯賬務失敗");
        }
        
    }
editZhangWu方法

刪除賬務

 

功能實現步驟

1 、編寫MainView類中deleteZhangWu方法

  • 鍵盤輸入要刪除的賬務信息ID號
  • 調用ZhangWuService類中deleteZhangWu方法,用來將指定的賬務信息刪除
  • 刪除完畢后,使用輸出語句,提示 “刪除賬務成功!”
/*
     * 定義方法,實現賬務刪除
     * 實現思想:
     *     接收用戶的輸入,輸入一個主鍵數據
     *  調用控制層方法,傳遞一個主鍵
     */
    public void deleteZhangWu() {
        //調用查詢所有賬務數據的功能,顯示出來
        //看到所有數據,從中選擇一項,進行修改
        selectAll();
        System.out.println("選擇的是刪除功能,請輸入序號即可");
        int zwid = new Scanner(System.in).nextInt();
        //調用控制層方法,傳遞主鍵id即可
        controller.deleteZhangWu(zwid);
        System.out.println("刪除賬務成功");
    }
deleteZhangWu方法

2 、編寫ZhangWuService類中deleteZhangWu方法

  • 調用ZhangWuDao類中deleteZhangWu方法,用來將指定的賬務信息刪除
/*
     * 定義方法,實現刪除賬務功能
     * 由控制層調用,傳遞主鍵id
     * 調用dao層方法,傳遞主鍵id
     */
    public void deleteZhangWu(int zwid) {
        dao.deleteZhangWu(zwid);
    }
deleteZhangWu方法

3 、編寫ZhangWuDao類中deleteZhangWu方法

  • 通過QueryRunner對象,調用update方法更新數據庫表gjp_zhangwu,完成數據庫表中指定賬務刪除操作
 /*
     * 定義方法,實現刪除業務
     * 業務層調用,傳遞主鍵id
     */
    public void deleteZhangWu(int zwid) {
        try {
            //拼寫刪除數據SQL
            String sql = "DELETE FROM gjp_zhangwu WHERE zwid=?";
            qr.update(sql, zwid);
        } catch (SQLException ex) {
            System.out.println(ex);
            throw new RuntimeException("刪除賬務失敗");
        }
    }
deleteZhangWu

功能模塊總結

到此為止,已經完成了分類模塊所有功能。通過分類模塊功能的實現,大家可能會發現如下幾個問題:

難度大的地方:自行功能分析的能力欠缺;

代碼實現:

  • View(Controller):代碼量最大;
  • Service層:代碼量最小;
  • DAO層:相似度高,難度不大;

view層的作用是“界面”,用來完成數據顯示給用戶。當前項目view層中,包含了Controller層代碼。

Controller層的作用是“調度”,調度的是表現層view和業務層Service,主要功能分為:一是把表現層的數據交給業務層處理;二是把業務層返回的數據交給表現層顯示。至於為什么這一層View(Controller)的代碼量大,這里我要說明一下,其實不是View(Controller)層的代碼量大,而是其他層代碼量少,所以你會感覺View(Controller)層代碼量大。

Service層的作用是“業務”,我們也可以把“業務”當成是“功能”。那為什么Service層代碼量少呢?原因是現在我們寫的項目很小,沒有什么復雜的業務,而今后大家要寫的大型項目代碼量最大的就是Service層。

DAO層是操作數據庫,現在我們使用的是commons-dbutils工具來簡化JDBC,所以我們發現代碼不多,比較簡單。最后我們還會學習其他DAO層的工具,例如:hibernate和mybatis,他們都是JDBC的封裝,用來簡化JDBC。

 源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM