目录

一,主要流程

二,编码过程

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() {}@Overridepublic String toString() {return "Express{" +"id=" + id +", number='" + number + '\'' +", username='" + username + '\'' +", userphone='" + userphone + '\'' +", company='" + company + '\'' +", code='" + code + '\'' +", intime=" + intime +", outtime=" + outtime +", status=" + status +", sysPhone='" + sysPhone + '\'' +'}';}@Overridepublic 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);}@Overridepublic 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:要修改的快递id2.    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:新增}]*/@Overridepublic 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 快递的集合*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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 查询的快递信息列表*/@Overridepublic 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 查询的快递信息列表*/@Overridepublic 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表示失败*/@Overridepublic 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表示失败*/@Overridepublic 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表示失败*/@Overridepublic 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表示失败*/@Overridepublic 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();@Testpublic void console() {List<Map<String, Integer>> console = dao.console();System.out.println(console);}@Testpublic 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);}@Testpublic void findByNumber() {Express e = dao.findByNumber("103");System.out.println(e);}@Testpublic void findByCode() {Express e = dao.findByCode("123456");System.out.println(e);}@Testpublic void findByUserPhone() {List<Express> byUserPhone = dao.findByUserPhone("13838411438");System.out.println(byUserPhone);}@Testpublic void findBySysPhone() {List<Express> bySysPhone = dao.findBySysPhone("16666666666");System.out.println(bySysPhone);}@Testpublic 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);}@Testpublic void update() {}@Testpublic void updateStatus() {}@Testpublic 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!]

07-项目训练_流程与快递表格创建~Express Service编写相关推荐

  1. JavaEE项目实战_流程审批之二

    JavaEE项目实战_流程审批之二 这部分的程序界面原型如下: 1. 请假页面: 员工如需请假,在登录系统后,点击请假功能,填写各项数据后,提交审批.也可以暂时不提交,将内容保存为草稿.以后可以加入功 ...

  2. swift编写的项目源代码_通过在Swift中命名模型来编写简洁的代码

    swift编写的项目源代码 I have been using namespaced models a lot recently in my projects and at work, so I de ...

  3. apache geode项目结构_使用IntelliJ IDEA+Maven 创建、开发、管理项目

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 来源:http://1t.click/ag4d # 前言 本篇开发环境 1.操作系统:Windows 10 X642.Java SDK: ...

  4. C语言学习笔记第五天_项目训练

    C语言学习笔记第五天_项目训练 添加自定义的一个函数库文件 <getch.h> 步骤: 1.在windows中把getch.h放入共享文件夹(文件我放在文末,自取) 2.在Ubuntu终端 ...

  5. JavaEE项目实战(OA系统)之十八_流程审批之一

    JavaEE项目实战(OA系统)之十八_流程审批之一 下面介绍OA系统的另一模块:流程审批. OA系统推崇的是无纸化办公,因此各项事务的流程审批是OA系统的一大类应用. 下面,我们来设计流程审批的数据 ...

  6. 项目方案讨论会流程_讨论本文可能的解决方案

    项目方案讨论会流程 The text passage must include use-case description, problem description, identifiable feat ...

  7. 测试环境搭建流程_案例解析:一个完整的项目测试方案流程,应该是怎么的?...

    作为一名软件测试工程师,为项目制作完成的测试方案并执行,是我们日常工作的重要部分,同时,也是一名合格的软件测试工程师应有的专业素养.那么,很多小白和测试新手肯定要问了:一个完整的项目测试方案流程,应该 ...

  8. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

  9. java达内项目_达内课程:完成一个项目的整个流程

    感谢达内,在这里,我首先学到的知识是C#基础知识,了解了.Net编译器原理.主要发行版本.应用范围以及如何创建一个HelloWorld程序,学会一些简单的Dos命令操作及Net文本编辑器Vs. 一周的 ...

最新文章

  1. Python中时间戳与时间字符串相互转换
  2. Oracle-HWM(High Water Mark) 高水位解读
  3. 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]
  4. 小程序素材抓取软件_如何抓取微信小程序的数据?
  5. WordPress数据库管理中五个实用的phpMyAdmin技巧
  6. THD 变量存入threads中
  7. table 的 id 属性不被 document.getElementById支持
  8. .Net Core + NGINX跳转登录时端口丢失
  9. 好好学习 天天编程—C语言之我的第一个hello world(二)
  10. 80后营销人如何为理想插上丰满“羽翼”?
  11. spark sql练习之join操作
  12. 华为融合位置服务器,融合服务器
  13. Javascript 笔记与总结(1-3)arguments
  14. DELL win10插入耳机后声音仍然外放(亲测有效)
  15. 翁恺C语言程序设计网课笔记合集
  16. 专科学计算机编程,学编程怎么才能学的又快又好?
  17. 红帽子linux2017安装,Firefox 49发布 - 在RedHat和Debian系统上安装
  18. 吴峰光杀进 Linux 内核
  19. 前端如何设置浏览器窗口的网站logo
  20. [阅读笔记] - 秦汉政治

热门文章

  1. 如何给孩子取个优雅的名字
  2. Kymeta加入美国陆军装甲旅战斗队试点项目
  3. mysql 初次进入_怎么初次进入mysql?
  4. AMS1117稳压模块
  5. 【LVS+Keepalived】 LVS+Keepalived实现tcp、udp负载均衡及HA高可用
  6. 分时操作系统(20世纪70年代)
  7. 利用单片机串口实现甲乙两机的数据传输
  8. 一键卸载cad,强力卸载cad,强力删除autodesk,完美卸载max,彻底卸载revit,彻底删除autodesk的任何软件
  9. c log 指定服务器,解决 SQL2000安装程序配置服务器失败。参考服务器错误日志和C:\WINDOWS\sqlstp.log方法...
  10. oem客户工程流程图_SFIS质量管理系统工作流程图