1. 程式人生 > >Java入門程式碼--Java分層模式

Java入門程式碼--Java分層模式

         啟動了Eclipse之後,下面建立一個新的Java專案:MyJavaProject。

         之後輸入的專案名稱:MyJavaProject。

         當Java專案建立完成之後,可以在專案的目錄下發現兩個資料夾:

                   · src:是儲存所有的*.java程式,都是按照包名稱進行儲存的;

                   · bin:儲存所有生成的*.class檔案,按照包名稱進行儲存的。

         下面建立一個新的類:TestDemo.java。

         使用Eclipse本身最大的好處是在於方便的進行隨筆提示,並且在每一次*.java程式儲存的時候,會由Eclipse自動的將其編譯為*.class檔案。

         另外在Eclipse之中還可以存在一些程式碼的生成工具,例如:現在有如下一個簡單的類:

package cn.mldn.vo;

public class Person {

    private String name ;

    private int age ;

}

         這個類肯定是作為簡單Java類出現,那麼現在很明顯簡單Java類的開發原則:

                   · 所有屬性封裝,已經封裝;

                   · 生成setter、getter方法,右鍵〖Source〗

è 〖生成getter和setter方法〗

         · 構造方法,必須要有無參構造,〖Source〗 è 生成構造方法。

         · 覆寫Object類之中的一些操作方法,〖Source〗 è 〖覆寫或實現方法〗。

         或則使用JUNO版的新功能,自動生成toString();

         不過,除了以上的生成方式,還可以通過快捷鍵生成程式碼。

                   · ALT + /:程式碼自動補充提示;

                   · CTRL + 1:進行錯誤程式碼糾正提示;

                   · CTRL + D:刪除當前行程式碼;

                   · CTRL + SHIFT + O:組織匯入所需要的包.類;

                   · CTRL + SHIFT + F:格式化程式碼顯示;

                   · CTRL + /:註釋或者取消註釋當前行程式碼;

                   · CTRL + SHIFT + L:所有快捷鍵列表;

                   · CTRL + H:強搜尋程式碼;

         專案也可以進行刪除操作,但是在刪除專案的時候有兩種方式:

                   · 方式一:是從專案的工作區之中刪除專案,以後可以恢復;

                   · 方式二:徹底從硬碟上刪除專案,徹底刪除。

         如果要想匯入一個專案,則可以使用匯入的方式完成。

         之後選擇專案檔案所在的路徑。

         以上是通過匯入的方式完成了專案的匯入,而現在也可以利用匯出的方式,將一個專案之中的所有*.class檔案自動生成*.jar檔案。

         但是如果一個專案之中,需要使用其他的jar包的話,那麼不能依靠之前的classpath配置,需要在Eclipse之中單獨配置jar包,找到專案屬性的構建路徑完成。

         在Eclipse之中,為了方便使用者的開發,還提供了DEBUG功能,可以利用此功能進行專案的除錯操作,而如果要想進行除錯,那麼首先需要設定斷點:斷點指的是程式執行到此處的時候,自動停止,而後交由人工控制執行。

範例:定義要除錯的程式

package cn.mldn.demo;

class TestMath {

    public static int div(int x, int y) throws Exception {

        int result = 0;

        result = x / y;

        return result;

    }

}

public class TestDemo {

    public static void main(String[] args) throws Exception {

        int tempX = 10;

        int tempY = 2;

        int res = TestMath.div(tempX, tempY); // 在此行的左邊空欄上雙擊滑鼠左鍵

        System.out.println("計算結果:" + res);

    }

}

         這個時候會自動的出現一個斷點(Blue Point),而後以Debug的方式啟動程式。

         隨後會出現一個資訊提示,詢問:是否要切換到除錯檢視上,選擇“yes”,進入到除錯檢視。

         進入到除錯檢視之後,可以通過以下的四個方式進行程式碼除錯:

                   · 單步跳入(F5):進入到程式碼之中,觀察程式碼的執行;

                   · 單步跳過(F6):不關心程式碼之中的執行,只關心最終的結果;

                   · 單步返回(F7):返回到單步跳過的狀態;

                   · 恢復執行(F8):不再除錯,直接將程式執行完成。

         在每一個Java程式執行的時候都可以設定一些初始化的配置引數,Eclipse也可以,但是麻煩一些,例如:下面建立一個新的類:PrintParam

package cn.mldn.demo;

public class PrintParam {

    public static void main(String[] args) {

        for (int x = 0; x < args.length; x++) {

            System.out.println(args[x]);

        }

    }

}

         如果要想配置初始化引數,則進入到執行時配置,可是如果要想真正配置,必須保證要配置的程式先執行一次。

3、具體內容

         之前的所有內容都在本處進行總結,而且對於之前的一些概念不清楚的東西(程式碼會寫)那麼都可以不用去看了,把本次程式弄會了,一切就都會了,後面也就都會了。

3.1、程式分層(理解)

         在一個完整的專案之中,對程式進行合理的分層,可以讓開發變得更加的方便,也更加的具備層次感,每一層有每一層的開發人員,例如:可以簡單的理解為美工 + 程式相分離。而實際上的分層操作,可以這樣參考:

         如果按照含金量來講,首先把握住業務層是整個程式的實現關鍵,但是對於前臺顯示更加的重要。今天的主要任務是觀察業務層和資料層的開發,而到了Java WEB之後,才開始實現顯示層和控制層的開發。

         在專案之中後臺的建立直接有著重要的地位,但是不同層之間最為重要的連線組成部分就是介面,所以整個程式碼開發之中,對於後臺程式碼就一定要有兩個組成介面(業務層介面,給以後的控制層使用、資料層介面,給以後的業務層使用)。

         · 資料層(資料訪問層,Data AccessObject):指的是執行資料的具體操作,而現在的開發之中,大多數都是針對於資料庫的開發,所以在資料層之中的主要任務是負責完成資料的CRUD,而在java之中,如果要想進行資料的CRUD實現,肯定使用java.sql.PreparedStatement介面;

         · 業務層(業務物件,BusinessObject,BO,又或者將其稱為Service,服務層),服務層的主要目的是根據業務需求進行資料層的操作,一個業務層要包含多個數據層的操作。

         清楚了基本概念之後,那麼新的問題就該出現了,如何去區分業務層或者是資料層?下面以玉史先生吃飯為例,說明一下。

         如果說現在某一個專案業務非常複雜,可能分為若干個子業務,那麼就還需要一個總的業務層操作。

3.2、例項分析(重點

         下面以emp資料表(empno、ename、job、hiredate、sal、comm,都是基本欄位)為例分析一個操作,客戶要求可以實現如下的幾個功能:

                   · 【業務層】增加一個新僱員資訊;

                            |-〖資料層〗要根據增加的僱員編號檢視此僱員是否存在;

                            |-〖資料層〗如果僱員不存在則執行插入操作,如果存在則不插入;

                   · 【業務層】修改一個僱員的資訊;

                            |-〖資料層〗直接傳入新的資料即可,如果沒有修改返回的更新行數是0;

                   · 【業務層】刪除一個僱員的資訊;

                            |-〖資料層〗直接傳入要刪除的僱員編號即可,如果沒有此僱員資訊返回的是0;

                   · 【業務層】根據編號查詢一個僱員的資訊;

                            |-〖資料層〗返回一個僱員的完整資訊;

· 【業務層】取得全部僱員的資訊,要求可以實現模糊查詢和分頁顯示,查詢結果除了返回資料之外,還要求知道模糊或全部查詢時所返回的全部資料量:

                            |-〖資料層〗模糊或查詢全部滿足條件的僱員資料,多個數據;

                            |-〖資料層〗使用COUNT()進行滿足條件的資料統計。

3.3、準備階段(重點

3.3.1、VO類:負責資料的傳輸與包裝

         但是現在有一個最為嚴重的問題出現了,不同層之間(這些層除了資料層要操作SQL之外,那麼其他層操作的資料都應該是物件),所以應該有一個負責傳輸的資料物件,這個物件可以稱為Value Object(VO,POJO、TO、PO)。

但是,現在對於簡單Java類的開發原則也發生了一些變化:

·類名稱要和表名稱保持一致;

·為了日後類的操作方便,所有的簡單Java類必須實現java.io.Serializable介面;

·類中不允許出現任何的基本資料型別,只能使用包裝類;

·類之中的所有屬性都必須封裝,必須都編寫settergetter

·類之中一定要提供有無參構造方法。

         在DAO的開發之中,所有的名稱都有嚴格規定,假設現在的專案的總包名稱為:cn.mldn.oracle,那麼現在這個VO類的儲存包名稱就應該是cn.mldn.oracle.vo。

範例:定義cn.mldn.oracle.vo.Emp類

package cn.mldn.oracle.vo;

import java.io.Serializable;

import java.util.Date;

@SuppressWarnings("serial")

public class Emp implements Serializable {

    private Integer empno ;

    private String ename ;

    private String job ;

    private Date hiredate ;

    private Double sal ;

    private Double comm ;

    // settergetter略,自己補充

}

3.3.2、DatabaseConnection類:負責資料庫連線

         既然現在要完成資料層的開發,那麼就一定需要資料庫的連線與關閉操作,可是如果將資料庫的連線和關閉都寫在每一個數據層之中,這樣程式碼過於重複,而且也不方便維護,那麼為了方便起見,現在定義一個DatabaseConnection的類,這個類專門負責取得和關閉資料庫連線。而這個類定義在cn.mldn.oracle.dbc包之中。

範例:定義cn.mldn.oracle.dbc.DatabaseConnection

package cn.mldn.oracle.dbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

/**

* 本類的主要功能是負責資料庫的連線與關閉的

* @author MLDN

*/

public class DatabaseConnection {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:MLDN" ;

    private static final String DBUSER = "scott" ;

    private static final String PASSWORD = "tiger" ;

    private Connection conn = null ;    // 儲存連線物件

    /**

     * 構造方法的主要目的是進行資料庫連線,只要在程式之中例項化了DatabaseConnection物件

     * 那麼就表示要進行資料庫的連線操作了,所以在構造方法之中連線資料庫

     * 在本構造方法之中,如果出現了異常,將直接輸出異常資訊,因為如果資料庫連線都沒有了,根本就無法操作

     */

    public DatabaseConnection() {

        try {

            Class.forName(DBDRIVER);

            this.conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * 取得一個數據庫連線物件,這個物件在構造方法中取得

     * @return Connection介面物件

     */

    public Connection getConnection() {

        return this.conn ;

    }

    /**

     * 關閉連線,不管是否連線上,執行此操作都不會出錯

     */

    public void close() {

        if (this.conn != null) {    // 取得了連線

            try {   // 關閉連線

                this.conn.close() ;

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

         如果在實際的工作之中,按照DAO最早提出的標準,對於資料層的實現類還需要實現資料庫的移植操作。即:對於資料庫連線類應該變為一個專門負責連線的介面,就好象以下的形式一樣:

public interface DatabaseConnection {

    public Connection getConnection() ;

    public void close() ;

}

         而後如果一個專案可能在Oracle或DB2下執行,那麼針對於這兩種資料庫分別定義一個介面實現類,以對應兩個不同的資料庫連線。但是這種開發已經和現在的模式有些出入了,而且特別的麻煩,所以在本次為了和日後的開發可以更好的聯絡在一起,只是定義了一個類而已。

3.4、開發資料層(重點

3.4.1、定義IEmpDAO介面:資料層開發標準

         不同層之間的操作依靠的是介面,所以資料層的開發首先要定義出來的就是標準。那麼既然是標準就需要定義的是一個介面,現在很明顯針對的是emp表,所以這個介面的名稱就應該為“表名稱DAO”,即:EmpDAO,但是這裡有一個問題了,介面和類的命名要求是一致的,所以為了從名稱上區分出介面或者是類,則建議在介面名稱前增加一個字母“I”,表示Interface的含義,即:emp這張實體表的操作標準的介面名稱為:IEmpDAO,而且這個介面應該儲存在cn.mldn.oracle.dao包之中。

         那麼對於這個介面的開發主要是針對於資料的兩種操作(更新、查詢),所以從開發標準上對於命名也有著嚴格的要求,而且必須遵守,基本標準如下:

                   · 更新操作:以“doXxx()”的方式命名,例如:doCreate()、doUpdate()、doRemvoe();

                   · 查詢操作,因為查詢操作分為兩類:

                            |-資料查詢:以“findXxx()”或“findByXxx()”為主,例如:findAll()、findById()、findByJob();

                            |-統計查詢:以“getXxx()”或“getByXxx()”為主,例如:getAllCount()、getByJobCount()。

範例:編寫IEmpDAO介面的操作標準

package cn.mldn.oracle.dao;

import java.util.List;

import cn.mldn.oracle.vo.Emp;

public interface IEmpDAO {

    /**

     * 執行資料的增加操作

     * @param vo 包含所要增加的資料的VO物件

     * @return如果增加資料成功返回true,否則返回false

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public boolean doCreate(Emp vo) throws Exception ;

    /**

     * 執行資料的更新操作

     * @param vo 包含了新資料的VO物件

     * @return如果修改成功返回true,否則返回false

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public boolean doUpdate(Emp vo) throws Exception ;

    /**

     * 刪除一個僱員的資訊

     * @param id 要刪除的僱員編號

     * @return如果刪除成功返回true,否則返回false

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public boolean doRemove(int id) throws Exception ;

    /**

     * 根據僱員編號查詢一個僱員的完整資訊

     * @param id 要查詢的僱員編號

     * @return如果沒有指定的僱員編號,返回值為null<br>

     * 如果有指定的僱員資訊,則將所有的僱員資訊包裝到Emp例項化物件之中返回。

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public Emp findById(int id) throws Exception ;

    /**

     * 查詢全部的僱員資訊

     * @return多個僱員資訊使用List返回,如果List集合的size()長度為0,則表示沒有資料返回

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public List<Emp> findAll() throws Exception ;

    /**

     * 分頁顯示所有僱員的資訊,同時可以完成模糊查詢

     * @param column 要模糊查詢的欄位名稱

     * @param keyWord 要模糊查詢的資料,如果為空字串(isEmpty()判斷為true,表示空字串),則表示查詢全部

     * @param currentPage 當前所在的頁

     * @param lineSize 沒頁顯示的記錄長度

     * @return多個僱員資訊使用List返回,如果List集合的size()長度為0,則表示沒有資料返回

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public List<Emp> findAll(String column, String keyWord, int currentPage,

            int lineSize) throws Exception;

    /**

     * 統計模糊查詢的資料結果,使用COUNT()函式進行統計

     * @param column 要模糊查詢的欄位名稱

     * @param keyWord 要模糊查詢的資料,如果為空字串(isEmpty()判斷為true,表示空字串),則表示查詢全部

     * @return會根據資料量的多少返回資料的長度,如果沒有資料返回0

     * @throws Exception 操作之中出現了異常,返回給被呼叫處執行處理

     */

    public int getAllCount(String column, String keyWord) throws Exception;

}

         現在開發的標準只是滿足於程式需求的提出需要。

3.4.2、定義IEmpDAO介面的實現類

         既然在介面中已經定義了資料層的操作標準,那麼對於實現類只需要遵循資料層的CRUD操作即可,但是對於DAO介面的實現類需要有明確的定義,要求將其定義在:cn.mldn.oracle.dao.impl包之中。

範例:定義EmpDAOImpl子類

         · 現在有如下一種的子類實現介面方式:

    @Override

    public boolean doCreate(Emp vo) throws Exception {

        DatabaseConnection dbc = new DatabaseConnection();

        String sql = "INSERT INTO emp (empno,ename,job,hiredate,sal,comm) VALUES (?,?,?,?,?,?)";

        PreparedStatement pstmt = dbc.getConnection().prepareStatement(sql);

        pstmt.setInt(1, vo.getEmpno());

        pstmt.setString(2, vo.getEname());

        pstmt.setString(3, vo.getJob());

        pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime()));

        pstmt.setDouble(5, vo.getSal());

        pstmt.setDouble(6, vo.getComm());

        if (pstmt.executeUpdate() > 0) {

            return true ;

        }

        dbc.close() ;

        return false;

    }

         如果真的按照這種方式實現的程式,有兩個重要問題:

· 對於資料層之中給出的若干方法,由服務層呼叫,一個服務層要執行N個數據層,那麼每次執行的時候開啟一次關閉一次資料庫?

· 按照異常的處理機制,如果現在執行的過程之中出現了錯誤,那麼順著throws就結束呼叫了,資料庫就再也無法關閉了。

         按照之前的分析,一個業務要進行多個數據層操作,所以資料庫連線與關閉交給業務層做最合適,而資料層只需要有一個Connection物件就可以操作了,它不需要關心這個物件是從那裡來的,怎麼來的,只關心能不能使用。

package cn.mldn.oracle.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import java.util.List;

import cn.mldn.oracle.dao.IEmpDAO;

import cn.mldn.oracle.vo.Emp;

public class EmpDAOImpl implements IEmpDAO {

    private Connection conn;

    private PreparedStatement pstmt;

    public EmpDAOImpl(Connection conn) {

        this.conn = conn;

    }

    @Override

    public boolean doCreate(Emp vo) throws Exception {

        String sql = "INSERT INTO emp (empno,ename,job,hiredate,sal,comm) VALUES (?,?,?,?,?,?)";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1, vo.getEmpno());

        this.pstmt.setString(2, vo.getEname());

        this.pstmt.setString(3, vo.getJob());

        this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime()));

        this.pstmt.setDouble(5, vo.getSal());

        this.pstmt.setDouble(6, vo.getComm());

        if (this.pstmt.executeUpdate() > 0) {

            return true;

        }

        return false;

    }

    @Override

    public boolean doUpdate(Emp vo) throws Exception {

        String sql = "UPDATE emp SET ename=?,job=?,hiredate=?,sal=?,comm=? WHERE empno=?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setString(1, vo.getEname());

        this.pstmt.setString(2, vo.getJob());

        this.pstmt.setDate(3, new java.sql.Date(vo.getHiredate().getTime()));

        this.pstmt.setDouble(4, vo.getSal());

        this.pstmt.setDouble(5, vo.getComm());

        this.pstmt.setInt(6, vo.getEmpno());

        if (this.pstmt.executeUpdate() > 0) {

            return true;

        }

        return false;

    }

    @Override

    public boolean doRemove(int id) throws Exception {

        String sql = "DELETE FROM emp WHERE empno=?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1, id);

        if (this.pstmt.executeUpdate() > 0) {

            return true;

        }

        return false;

    }

    @Override

    public Emp findById(int id) throws Exception {

        Emp emp = null;

        String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp WHERE empno=?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1, id);

        ResultSet rs = this.pstmt.executeQuery();

        if (rs.next()) {

            emp = new Emp();

            emp.setEmpno(rs.getInt(1));

            emp.setEname(rs.getString(2));

            emp.setJob(rs.getString(3));

            emp.setHiredate(rs.getDate(4));

            emp.setSal(rs.getDouble(5));

            emp.setComm(rs.getDouble(6));

        }

        return emp;

    }

    @Override

    public List<Emp> findAll() throws Exception {

        List<Emp> all = new ArrayList<Emp>();

        String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp";

        this.pstmt = this.conn.prepareStatement(sql);

        ResultSet rs = this.pstmt.executeQuery();

        while (rs.next()) {

            Emp emp = new Emp();

            emp.setEmpno(rs.getInt(1));

            emp.setEname(rs.getString(2));

            emp.setJob(rs.getString(3));

            emp.setHiredate(rs.getDate(4));

            emp.setSal(rs.getDouble(5));

            emp.setComm(rs.getDouble(6));

            all.add(emp);

        }

        return all;

    }

    @Override

    public List<Emp> findAll(String column, String keyWord, int currentPage,

            int lineSize) throws Exception {

        List<Emp> all = new ArrayList<Emp>();

        String sql = "SELECT * FROM ("

                + "SELECT empno,ename,job,hiredate,sal,comm,ROWNUM rn FROM emp WHERE "

                + column + " LIKE ? AND ROWNUM<=?) temp " + " WHERE temp.rn>? ";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setString(1, "%" + keyWord + "%");

        this.pstmt.setInt(2, currentPage * lineSize);

        this.pstmt.setInt(3, (currentPage - 1) * lineSize);

        ResultSet rs = this.pstmt.executeQuery();

        while (rs.next()) {

            Emp emp = new Emp();

            emp.setEmpno(rs.getInt(1));

            emp.setEname(rs.getString(2));

            emp.setJob(rs.getString(3));

            emp.setHiredate(rs.getDate(4));

            emp.setSal(rs.getDouble(5));

            emp.setComm(rs.getDouble(6));

            all.add(emp);

        }

        return all;

    }

    @Override

    public int getAllCount(String column, String keyWord) throws Exception {

        String sql = "SELECT COUNT(empno) FROM emp WHERE " + column + " LIKE ?";

        this.pstmt = this.conn.prepareStatement(sql) ;

        this.pstmt.setString(1, "%" + keyWord + "%");

        ResultSet rs = this.pstmt.executeQuery() ;

        if (rs.next()) {

            return rs.getInt(1) ;

        }

        return 0;

    }

}

3.4.3、定義DAO工廠類

         由於不同層之間只能依靠介面取得物件,所以就一定需要定義工廠操作類,工廠類定義在cn.mldn.oracle.factory包之中,名稱為DAOFactory。

範例:定義工廠類

package cn.mldn.oracle.factory;

import java.sql.Connection;

import cn.mldn.oracle.dao.IEmpDAO;

import cn.mldn.oracle.dao.impl.EmpDAOImpl;

public class DAOFactory {

    public static IEmpDAO getIEmpDAOInstance(Connection conn) {

        return new EmpDAOImpl(conn) ;

    }

}

3.5、開發業務層(重點

3.5.1、開發業務層標準

         業務層以後也是需要留給其他層進行呼叫的,所以業務層定義的時候也需要首先定義出操作標準,而這個標準也依然使用介面完成,對於業務層,介面命名要求:表名稱 + Service,例如:IEmpService,表示操作Emp表的業務。

範例:在cn.mldn.oracle.service包中定義IEmpService介面

package cn.mldn.oracle.service;

import java.util.Map;

import cn.mldn.oracle.vo.Emp;

public interface IEmpService {

    /**

     * 呼叫資料庫的增加操作,操作流程如下:<br>

     * <li>首先要使用IEmpDAO介面中的findById()方法,根據要增加的id檢視指定的僱員資訊是否存在;

     * <li>如果要增加的僱員資訊不存在,則執行IEmpDAO介面的doCreate()方法,並將結果返回;

     * @param vo 包裝資料的物件

     * @return如果增加成功,返回true,如果僱員編號存在或者是增加失敗,返回false

     * @throws Exception 有異常交給被呼叫處處理

     */

    public boolean insert(Emp vo) throws Exception;

    /**

     * 執行資料的更新操作,操作的時候直接呼叫IEmpDAO介面的doUpdate()方法,並將更新結果返回

     * @param vo 包裝資料的物件

     * @return如果修改成功,返回true,如果資料不存在或修改失敗,返回false

     * @throws Exception 有異常交給被呼叫處處理

     */

    public boolean update(Emp vo) throws Exception ;

    /**

     * 執行資料的刪除操作,刪除操作的時候呼叫IEmpDAO介面的doRemove()