【项目实践】SMBMS(Javaweb版)(六)订单模块

订单管理

前期准备

  1. 创建供应商 、bill 的servlet
  2. 注册 bill 的servlet
  3. 创建相关的Dao,Service,javaBean等
  4. 导入相关的jsp

新增订单

billDao

  1. billDao
    boolean addBill(Connection connection, Bill bill) throws SQLException;

  1. billDaoImpl
    /**
     * @param connection 数据库连接对象
     * @param bill       订单对象
     * @return 添加结果
     */
    @Override
    public boolean addBill(Connection connection, Bill bill) throws SQLException {

        boolean addFlag = false;
        int addRows;

        PreparedStatement preparedStatement;
        String sql = "insert into smbms_bill values (null,?,?,?,?,?,?,?,?,?,?,?,?)";

        preparedStatement = connection.prepareStatement(sql);

        Object[] params = {
                bill.getBillCode(),
                bill.getProductName(),
                bill.getProductDesc(),
                bill.getProductUnit(),
                bill.getProductCount(),
                bill.getTotalPrice(),
                bill.getIsPayment(),
                bill.getCreatedBy(),
                bill.getCreationDate(),
                bill.getModifyBy(),
                bill.getModifyDate(),
                bill.getProviderId()
        };

        addRows = BaseDao.executeUpdate(connection, sql, preparedStatement, params);

        if (addRows > 0) {
            addFlag = true;
        }

        BaseDao.closeResource(connection, preparedStatement, null);

        return addFlag;
    }
s

billService

  1. billService
    boolean addBill(Bill bill) throws SQLException;

  1. billServiceImpl
    /**
     * 添加账单到数据库
     * <p>
     * 此方法负责将一个账单对象添加到数据库中它首先获取一个数据库连接,
     * 然后尝试使用账单DAO的addBill方法将账单添加到数据库中
     * 如果在添加过程中遇到SQLException,将抛出RuntimeException
     * 最后,无论添加是否成功,都会关闭数据库资源
     *
     * @param bill 要添加到数据库的账单对象,包含账单的所有必要信息
     * @return boolean 表示账单是否成功添加到数据库中当前方法中此参数未被使用
     */
    @Override
    public boolean addBill(Bill bill) throws SQLException {

        Connection conn = null;
        boolean addFlag = false;

        try {
            // 获取数据库连接
            conn = BaseDao.connection();
            conn.setAutoCommit(false);
            // 调用账单DAO的添加方法,执行账单添加操作
            addFlag = billDao.addBill(conn, bill);
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            conn.rollback();
        } finally {
            // 关闭数据库资源,确保连接被释放回连接池
            BaseDao.closeResource(conn, null, null);
        }

        return addFlag;
    }

billServlet

  1. billServlet
    /**
     * 获取账单列表
     * <p>
     * 此方法负责处理账单查询请求,根据不同的查询条件(如产品名称、供应商ID、是否已支付),
     * 从数据库中获取相应的账单信息,并进行分页处理,最后将结果展示在页面上
     *
     * @param req  用于获取请求参数和设置请求属性
     * @param resp 用于实现请求转发或重定向
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果输入输出操作失败
     */
    private void getBill(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 默认值初始化
        String productName = "";
        int isPayment = 0;
        int providerId = 0;

        // 获取request参数
        String queryProductName = req.getParameter("queryProductName");
        String queryProviderId = req.getParameter("queryProviderId");
        String queryIsPayment = req.getParameter("queryIsPayment");
        String pageIndex = req.getParameter("pageIndex");

        // 默认分页设置
        int currentPageNo = 1;
        int pageSize = 5;

        // TODO: 处理查询条件,确保空值安全,isPayment、providerId --> int
        queryProductName = queryProductName == null ? "" : queryProductName;
        queryProviderId = queryProviderId == null ? "" : queryProviderId;
        queryIsPayment = queryIsPayment == null ? "" : queryIsPayment;
        currentPageNo = pageIndex == null ? currentPageNo : Integer.parseInt(pageIndex);

        // 创建BillService实例
        BillService billService = new BillServiceImpl();

        // 获取账单总数
        int totalCount = billService.getBillCount(queryProductName, queryProviderId,
                queryIsPayment);

        // 创建PageSupport实例用于分页处理
        PageSupport pageSupport = new PageSupport();

        // 设置分页参数
        pageSupport.setTotalCount(totalCount);
        pageSupport.setPageIndex(currentPageNo);
        pageSupport.setPageSize(pageSize);

        // 计算总页数
        int totalPageCount = pageSupport.getTotalPageCount();

        // 校验当前页码
        if (currentPageNo < 1) {
            currentPageNo = 1;
        } else if (currentPageNo > totalPageCount) {
            currentPageNo = totalPageCount;
        }

        // 获取账单列表
        List<Bill> billList = billService.getBillList(queryProductName, queryProviderId,
                queryIsPayment);

        // 处理完的数据存到request中,用于页面展示
        req.setAttribute("billList", billList);
        req.setAttribute("queryProductName", queryProductName);
        req.setAttribute("queryProviderId", queryProviderId);
        req.setAttribute("queryIsPayment", queryIsPayment);

        req.setAttribute("totalPageCount", totalPageCount);
        req.setAttribute("totalCount", totalCount);
        req.setAttribute("currentPageNo", currentPageNo);

        // 跳转到list页面
        req.getRequestDispatcher("/billlist.jsp").forward(req, resp);

    }
  1. web.xml
    <servlet>
        <servlet-name>BillServlet</servlet-name>
        <servlet-class>com.dashangms.servlet.bill.BillServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BillServlet</servlet-name>
        <url-pattern>/jsp/bill.do</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>BillServlet</servlet-name>
        <url-pattern>/bill</url-pattern>
    </servlet-mapping>

jsp

<a href="${pageContext.request.contextPath}/jsp/billadd.jsp">添加订单</a>

取消订单

billDao

  1. billDao
int deleteBill(Connection connection, int delId) throws SQLException;
  1. billDaoImpl
/**
 * 根据给定的数据库连接和ID删除账单记录
 *
 * @param connection 数据库连接对象,用于执行SQL语句
 * @param delId      要删除的账单的ID
 * @return 返回删除的行数,表示删除成功的记录数
 * @throws SQLException 如果执行SQL语句时发生错误
 */
@Override
public int deleteBill(Connection connection, int delId) throws SQLException {

    // 初始化删除的行数为0
    int deletedRows = 0;
    // 初始化PreparedStatement对象为null,用于执行SQL语句
    PreparedStatement preparedStatement = null;

    // 检查数据库连接是否不为null
    if (connection != null) {
        // 定义SQL语句,用于删除指定ID的账单记录
        String sql = "delete from smbms_bill where id=?";
        // 准备SQL语句
        preparedStatement = connection.prepareStatement(sql);

        // 创建一个包含要删除账单ID的参数数组
        Object[] param = {delId};

        // 执行更新操作并获取删除的行数
        deletedRows = BaseDao.executeUpdate(connection, sql, preparedStatement, param);
    }
    // 关闭数据库资源
    BaseDao.closeResource(connection, preparedStatement, null);

    // 返回删除的行数
    return deletedRows;
}

billService

  1. billService
    boolean deleteBill(String delId) throws SQLException;
  1. billServiceImpl
    /**
     * 根据ID删除账单
     *
     * @param delId 要删除的账单的ID
     * @return 如果删除成功,返回true;否则返回false
     * @throws SQLException 如果与数据库交互时发生错误,抛出此异常
     */
    @Override
    public boolean deleteBill(String delId) throws SQLException {

        // 初始化删除标志为false
        boolean deleteFlag = false;

        int delIdTmp = Integer.parseInt(delId != null ? delId : "0");

        // 定义数据库连接对象
        Connection conn = null;
        try {
            // 获取数据库连接
            conn = BaseDao.connection();
            // 设置手动管理事务
            conn.setAutoCommit(false);

            // 调用Dao层方法,执行删除操作
            int deleteRows = billDao.deleteBill(conn, delIdTmp);

            // 检查删除的行数,如果大于0,表示删除成功
            if (deleteRows > 0) {
                deleteFlag = true;
            }
            // 提交事务
            conn.commit();

        } catch (SQLException e) {
            // 打印异常信息
            e.printStackTrace();
            // 回滚事务
            conn.rollback();

        } finally {
            // 关闭数据库资源
            BaseDao.closeResource(conn, null, null);
        }

        // 返回删除标志
        return deleteFlag;
    }

billServlet

  1. billServlet
    /**
     * 删除账单操作
     *
     * 此方法用于处理从 HttpServletRequest 请求中获取的删除账单指令
     * 它调用 BillService 接口的实现来执行实际的删除操作,并根据删除结果
     * 设置 session 属性以提供反馈信息,然后重定向到账单查询页面
     *
     * @param req 用于获取删除指令的 HTTP 请求对象
     * @param resp 用于重定向到查询页面的 HTTP 响应对象
     * @throws ServletException 如果 Servlet 操作失败
     * @throws IOException 如果输入/输出操作失败
     * @throws SQLException 如果与数据库的交互操作失败
     */
    private void delBill(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, SQLException {
        // 实例化 BillService 的实现类
        BillService billService = new BillServiceImpl();

        // 根据删除结果设置 session 属性和重定向消息
        if (billService.deleteBill(req.getParameter("delId"))) {
            req.getSession().setAttribute("message", "删除成功!");
        } else {
            req.getSession().setAttribute("message", "删除失败!");
        }
        // 重定向到账单查询页面
        resp.sendRedirect(req.getContextPath() + "/provider?method=query");
        // TODO: 前端使用ajax传递数据,需要转换为json格式
    }
  1. web.xml

jsp

<span><a class="deleteBill" href="javascript:;" billid=${bill.id} billcc=${bill.billCode}><img src="${pageContext.request.contextPath}/images/schu.png" alt="删除" title="删除"/></a></span>

更改订单信息

billDao

  1. billDao
int updateBill(Connection connection, Bill bill) throws SQLException;
  1. billDaoImpl
    /**
     * 更新账单信息
     *
     * @param connection 数据库连接对象,用于执行SQL语句
     * @param bill 账单对象,包含需要更新的账单信息
     * @return 返回受影响的行数,用于判断更新操作是否成功
     * @throws SQLException 如果执行SQL语句时发生错误,抛出此异常
     */
    @Override
    public int updateBill(Connection connection, Bill bill) throws SQLException {
        int updateRows = 0;

        PreparedStatement preparedStatement = null;

        // 定义更新账单信息的SQL语句
        String sql = "update smbms_bill set " +
                "billCode=?," +
                "productName=?, " +
                "productDesc=?," +
                "productUnit=?," +
                "productCount=?," +
                "totalPrice=?," +
                "isPayment=?," +
                "modifyBy=?," +
                "modifyDate=?," +
                "providerId=?" +
                "where id=?";

        // 准备SQL语句参数,按照顺序从bill对象中获取属性值
        Object[] params = {
                bill.getBillCode(),
                bill.getProductName(),
                bill.getProductDesc(),
                bill.getProductUnit(),
                bill.getProductCount(),
                bill.getTotalPrice(),
                bill.getIsPayment(),
                bill.getModifyBy(),
                bill.getModifyDate(),
                bill.getProviderId(),
                bill.getId()
        };

        // 执行更新操作并获取受影响的行数
        updateRows = BaseDao.executeUpdate(connection, sql, preparedStatement, params);

        // 关闭数据库连接
        BaseDao.closeConnection(connection);

        // 返回受影响的行数
        return updateRows;
    }

billService

  1. billService
boolean updateBill(Bill bill) throws SQLException;
  1. billServiceImpl
    /**
     * 更新账单信息
     *
     * @param bill 要更新的账单对象,包含账单的详细信息
     * @return 返回一个布尔值,表示账单信息是否更新成功
     * @throws SQLException 如果数据库操作失败,抛出SQLException
     */
    @Override
    public boolean updateBill(Bill bill) throws SQLException {
        // 初始化更新标志为false,用于表示账单信息是否更新成功
        boolean updateFlag = false;
        // 初始化更新行数为0,用于记录数据库中受影响的行数
        int updateRows = 0;
        // 声明数据库连接对象
        Connection conn = null;

        // 获取数据库连接updateBill
        try {
            // 获取数据库连接
            conn = BaseDao.connection();
            // 设置连接为手动管理事务
            conn.setAutoCommit(false);
            // 调用BillDao的updateBill方法更新账单信息
            updateRows = billDao.updateBill(conn, bill);
            // 提交事务
            conn.commit();
            // 如果更新行数大于0,表示账单信息更新成功
            if (updateRows > 0) {
                updateFlag = true;
            }
        } catch (Exception e) {
            // 打印异常信息
            e.printStackTrace();
            // 回滚事务
            conn.rollback();
        } finally {
            // 关闭数据库资源
            BaseDao.closeResource(conn, null, null);
        }

        // 返回更新标志
        return updateFlag;
    }

billServlet

  1. billServlet
    /**
     * 更新账单信息
     * 
     * @param req 用于获取请求参数和会话信息
     * @param resp 用于重定向页面
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException 如果输入/输出操作失败
     * @throws SQLException 如果数据库操作失败
     */
    private void updateBill(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, SQLException {
        // 实例化BillService接口和Bill类
        BillService billService = new BillServiceImpl();
        Bill bill = new Bill();
    
        // 从请求参数中设置账单属性
        bill.setBillCode(req.getParameter("billCode"));
        bill.setProductName(req.getParameter("productName"));
        bill.setProductDesc(req.getParameter("productDesc"));
        bill.setProductUnit(new BigDecimal(req.getParameter("productUnit")));
        bill.setProductCount(new BigDecimal(req.getParameter("productCount")));
        bill.setTotalPrice(req.getParameter("totalPrice"));
        bill.setIsPayment(Integer.parseInt(req.getParameter("isPayment")));
        bill.setProviderId(Integer.parseInt(req.getParameter("providerId")));
        bill.setId(Integer.parseInt(req.getParameter("id")));
        bill.setModifyBy(Integer.parseInt(req.getParameter("userId")));
        bill.setModifyDate(new Date());
    
        // 根据账单服务的更新结果决定重定向的页面和会话消息
        if (billService.updateBill(bill)) {
            req.getSession().setAttribute("message", "修改成功!");
            resp.sendRedirect(req.getContextPath() + "/provider?method=query");
        } else {
            req.getSession().setAttribute("message", "修改失败!");
            resp.sendRedirect(req.getContextPath() + "/provider?method=modify");
        }
    }
  1. web.xml

jsp

查询订单信息

billDao

  1. billDao
    List<Bill> queryBillBy(Connection connection, String queryProductName, String queryProviderId, String queryIsPayment ) throws SQLException;

  1. billDaoImpl
    /**
     * 查询订单详情
     * 根据请求过来的信息查询内容,返回结果,内容为空的时候显示所有订单
     *
     * @param connection       数据库连接对象
     * @param queryProductName 商品名称
     * @param queryProviderId  商品id
     * @param queryIsPayment   是否付款
     * @return 订单列表
     */
    @Override
    public List<Bill> queryBillBy(Connection connection, String queryProductName,
                                  String queryProviderId, String queryIsPayment) throws SQLException {
        ResultSet resultSet = null;
        List<Bill> billList = new ArrayList<>();
        List<Object> params = new ArrayList<>();

        PreparedStatement preparedStatement;
        String sql = "select * from smbms_bill ";

        if (queryProductName != null || queryProviderId != null || queryIsPayment != null) {
            sql += "where 1=1 ";
            if (queryProductName != null && !queryProductName.isEmpty()) {
                sql += "and productName like ? ";
                params.add("%" + queryProductName + "%");
            }
            if (queryProviderId != null && !queryProviderId.isEmpty()) {
                sql += "and providerId = ? ";
                params.add(queryProviderId);
            }
            if (queryIsPayment != null && !queryIsPayment.isEmpty()) {
                sql += "and isPayment = ? ";
                params.add(queryIsPayment);
            }
        }

        preparedStatement = connection.prepareStatement(sql);
        resultSet = BaseDao.executeQuery(connection, sql, preparedStatement, params.toArray(),
                resultSet);

        while (resultSet.next()) {
            billList.add(getBillList(resultSet));
        }

        BaseDao.closeResource(connection, preparedStatement, resultSet);

        return billList;
    }

billService

  1. billService
    /**
     * 获取所有订单列表
     *
     * @param queryProductName 商品名称
     * @param queryProviderId  供应商
     * @param queryIsPayment   是否付款
     * @return 订单列表
     */
    List<Bill> getBillList(String queryProductName,
                           String queryProviderId, String queryIsPayment);
  1. billServiceImpl
    /**
     * 获取所有订单列表
     *
     * @param queryProductName 商品名称
     * @param queryProviderId  供应商
     * @param queryIsPayment   是否付款
     * @return 订单列表
     */
    @Override
    public List<Bill> getBillList(String queryProductName, String queryProviderId,
                                  String queryIsPayment) {

        List<Bill> billList;
        Connection con = BaseDao.connection();

        try {
            billList = billDao.queryBillBy(con, queryProductName, queryProviderId, queryIsPayment);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            BaseDao.closeResource(con, null, null);
        }

        return billList;
    }

billServlet

  1. billServlet
    /**
     * 获取账单列表
     * <p>
     * 此方法负责处理账单查询请求,根据不同的查询条件(如产品名称、供应商ID、是否已支付),
     * 从数据库中获取相应的账单信息,并进行分页处理,最后将结果展示在页面上
     *
     * @param req  用于获取请求参数和设置请求属性
     * @param resp 用于实现请求转发或重定向
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果输入输出操作失败
     */
    private void getBill(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 默认值初始化
        String productName = "";
        int isPayment = 0;
        int providerId = 0;

        // 获取request参数
        String queryProductName = req.getParameter("queryProductName");
        String queryProviderId = req.getParameter("queryProviderId");
        String queryIsPayment = req.getParameter("queryIsPayment");
        String pageIndex = req.getParameter("pageIndex");

        // 默认分页设置
        int currentPageNo = 1;
        int pageSize = 5;

        // TODO: 处理查询条件,确保空值安全,isPayment、providerId --> int
        queryProductName = queryProductName == null ? "" : queryProductName;
        queryProviderId = queryProviderId == null ? "" : queryProviderId;
        queryIsPayment = queryIsPayment == null ? "" : queryIsPayment;
        currentPageNo = pageIndex == null ? currentPageNo : Integer.parseInt(pageIndex);

        // 创建BillService实例
        BillService billService = new BillServiceImpl();

        // 获取账单总数
        int totalCount = billService.getBillCount(queryProductName, queryProviderId,
                queryIsPayment);

        // 创建PageSupport实例用于分页处理
        PageSupport pageSupport = new PageSupport();

        // 设置分页参数
        pageSupport.setTotalCount(totalCount);
        pageSupport.setPageIndex(currentPageNo);
        pageSupport.setPageSize(pageSize);

        // 计算总页数
        int totalPageCount = pageSupport.getTotalPageCount();

        // 校验当前页码
        if (currentPageNo < 1) {
            currentPageNo = 1;
        } else if (currentPageNo > totalPageCount) {
            currentPageNo = totalPageCount;
        }

        // 获取账单列表
        List<Bill> billList = billService.getBillList(queryProductName, queryProviderId,
                queryIsPayment);

        // 处理完的数据存到request中,用于页面展示
        req.setAttribute("billList", billList);
        req.setAttribute("queryProductName", queryProductName);
        req.setAttribute("queryProviderId", queryProviderId);
        req.setAttribute("queryIsPayment", queryIsPayment);

        req.setAttribute("totalPageCount", totalPageCount);
        req.setAttribute("totalCount", totalCount);
        req.setAttribute("currentPageNo", currentPageNo);

        // 跳转到list页面
        req.getRequestDispatcher("/billlist.jsp").forward(req, resp);

    }
  1. web.xml

jsp

posted @ 2025-06-18 08:58  柯基大大  阅读(5)  评论(0)    收藏  举报  来源