目錄
一,主要流程
二,編碼過程
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
一,主要流程
二,編碼過程
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屬性需要在索引欄進行相關配置
生成表格對應的實體類
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表添加記錄
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測試
Ctrl+Shift+T:生成測試類
這裡提供了部分測試的代碼實作
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層對該問題詳細處理,這裡隻負責捕獲)
繼承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實作類中識别該異常并抛出
測試類中捕獲并顯示該異常
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!]