天天看點

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

目錄

一,主要流程

二,編碼過程

1,建立資料庫表格

2, API設計

3,DAO接口編寫

4,SQL語句編寫

4.1 向Express表添加記錄

4.2 在ExpressDao實作類中編寫SQL語句

5,Dao編寫+Dao測試

5.1 ExpressDao實作類編寫

5.2 Dao測試

5.3 自定義異常

6,ExpressService編寫

完整項目在這裡實時更新<( ̄︶ ̄)↗[GO!]:https://github.com/GoodbyeFirefly/ExpressManagementSystem    

一,主要流程

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

二,編碼過程

1,建立資料庫表格

CREATE TABLE express(
	id INT PRIMARY KEY auto_increment,
	number VARCHAR(64) UNIQUE,
	username VARCHAR(32),
	userphone VARCHAR(32),
	company VARCHAR(32),
	code VARCHAR(32) UNIQUE,
	intime TIMESTAMP,
	outtime TIMESTAMP,
	status int,
	sysPhone VARCHAR(32)
);
           
若通過navicat可視化工具建立時,UNIQUE屬性需要在索引欄進行相關配置
07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

生成表格對應的實體類

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程
package com.xxy.bean;


import java.sql.Timestamp;
import java.util.Objects;

public class Express {

  private int id;
  private String number;
  private String username;
  private String userphone;
  private String company;
  private String code;
  private Timestamp intime;
  private Timestamp outtime;
  private int status;
  private String sysPhone;

  public Express(String number, String username, String userphone, String company, String code, String sysPhone) {
    this.number = number;
    this.username = username;
    this.userphone = userphone;
    this.company = company;
    this.code = code;
    this.sysPhone = sysPhone;
  }

  public Express(int id, String number, String username, String userphone, String company, Timestamp intime, Timestamp outtime, int status, String sysPhone) {
    this.id = id;
    this.number = number;
    this.username = username;
    this.userphone = userphone;
    this.company = company;
    this.intime = intime;
    this.outtime = outtime;
    this.status = status;
    this.sysPhone = sysPhone;
  }

  public Express() {
  }

  @Override
  public String toString() {
    return "Express{" +
            "id=" + id +
            ", number='" + number + '\'' +
            ", username='" + username + '\'' +
            ", userphone='" + userphone + '\'' +
            ", company='" + company + '\'' +
            ", code='" + code + '\'' +
            ", intime=" + intime +
            ", outtime=" + outtime +
            ", status=" + status +
            ", sysPhone='" + sysPhone + '\'' +
            '}';
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Express express = (Express) o;
    return id == express.id &&
            status == express.status &&
            Objects.equals(number, express.number) &&
            Objects.equals(username, express.username) &&
            Objects.equals(userphone, express.userphone) &&
            Objects.equals(company, express.company) &&
            Objects.equals(code, express.code) &&
            Objects.equals(intime, express.intime) &&
            Objects.equals(outtime, express.outtime) &&
            Objects.equals(sysPhone, express.sysPhone);
  }

  @Override
  public int hashCode() {
    return Objects.hash(id, number, username, userphone, company, code, intime, outtime, status, sysPhone);
  }

  public long getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }


  public String getNumber() {
    return number;
  }

  public void setNumber(String number) {
    this.number = number;
  }


  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }


  public String getUserphone() {
    return userphone;
  }

  public void setUserphone(String userphone) {
    this.userphone = userphone;
  }


  public String getCompany() {
    return company;
  }

  public void setCompany(String company) {
    this.company = company;
  }


  public String getCode() {
    return code;
  }

  public void setCode(String code) {
    this.code = code;
  }


  public java.sql.Timestamp getIntime() {
    return intime;
  }

  public void setIntime(java.sql.Timestamp intime) {
    this.intime = intime;
  }


  public java.sql.Timestamp getOuttime() {
    return outtime;
  }

  public void setOuttime(java.sql.Timestamp outtime) {
    this.outtime = outtime;
  }


  public long getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }


  public String getSysPhone() {
    return sysPhone;
  }

  public void setSysPhone(String sysPhone) {
    this.sysPhone = sysPhone;
  }

}
           

2, API設計

 2.1 用于擷取控制台所需的快遞資料

請求位址:express/console.do
參數清單:無
傳回的格式示例:
    {
        status:0,
        reuslt:"擷取成功",
        data:[
            {//全部的快遞
                size:1000,//快遞總數
                day:100//今日新增
            },{//待取件快遞
                size:500,//待取件數
                day:100//今日新增
            }
        ]
    }
           

2.2 快件清單(分頁)

請求位址:express/findAll.do
參數清單:
    1.    limit:
            值:0,表示開啟分頁(預設)
            值:1,表示查詢所有
    2.    offset:
            值:數字,表示SQL語句起始索引
    3.    pageNumber:
            值:數字,表示擷取的快遞數量

傳回的格式示例:
           

2.3 根據單号查詢快遞資訊

請求位址:express/findByNumber.do
參數清單:
    1.    number:快遞單号
    
傳回的格式示例:
           

2.4 根據取件碼查詢快遞資訊

請求位址:express/findByCode.do
參數清單:
    1.    code:取件碼
    
傳回的格式示例:
           

2.5 根據使用者的手機号,查詢快遞資訊

請求位址:express/findByUserPhone.do
參數清單:
    1.    phoneNumber:手機号碼
    2.    status:
            值:0表示查詢待取件的快遞(預設)
            值:1表示查詢已取件的快遞
            值:2表示查詢使用者的所有快遞
    
傳回的格式示例:
           

2.6 根據錄入人的手機号,查詢快遞資訊(快遞員/櫃子的曆史記錄)

請求位址:express/findBySysPhone.do
參數清單:
    1.    sysPhone:手機号碼
    
傳回的格式示例:
           

2.7 進行快遞數量的排序查詢(使用者表)

請求位址:express/lazyboard.do
參數清單:
    1.    type:
            值:0,表示查詢總排名
            值:1,表示查詢年排名
            值:2,表示查詢月排名
    
傳回的格式示例:
           

2.8 快件錄入

請求位址:express/insert.do
參數清單:
    1.    number:快遞單号
    2.    company:快遞公司
    3.    username:收件人姓名
    4.    userPhone:收件人手機号碼
錄入成功傳回的格式示例:
    
錄入失敗傳回的格式示例:
           

2.9 修改快遞資訊

請求位址:express/update.do
參數清單:
    1.    id:要修改的快遞id
    2.    number:新的快遞單号
    3.    company:新的快遞公司
    4.    username:新的收貨人姓名
    5.    userPhone:新的收件人手機号碼,(手機号碼更新,重新生成取件碼,并發送短信)
    6.    status:新的快遞的狀态

傳回的格式示例:
           

2.10 根據id删除快遞資訊

請求位址:express/delete.do
參數清單:
    1.    id:    要删除的快遞的id
    
傳回的格式示例:
           

2.11 确認取件

請求位址:express/updateStatus.do
參數清單:
    number:要更改狀态為已取件的快遞單号
    
傳回的格式示例:
           

3,DAO接口編寫

package com.xxy.dao;

import com.xxy.bean.Express;

import java.util.List;
import java.util.Map;

public interface BaseExpressDao {
    /**
     * 用于查詢資料庫中的全部快遞(總數+新增),待取件快遞(總數+新增)
     * @return [{size:總數,day:新增},{size:總數,day:新增}]
     *
     */
    List<Map<String,Integer>> console();

    /**
     * 用于查詢所有快遞
     * @param limit 是否分頁的标記,true表示分頁。false表示查詢所有快遞
     * @param offset SQL語句的起始索引
     * @param pageNumber 頁查詢的數量
     * @return 快遞的集合
     */
    List<Express> findAll(boolean limit,int offset,int pageNumber);

    /**
     * 根據快遞單号,查詢快遞資訊
     * @param number 單号
     * @return 查詢的快遞資訊,單号不存在時傳回null
     */
    Express findByNumber(String number);

    /**
     * 根據快遞取件碼,查詢快遞資訊
     * @param code 取件碼
     * @return 查詢的快遞資訊,取件碼不存在時傳回null
     */
    Express findByCode(String code);

    /**
     * 根據使用者手機号碼,查詢他所有的快遞資訊
     * @param userPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    List<Express> findByUserPhone(String userPhone);

    /**
     * 根據錄入人手機号碼,查詢錄入的所有記錄
     * @param sysPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    List<Express> findBySysPhone(String sysPhone);

    /**
     * 快遞的錄入
     * @param e 要錄入的快遞對象
     * @return 錄入的結果,true表示成功,false表示失敗
     */
    boolean insert(Express e);

    /**
     * 快遞的修改
     * @param id 要修改的快遞id
     * @param newExpress 新的快遞對象(number,company,username,userPhone)
     * @return 修改的結果,true表示成功,false表示失敗
     */
    boolean update(int id,Express newExpress);

    /**
     * 更改快遞的狀态為1,表示取件完成
     * @param code 要修改的快遞取件碼
     * @return 修改的結果,true表示成功,false表示失敗
     */
    boolean updateStatus(String code);

    /**
     * 根據id,删除單個快遞資訊
     * @param id 要删除的快遞id
     * @return 删除的結果,true表示成功,false表示失敗
     */
    boolean delete(int id);
}
           

4,SQL語句編寫

4.1 向Express表添加記錄

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

4.2 在ExpressDao實作類中編寫SQL語句

// 這裡統一使用大寫 如果不是大寫的話後面會自動轉換為大寫
    // 用于查詢資料庫中的全部快遞(總數+新增),待取件快遞(總數+新增)
    public static final String SQL_CONSOLE = "SELECT COUNT(ID) data1_size, COUNT(TO_DAYS(INTIME)=TO_DAYS(NOW()) OR NULL) data1_day, COUNT(STATUS=0 OR NULL) data2_size, COUNT(TO_DAYS(INTIME)=TO_DAYS(NOW()) AND STATUS=0 OR NULL) data2_day FROM EXPRESS";
    // 用于查詢資料庫中的所有快遞資訊
    public static final String SQL_FIND_ALL = "SELECT * FROM EXPRESS";
    // 用于分頁查詢資料庫中的快遞資訊
    public static final String SQL_FIND_LIMIT = "SELECT * FROM EXPRESS LIMIT ?,?";
    // 通過取件碼查詢快遞資訊
    public static final String SQL_FIND_BY_CODE = "SELECT * FROM EXPRESS WHERE CODE=?";
    // 通過快遞單号查詢快遞資訊
    public static final String SQL_FIND_BY_NUMBER = "SELECT * FROM EXPRESS WHERE NUMBER=?";
    // 通過錄入人手機号查詢快遞資訊
    public static final String SQL_FIND_BY_SYSPHONE = "SELECT * FROM EXPRESS WHERE SYSPHONE=?";
    // 通過使用者手機号查詢使用者所有快遞
    public static final String SQL_FIND_BY_USERPHONE = "SELECT * FROM EXPRESS WHERE USERPHONE=?";
    // 錄入快遞
    public static final String SQL_INSERT = "INSERT INTO EXPRESS (NUMBER,USERNAME,USERPHONE,COMPANY,CODE,INTIME,STATUS,SYSPHONE) VALUES(?,?,?,?,?,NOW(),0,?)";
    // 快遞修改
    public static final String SQL_UPDATE = "UPDATE EXPRESS SET NUMBER=?,USERNAME=?,COMPANY=?,STATUS=? WHERE ID=?";
    // 快遞的狀态碼改變(取件)
    public static final String SQL_UPDATE_STATUS = "UPDATE EXPRESS SET STATUS=1,OUTTIME=NOW(),CODE=NULL WHERE CODE=?";
    // 快遞的删除
    public static final String SQL_DELETE = "DELETE FROM EXPRESS WHERE ID=?";
           

5,Dao編寫+Dao測試

5.1 ExpressDao實作類編寫

package com.xxy.dao.impl;

import com.xxy.bean.Express;
import com.xxy.dao.BaseExpressDao;
import com.xxy.util.DruidUtil;
import com.xxy.exception.DuplicateCodeException;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExpressDaoMysql implements BaseExpressDao {
    // 這裡統一使用大寫 如果不是大寫的話後面會自動轉換為大寫
    // 用于查詢資料庫中的全部快遞(總數+新增),待取件快遞(總數+新增)
    public static final String SQL_CONSOLE = "SELECT COUNT(ID) data1_size, COUNT(TO_DAYS(INTIME)=TO_DAYS(NOW()) OR NULL) data1_day, COUNT(STATUS=0 OR NULL) data2_size, COUNT(TO_DAYS(INTIME)=TO_DAYS(NOW()) AND STATUS=0 OR NULL) data2_day FROM EXPRESS";
    // 用于查詢資料庫中的所有快遞資訊
    public static final String SQL_FIND_ALL = "SELECT * FROM EXPRESS";
    // 用于分頁查詢資料庫中的快遞資訊
    public static final String SQL_FIND_LIMIT = "SELECT * FROM EXPRESS LIMIT ?,?";
    // 通過取件碼查詢快遞資訊
    public static final String SQL_FIND_BY_CODE = "SELECT * FROM EXPRESS WHERE CODE=?";
    // 通過快遞單号查詢快遞資訊
    public static final String SQL_FIND_BY_NUMBER = "SELECT * FROM EXPRESS WHERE NUMBER=?";
    // 通過錄入人手機号查詢快遞資訊
    public static final String SQL_FIND_BY_SYSPHONE = "SELECT * FROM EXPRESS WHERE SYSPHONE=?";
    // 通過使用者手機号查詢使用者所有快遞
    public static final String SQL_FIND_BY_USERPHONE = "SELECT * FROM EXPRESS WHERE USERPHONE=?";
    // 錄入快遞
    public static final String SQL_INSERT = "INSERT INTO EXPRESS (NUMBER,USERNAME,USERPHONE,COMPANY,CODE,INTIME,STATUS,SYSPHONE) VALUES(?,?,?,?,?,NOW(),0,?)";
    // 快遞修改
    public static final String SQL_UPDATE = "UPDATE EXPRESS SET NUMBER=?,USERNAME=?,COMPANY=?,STATUS=? WHERE ID=?";
    // 快遞的狀态碼改變(取件)
    public static final String SQL_UPDATE_STATUS = "UPDATE EXPRESS SET STATUS=1,OUTTIME=NOW(),CODE=NULL WHERE CODE=?";
    // 快遞的删除
    public static final String SQL_DELETE = "DELETE FROM EXPRESS WHERE ID=?";

    /**
     * 用于查詢資料庫中的全部快遞(總數+新增),待取件快遞(總數+新增)
     *
     * @return [{size:總數,day:新增},{size:總數,day:新增}]
     */
    @Override
    public List<Map<String, Integer>> console() {
        List<Map<String, Integer>> data = new ArrayList<>();

        // 1 擷取資料庫連接配接
        Connection connection = DruidUtil.getConnection();
        PreparedStatement statement = null;// 變量向上抽取,便于釋放資源
        ResultSet result = null;

        try {
            // 2 預編譯SQL語句
            statement = connection.prepareStatement(SQL_CONSOLE);

            // 3 填充參數(可選)

            // 4 執行SQL語句
            result = statement.executeQuery();

            // 5 獲得執行結果
            if (result.next()) {
                int data1_size = result.getInt("data1_size");
                int data1_day = result.getInt("data1_day");
                int data2_size = result.getInt("data2_size");
                int data2_day = result.getInt("data2_day");
                Map data1 = new HashMap();
                data1.put("data1_size", data1_size);
                data1.put("data1_day", data1_day);
                Map data2 = new HashMap();
                data2.put("data2_size", data2_size);
                data2.put("data2_day", data2_day);
                data.add(data1);
                data.add(data2);
            }


        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            DruidUtil.close(connection, statement, result);
        }
        return data;
    }

    /**
     * 用于查詢所有快遞
     *
     * @param limit      是否分頁的标記,true表示分頁。false表示查詢所有快遞
     * @param offset     SQL語句的起始索引
     * @param pageNumber 頁查詢的數量
     * @return 快遞的集合
     */
    @Override
    public List<Express> findAll(boolean limit, int offset, int pageNumber) {
        ArrayList<Express> data = new ArrayList<>();
        //1.    擷取資料庫的連接配接
        Connection conn = DruidUtil.getConnection();
        PreparedStatement state = null;
        ResultSet result = null;
        //2.    預編譯SQL語句
        try {
            if(limit) {
                state = conn.prepareStatement(SQL_FIND_LIMIT);
                //3.    填充參數(可選)
                state.setInt(1,offset);
                state.setInt(2,pageNumber);
            } else {
                state = conn.prepareStatement(SQL_FIND_ALL);
            }

            //4.    執行SQL語句
            result = state.executeQuery();

            //5.    擷取執行的結果
            while(result.next()) {
                int id = result.getInt("id");
                String number = result.getString("number");
                String username = result.getString("username");
                String userPhone = result.getString("userPhone");
                String company = result.getString("company");
                String code = result.getString("code");
                Timestamp inTime = result.getTimestamp("inTime");
                Timestamp outTime = result.getTimestamp("outTime");
                int status = result.getInt("status");
                String sysPhone = result.getString("sysPhone");
                Express e = new Express(id,number,username,userPhone,company,code,inTime,outTime,status,sysPhone);
                data.add(e);
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            //6.    資源的釋放
            DruidUtil.close(conn,state,result);
        }
        return data;
    }

    /**
     * 根據快遞單号,查詢快遞資訊
     *
     * @param number 單号
     * @return 查詢的快遞資訊,單号不存在時傳回null
     */
    @Override
    public Express findByNumber(String number) {
        // 1 擷取資料庫連接配接
        Connection connection = DruidUtil.getConnection();
        PreparedStatement statement = null;
        ResultSet result = null;

        try {
            // 2 預編譯SQL語句
            statement = connection.prepareStatement(SQL_FIND_BY_NUMBER);

            // 3 填充參數(可選)
            statement.setString(1, number);

            // 4 執行SQL語句
            result = statement.executeQuery();

            // 5 獲得執行結果
            if (result.next()) {
                int id = result.getInt("id");
                String username = result.getString("username");
                String userPhone = result.getString("userPhone");
                String company = result.getString("company");
                String code = result.getString("code");
                Timestamp inTime = result.getTimestamp("inTime");
                Timestamp outTime = result.getTimestamp("outTime");
                int status = result.getInt("status");
                String sysPhone = result.getString("sysPhone");
                Express e = new Express(id,number,username,userPhone,company,code,inTime,outTime,status,sysPhone);
                return  e;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            DruidUtil.close(connection, statement, result);
        }
        return null;
    }

    /**
     * 根據快遞取件碼,查詢快遞資訊
     *
     * @param code 取件碼
     * @return 查詢的快遞資訊,取件碼不存在時傳回null
     */
    @Override
    public Express findByCode(String code) {
        // 1 擷取資料庫連接配接
        Connection connection = DruidUtil.getConnection();
        PreparedStatement statement = null;
        ResultSet result = null;

        try {
            // 2 預編譯SQL語句
            statement = connection.prepareStatement(SQL_FIND_BY_CODE);

            // 3 填充參數(可選)
            statement.setString(1, code);

            // 4 執行SQL語句
            result = statement.executeQuery();

            // 5 獲得執行結果
            if (result.next()) {
                int id = result.getInt("id");
                String number = result.getString("number");
                String username = result.getString("username");
                String userPhone = result.getString("userPhone");
                String company = result.getString("company");
                Timestamp inTime = result.getTimestamp("inTime");
                Timestamp outTime = result.getTimestamp("outTime");
                int status = result.getInt("status");
                String sysPhone = result.getString("sysPhone");
                Express e = new Express(id,number,username,userPhone,company,code,inTime,outTime,status,sysPhone);
                return  e;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            DruidUtil.close(connection, statement, result);
        }
        return null;
    }

    /**
     * 根據使用者手機号碼,查詢他所有的快遞資訊
     *
     * @param userPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    @Override
    public List<Express> findByUserPhone(String userPhone) {
        List<Express> data = new ArrayList<>();
        // 1 擷取資料庫連接配接
        Connection connection = DruidUtil.getConnection();
        PreparedStatement statement = null;
        ResultSet result = null;

        try {
            // 2 預編譯SQL語句
            statement = connection.prepareStatement(SQL_FIND_BY_USERPHONE);

            // 3 填充參數(可選)
            statement.setString(1, userPhone);

            // 4 執行SQL語句
            result = statement.executeQuery();

            // 5 獲得執行結果
            while (result.next()) {
                int id = result.getInt("id");
                String number = result.getString("number");
                String username = result.getString("username");
                String company = result.getString("company");
                String code = result.getString("code");
                Timestamp inTime = result.getTimestamp("inTime");
                Timestamp outTime = result.getTimestamp("outTime");
                int status = result.getInt("status");
                String sysPhone = result.getString("sysPhone");
                Express e = new Express(id,number,username,userPhone,company,code,inTime,outTime,status,sysPhone);
                data.add(e);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            DruidUtil.close(connection, statement, result);
        }
        return data;
    }

    /**
     * 根據錄入人手機号碼,查詢錄入的所有記錄
     *
     * @param sysPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    @Override
    public List<Express> findBySysPhone(String sysPhone) {
        List<Express> data = new ArrayList<>();
        // 1 擷取資料庫連接配接
        Connection connection = DruidUtil.getConnection();
        PreparedStatement statement = null;
        ResultSet result = null;

        try {
            // 2 預編譯SQL語句
            statement = connection.prepareStatement(SQL_FIND_BY_SYSPHONE);

            // 3 填充參數(可選)
            statement.setString(1, sysPhone);

            // 4 執行SQL語句
            result = statement.executeQuery();

            // 5 獲得執行結果
            while (result.next()) {
                int id = result.getInt("id");
                String number = result.getString("number");
                String username = result.getString("username");
                String userPhone = result.getString("userPhone");
                String company = result.getString("company");
                String code = result.getString("code");
                Timestamp inTime = result.getTimestamp("inTime");
                Timestamp outTime = result.getTimestamp("outTime");
                int status = result.getInt("status");
                Express e = new Express(id,number,username,userPhone,company,code,inTime,outTime,status,sysPhone);
                data.add(e);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            DruidUtil.close(connection, statement, result);
        }
        return data;
    }

    /**
     * 快遞的錄入
     *
     * @param e 要錄入的快遞對象
     * @return 錄入的結果,true表示成功,false表示失敗
     */
    @Override
    public boolean insert(Express e) throws DuplicateCodeException {
        //1.    連接配接的擷取
        Connection conn = DruidUtil.getConnection();
        //2.    預編譯SQL語句
        PreparedStatement state = null;
        try {
            state = conn.prepareStatement(SQL_INSERT);
            //3.    填充參數
            state.setString(1,e.getNumber());
            state.setString(2,e.getUsername());
            state.setString(3,e.getUserphone());
            state.setString(4,e.getCompany());
            state.setString(5,e.getCode());
            state.setString(6,e.getSysPhone());
            //4.    執行SQL語句,并擷取執行結果
            return state.executeUpdate()>0?true:false;
        } catch (SQLException e1) {
            /*throwables.printStackTrace();*/
            if(e1.getMessage().endsWith("for key 'code'")){
                //是因為取件碼重複,而出現了異常
                DuplicateCodeException e2 = new DuplicateCodeException(e1.getMessage());
                throw e2;
            }else{
                e1.printStackTrace();
            }
        }finally {
            //5.    釋放資源
            DruidUtil.close(conn,state,null);
        }
        return false;
    }

    /**
     * 快遞的修改
     *
     * @param id         要修改的快遞id
     * @param newExpress 新的快遞對象(number,company,username,userPhone)
     * @return 修改的結果,true表示成功,false表示失敗
     */
    @Override
    public boolean update(int id, Express newExpress) {
        //1.    連接配接的擷取
        Connection conn = DruidUtil.getConnection();
        PreparedStatement state = null;
        //2.    預編譯SQL語句
        try {
            state = conn.prepareStatement(SQL_UPDATE);
            state.setString(1,newExpress.getNumber());
            state.setString(2,newExpress.getUsername());
            state.setString(3,newExpress.getCompany());
            state.setInt(4,newExpress.getStatus());
            state.setInt(5,id);
            return state.executeUpdate()>0?true:false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DruidUtil.close(conn,state,null);
        }
        return false;
    }

    /**
     * 更改快遞的狀态為1,表示取件完成
     *
     * @param code 要修改的快遞取件碼
     * @return 修改的結果,true表示成功,false表示失敗
     */
    @Override
    public boolean updateStatus(String code) {
        //1.    連接配接的擷取
        Connection conn = DruidUtil.getConnection();
        PreparedStatement state = null;
        //2.    預編譯SQL語句
        try {
            state = conn.prepareStatement(SQL_UPDATE_STATUS);
            state.setString(1, code);
            return state.executeUpdate()>0?true:false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DruidUtil.close(conn,state,null);
        }
        return false;
    }

    /**
     * 根據id,删除單個快遞資訊
     *
     * @param id 要删除的快遞id
     * @return 删除的結果,true表示成功,false表示失敗
     */
    @Override
    public boolean delete(int id) {
        //1.    連接配接的擷取
        Connection conn = DruidUtil.getConnection();
        PreparedStatement state = null;
        //2.    預編譯SQL語句
        try {
            state = conn.prepareStatement(SQL_DELETE);
            state.setInt(1,id);
            return state.executeUpdate()>0?true:false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DruidUtil.close(conn,state,null);
        }
        return false;
    }
}
           

5.2 Dao測試

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

 Ctrl+Shift+T:生成測試類

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

這裡提供了部分測試的代碼實作

package com.xxy.dao.impl;

import com.xxy.bean.Express;
import com.xxy.exception.DuplicateCodeException;
import org.junit.Test;

import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

public class ExpressDaoMysqlTest {
    ExpressDaoMysql dao = new ExpressDaoMysql();

    @Test
    public void console() {
        List<Map<String, Integer>> console = dao.console();
        System.out.println(console);
    }

    @Test
    public void findAll() {
//        List<Express> all = dao.findAll(true, 2, 3);// 從2開始查3個(offset從0開始)
        List<Express> all = dao.findAll(false, 0, 0);
        System.out.println(all);
    }

    @Test
    public void findByNumber() {
        Express e = dao.findByNumber("103");
        System.out.println(e);
    }

    @Test
    public void findByCode() {
        Express e = dao.findByCode("123456");
        System.out.println(e);
    }

    @Test
    public void findByUserPhone() {
        List<Express> byUserPhone = dao.findByUserPhone("13838411438");
        System.out.println(byUserPhone);
    }

    @Test
    public void findBySysPhone() {
        List<Express> bySysPhone = dao.findBySysPhone("16666666666");
        System.out.println(bySysPhone);
    }

    @Test
    public void insert() {
        Express e = new Express("123","迪盧克","18516955565","順豐快遞","123456","18888888888");
        boolean result = false;
        try {
            result = dao.insert(e);
        } catch (DuplicateCodeException e1) {
            System.out.println("捕擷取件碼重複異常");
        }
        System.out.println(result);
    }

    @Test
    public void update() {

    }

    @Test
    public void updateStatus() {
    }

    @Test
    public void delete() {
    }
}
           

5.3 自定義異常

當随機生成的取件碼code(不是快遞單号number)重複時,應該給出資訊,并針對此資訊進行調整,避免直接報錯(service層對該問題詳細處理,這裡隻負責捕獲)

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

繼承Exception,并初始化兩個構造方法

package com.xxy.exception;

public class DuplicateCodeException extends Exception {
    /**
     * Constructs a new exception with {@code null} as its detail message.
     * The cause is not initialized, and may subsequently be initialized by a
     * call to {@link #initCause}.
     */
    public DuplicateCodeException() {
    }

    /**
     * Constructs a new exception with the specified detail message.  The
     * cause is not initialized, and may subsequently be initialized by
     * a call to {@link #initCause}.
     *
     * @param message the detail message. The detail message is saved for
     *                later retrieval by the {@link #getMessage()} method.
     */
    public DuplicateCodeException(String message) {
        super(message);
    }
}
           

 在ExpressDao實作類中識别該異常并抛出

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

測試類中捕獲并顯示該異常

07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程
07-項目訓練_流程與快遞表格建立~Express Service編寫一,主要流程二,編碼過程

6,ExpressService編寫

注意裡面的方法是static類型

package com.xxy.service;

import com.xxy.bean.Express;
import com.xxy.dao.BaseExpressDao;
import com.xxy.dao.impl.ExpressDaoMysql;
import com.xxy.exception.DuplicateCodeException;
import com.xxy.util.RandomUtil;

import java.util.List;
import java.util.Map;

public class ExpressService {
    private static BaseExpressDao dao = new ExpressDaoMysql();

    /**
     * 用于查詢資料庫中的全部快遞(總數+新增),待取件快遞(總數+新增)
     *
     * @return [{size:總數,day:新增},{size:總數,day:新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查詢所有快遞
     *
     * @param limit      是否分頁的标記,true表示分頁。false表示查詢所有快遞
     * @param offset     SQL語句的起始索引
     * @param pageNumber 頁查詢的數量
     * @return 快遞的集合
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * 根據快遞單号,查詢快遞資訊
     *
     * @param number 單号
     * @return 查詢的快遞資訊,單号不存在時傳回null
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根據快遞取件碼,查詢快遞資訊
     *
     * @param code 取件碼
     * @return 查詢的快遞資訊,取件碼不存在時傳回null
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根據使用者手機号碼,查詢他所有的快遞資訊
     *
     * @param userPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone((userPhone));
    }

    /**
     * 根據錄入人手機号碼,查詢錄入的所有記錄
     *
     * @param sysPhone 手機号碼
     * @return 查詢的快遞資訊清單
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快遞的錄入
     *
     * @param e 要錄入的快遞對象
     * @return 錄入的結果,true表示成功,false表示失敗
     */
    public static boolean insert(Express e) {
        e.setCode(RandomUtil.getCode()+"");
        try {
            return dao.insert(e);
        } catch (DuplicateCodeException e1) {
            // 捕獲到取件碼重複後 遞歸調用插入
            return insert(e);
        }
    }

    /**
     * 快遞的修改
     *
     * @param id         要修改的快遞id
     * @param newExpress 新的快遞對象(number,company,username,userPhone)
     * @return 修改的結果,true表示成功,false表示失敗
     */
    public static boolean update(int id, Express newExpress) {
        // ExpressDao實作類裡關于update的操作也不是很清楚 這裡插個眼,後面有問題再來修改
        // 個人了解:當有修改收件人号碼的需求時,由于涉及到重發短信的業務,需要重新執行插入(插入時,會向使用者發送短信)
        if (newExpress.getUserphone() != null) {
            dao.delete(id);
            return insert(newExpress);
        } else {
            // 這裡的邏輯感覺不是很清晰,後面有問題再來修改吧
            boolean update = dao.update(id, newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if (newExpress.getStatus() == 1) {
                updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * 更改快遞的狀态為1,表示取件完成
     *
     * @param code 要修改的快遞取件碼
     * @return 修改的結果,true表示成功,false表示失敗
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根據id,删除單個快遞資訊
     *
     * @param id 要删除的快遞id
     * @return 删除的結果,true表示成功,false表示失敗
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
           

用到的工具類RandomUtil

package com.xxy.util;

import java.util.Random;

public class RandomUtil {
    private static Random r = new Random();

    public static int getCode() { return r.nextInt(900000) + 100000; }
}
           

章節彙總在這裡(づ ̄3 ̄)づ╭❤~@&再見螢火蟲&【07-項目訓練】

對學習Java感興趣的同學歡迎加入QQ學習交流群:1126298731

有問題歡迎提問,大家一起在學習Java的路上打怪更新!(o゜▽゜)o☆[BINGO!]