【项目实践】SMBMS(Javaweb版)(五)供应商管理模块

供应商管理

前期准备

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

增加供应商

addProvider

PrivodeDao

  1. PrivodeDao
    int addProvider(Provider provider);
  1. PrivodeDaoImpl
    /**
     * 向数据库中添加供应商信息
     *
     * @param connection 数据库连接对象,用于执行SQL语句
     * @param provider   供应商对象,包含要添加的供应商的信息
     * @return 返回添加的行数,用于确认是否成功添加供应商
     * @throws Exception 如果在添加过程中发生错误,则抛出异常
     */
    @Override
    public int addProvider(Connection connection, Provider provider) throws Exception {
        // 初始化添加行数为0
        int addRows = 0;
        // 预编译的SQL语句对象
        PreparedStatement preparedStatement;

        // 检查数据库连接是否为空
        if (connection != null) {
            // 准备插入供应商信息的SQL语句
            String sql = "insert into smbms_provider (" +
                    "proCode, " +
                    "proName, " +
                    "proDesc, " +
                    "proContact, " +
                    "proPhone, " +
                    "proAddress, " +
                    "proFax, " +
                    "createBy, " +
                    "createDate) " +
                    " values(?,?,?,?,?,?,?,?,?)";
            // 初始化参数数组,用于存放SQL语句中的参数值
            Object[] params = new Object[9];
            // 设置SQL语句中的参数值
            params[0] = provider.getProCode();
            params[1] = provider.getProName();
            params[2] = provider.getProDesc();
            params[3] = provider.getProContact();
            params[4] = provider.getProPhone();
            params[5] = provider.getProAddress();
            params[6] = provider.getProFax();
            params[7] = provider.getCreateBy();
            params[8] = provider.getCreateDate();

            // 准备SQL语句执行对象
            preparedStatement = connection.prepareStatement(sql);

            // 执行插入操作,并返回添加的行数
            addRows = BaseDao.executeUpdate(connection, sql, preparedStatement, params);
        }

        // 返回添加的行数
        return addRows;
    }

ProviderService

  1. ProviderService
boolean addProvider(Provider provider) throws SQLException, Exception;
  1. ProviderServiceImpl
    /**
     * 添加一个新的供应商到系统中。
     * <p>
     * 此方法用于将提供的供应商对象添加到数据库中。它涉及数据库操作和事务管理,
     * 根据操作的成功或失败提交或回滚事务。
     *
     * @param provider 要添加的供应商对象,包含供应商的相关信息。
     * @return 返回一个布尔值,指示添加操作是否成功。true 表示成功,false 表示失败。
     * @throws SQLException 如果发生数据库访问错误,该方法将抛出一个 SQLException。
     */
    @Override
    public boolean addProvider(Provider provider) throws SQLException {
        // 初始化数据库连接对象和方法返回值
        Connection conn = null;
        boolean flag = false;

        try {
            // 获取数据库连接并准备事务
            conn = BaseDao.connection();
            conn.setAutoCommit(false);

            // 调用数据访问对象方法添加供应商,并尝试提交事务
            int addRows = providerDao.addProvider(conn, provider);
            conn.commit();

            // 根据受影响的行数判断添加是否成功
            if (addRows > 0) {
                flag = true;
            }

        } catch (SQLException e) {
            // 遇到 SQLException 时回滚事务
            conn.rollback();
        } catch (Exception e) {
            // 对于其他异常,转换为 RuntimeException 并重新抛出
            throw new RuntimeException(e);
        } finally {
            // 在 finally 块中关闭数据库资源以确保执行
            BaseDao.closeResource(conn, null, null);
        }

        // 返回添加供应商的结果
        return flag;
    }

ProviderServlet

   /**
     * 处理HTTP Post请求的方法
     * 根据请求参数中的method字段值,决定执行相应的操作
     *
     * @param req  HttpServletRequest对象,用于获取请求参数
     * @param resp HttpServletResponse对象,用于向客户端发送数据
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果发生输入输出异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数中的method值,如果为空则默认为空字符串
        String method = req.getParameter("method") == null ? "" : req.getParameter("method");
        
        // 根据method值调用对应的方法执行操作
        switch (method) {
            case "add":
                addProvider(req, resp);
                break;
        }
    }



    /**
     * 添加供应商信息
     * <p>
     * 此方法从HTTP请求中提取供应商信息,并将其添加到数据库中
     * 如果添加成功,将用户重定向到供应商查询页面;如果添加失败,则重定向回添加供应商页面,并显示错误信息
     *
     * @param req  HTTP请求对象,用于获取请求参数和会话信息
     * @param resp HTTP响应对象,用于重定向用户
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果输入/输出操作失败
     */
    private void addProvider(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 获取当前登录用户信息
        User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);

        // 创建一个新的供应商对象,并从请求中设置其属性
        Provider provider = new Provider();
        provider.setProCode(req.getParameter("proCode"));
        provider.setProName(req.getParameter("proName"));
        provider.setProDesc(req.getParameter("proDesc"));
        provider.setProContact(req.getParameter("proContact"));
        provider.setProPhone(req.getParameter("proPhone"));
        provider.setProAddress(req.getParameter("proAddress"));
        provider.setProFax(req.getParameter("proFax"));
        // 设置创建者和修改者为当前用户
        provider.setCreateBy(user.getId());
        provider.setModifyBy(user.getId());
        // 设置创建和修改日期为当前日期
        provider.setCreateDate(new Date());
        provider.setModifyDate(new Date());

        // 尝试将供应商信息添加到数据库中
        try {
            if (providerService.addProvider(provider)) {
                // 如果添加成功,设置成功消息并重定向到供应商查询页面
                req.getSession().setAttribute("message", "添加成功!");
                resp.sendRedirect(req.getContextPath() + "/provider?method=query");
            } else {
                // 如果添加失败,设置错误消息并重定向回添加供应商页面
                req.getSession().setAttribute("message", "添加失败!");
                resp.sendRedirect(req.getContextPath() + "/jsp/provideradd.jsp");
            }
        } catch (Exception e) {
            // 如果发生异常,抛出运行时异常
            throw new RuntimeException(e);
        }

        // 无论上述操作结果如何,最终将用户重定向回添加供应商页面
//        req.getRequestDispatcher("/jsp/provideradd.jsp").forward(req, resp);
    }

删除供应商

deleteProvider

ProviderDao

  1. ProviderDao
int deleteProvider(Connection connection, int id) throws SQLException;
  1. ProviderDaoImpl

    /**
     * 根据给定的ID删除供应商信息
     *
     * @param connection 数据库连接对象,用于执行SQL语句
     * @param id         需要删除的供应商的ID
     * @return 返回删除的行数,表示删除成功的记录数
     * @throws SQLException 如果执行SQL语句时发生错误
     */
    @Override
    public int deleteProvider(Connection connection, int id) throws SQLException {

        int deleteRows = 0;
        PreparedStatement preparedStatement;

        if (connection != null) {
            // 定义删除供应商的SQL语句
            String sql = "delete from smbms_provider where id=?";
            // 准备SQL语句
            preparedStatement = connection.prepareStatement(sql);
            // 设置SQL语句中的参数
            preparedStatement.setInt(1, id);
            // 执行更新操作
            deleteRows = preparedStatement.executeUpdate();
            // 关闭资源
            BaseDao.closeResource(connection, preparedStatement, null);
        }

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

ProviderService

  1. ProviderService
void deleteProvider(int id);
  1. ProviderServiceImpl
/**
 * 根据供应商ID删除供应商信息
 * 
 * @param id 供应商的ID,用于标识要删除的供应商
 * @return 返回删除的行数,用于确认是否成功删除供应商信息
 */
@Override
public int deleteProvider(int id) {
    // 初始化删除行数为0
    int deleteRows = 0;
    // 声明数据库连接对象
    Connection conn = null;
    try {
        // 获取数据库连接
        conn = BaseDao.connection();
        // 调用供应商数据访问对象的删除方法,执行删除操作
        deleteRows = providerDao.deleteProvider(conn, id);
    } catch (SQLException e) {
        // 如果捕获到SQL异常,抛出运行时异常
        throw new RuntimeException(e);
    } finally {
        // 关闭数据库资源,确保数据库连接被释放
        BaseDao.closeResource(conn, null, null);
    }
    // 返回删除的行数
    return deleteRows;
}

ProviderServlet

   /**
     * 处理HTTP Post请求的方法
     * 根据请求参数中的method字段值,决定执行相应的操作
     *
     * @param req  HttpServletRequest对象,用于获取请求参数
     * @param resp HttpServletResponse对象,用于向客户端发送数据
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果发生输入输出异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数中的method值,如果为空则默认为空字符串
        String method = req.getParameter("method") == null ? "" : req.getParameter("method");
        
        // 根据method值调用对应的方法执行操作
        switch (method) {
            case "add":
                addProvider(req, resp);
                break;
            case "deleteProvider":
                deleteProvider(req, resp);
                break;
        }
    }

更改供应商信息

modifyProvider

ProviderDao

  1. ProviderDao
int updateProvider(Connection connection, Provider provider) throws SQLException;
  1. ProviderDaoImpl
    /**
     * 更新供应商信息
     *
     * @param connection 数据库连接对象,用于执行SQL语句
     * @param provider   待更新的供应商对象,包含新的供应商信息
     * @return 返回更新影响的行数,用于判断更新操作是否成功
     * @throws SQLException 如果执行SQL语句时发生错误
     */
    @Override
    public int updateProvider(Connection connection, Provider provider) throws SQLException {
        int upRows = 0;
        PreparedStatement preparedStatement;

        // 检查数据库连接是否非空,确保可以安全地执行SQL语句
        if (connection != null) {
            // 准备更新供应商信息的SQL语句
            String sql = "update smbms_provider set " +
                    "proCode=?, " +
                    "proName=?, " +
                    "proDesc=?, " +
                    "proContact=?, " +
                    "proPhone=?, " +
                    "proAddress=?, " +
                    "proFax=?, " +
                    "modifyBy=?, " +
                    "modifyDate=? " +
                    "where id=?";
            // 初始化参数数组,用于存储供应商信息
            Object[] params = new Object[9];
            params[0] = provider.getProCode();
            params[1] = provider.getProName();
            params[2] = provider.getProDesc();
            params[3] = provider.getProContact();
            params[4] = provider.getProPhone();
            params[5] = provider.getProAddress();
            params[6] = provider.getProFax();
            params[7] = provider.getModifyBy();
            params[8] = provider.getModifyDate();
            // 准备SQL语句执行对象
            preparedStatement = connection.prepareStatement(sql);
            // 执行更新操作并获取影响的行数
            upRows = BaseDao.executeUpdate(connection, sql, preparedStatement, params);
            // 关闭资源,避免内存泄漏
            BaseDao.closeResource(connection, preparedStatement, null);
        }

        // 返回更新影响的行数
        return upRows;
    }

ProviderService

  1. ProviderService
int updateProvider(Provider provider) throws SQLException;
  1. ProviderServiceImpl
    /**
     * 更新供应商信息
     * <p>
     * 此方法用于更新数据库中供应商的信息它接收一个Provider对象作为参数,
     * 该对象包含了需要更新的供应商的新信息方法通过调用providerDao的updateProvider
     * 方法来执行数据库更新操作如果更新过程中遇到异常,会进行回滚操作以确保数据一致性
     *
     * @param provider 包含了需要更新的供应商信息的Provider对象
     * @return 返回更新影响的行数,用于判断更新操作是否成功
     * @throws SQLException 如果数据库操作失败,抛出此异常
     */
    @Override
    public int updateProvider(Provider provider) throws SQLException {
        int upRows = 0;
        Connection conn = null;
        try {
            // 获取数据库连接
            conn = BaseDao.connection();
            // 执行更新操作
            upRows = providerDao.updateProvider(conn, provider);
        } catch (SQLException e) {
            // 更新失败时,进行事务回滚
            conn.rollback();
        } finally {
            // 关闭数据库资源
            BaseDao.closeResource(conn, null, null);
        }

        return upRows;
    }

ProviderServlet

   /**
     * 处理HTTP Post请求的方法
     * 根据请求参数中的method字段值,决定执行相应的操作
     *
     * @param req  HttpServletRequest对象,用于获取请求参数
     * @param resp HttpServletResponse对象,用于向客户端发送数据
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果发生输入输出异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数中的method值,如果为空则默认为空字符串
        String method = req.getParameter("method") == null ? "" : req.getParameter("method");
        
        // 根据method值调用对应的方法执行操作
        switch (method) {
            case "modify":
                modifyProvider(req, resp);
                break;
        }
    }

    /**
     * 更新一条记录
     *
     * @param req  用于获取请求信息和会话对象
     * @param resp 用于向客户端发送响应
     */
    private void modifyProvider(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取当前登录用户信息
        User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);

        // 创建Provider对象,并从请求中获取参数来设置对象属性
        Provider provider = new Provider();
        provider.setId(Integer.parseInt(req.getParameter("id")));
        provider.setProName(req.getParameter("proName"));
        provider.setProCode(req.getParameter("proCode"));
        provider.setProDesc(req.getParameter("proDesc"));
        provider.setProContact(req.getParameter("proContact"));
        provider.setProPhone(req.getParameter("proPhone"));
        provider.setProAddress(req.getParameter("proAddress"));
        provider.setProFax(req.getParameter("proFax"));
        // 设置修改者为当前登录用户
        provider.setModifyBy(user.getId());
        // 设置修改时间为当前时间
        provider.setModifyDate(new Date());

        try {
            // 尝试更新数据库中的Provider记录
            if (providerService.updateProvider(provider) > 0) {
                // 如果更新成功,设置会话消息
                req.getSession().setAttribute("message", "数据更新成功!");
            } else {
                // 如果更新失败,设置会话消息
                req.getSession().setAttribute("message", "数据更新失败!");
            }
        } catch (SQLException e) {
            // 如果捕获到SQLException,则抛出运行时异常
            throw new RuntimeException(e);
        }

        // 跳转到列表页面
        req.getRequestDispatcher("/provider?method=view").forward(req, resp);
    }


查询供应商信息

需要两个方法

  1. getProviderCounts、
  2. getProviderList

ProviderDao

  1. ProviderDao
   public List<Provider> getProviderList(Connection connection, String proName, String proCode) throws Exception;

  1. ProviderDaoImpl
    /**
     * 根据供应商名称和编码获取供应商列表
     *
     * @param connection 数据库连接对象,用于执行数据库操作
     * @param proName    供应商名称,用于筛选供应商列表
     * @param proCode    供应商编码,用于筛选供应商列表
     * @return 返回一个包含符合条件的供应商对象的列表
     * @throws Exception 如果数据库操作失败,抛出异常
     */
    @Override
    public List<Provider> getProviderList(Connection connection, String proName, String proCode) throws Exception {

        List<Provider> providers = new ArrayList<Provider>();
        Provider provider = new Provider();
        PreparedStatement preparedStatement;
        ResultSet resultSet = null;
        String sql = "select * from smbms_provider ";
        // 初始化参数列表,用于存储查询条件参数
        List<Object> list = new ArrayList<Object>();

        if (connection != null) {
            // 构建SQL查询语句
            sql += "where 1=1";
            // 如果供应商名称不为空,添加供应商名称模糊查询条件
            if (!proName.isEmpty()) {
                sql += "and proName like ? ";
                list.add("%" + proName + "%");
            }
            // 如果供应商编码不为空,添加供应商编码模糊查询条件
            if (!proCode.isEmpty()) {
                sql += "and proCode = ? ";
                list.add( proCode );
            }

            // 准备SQL语句执行对象
            preparedStatement = connection.prepareStatement(sql);

            // 执行查询并获取结果集
            resultSet = BaseDao.executeQuery(connection, sql, preparedStatement, list.toArray(),
                    resultSet);

            // 遍历结果集,将每条记录转换为供应商对象,并添加到列表中
            while (resultSet.next()) {
                providers.add(getProviderByResult(resultSet));
            }

            // 关闭数据库资源
            BaseDao.closeResource(connection, preparedStatement, resultSet);
        }

        // 返回供应商列表
        return providers;
    }

ProviderService

  1. ProviderService
    List<Provider> getProviderList(String proName, String proCode);
  1. ProviderServiceImpl
    /**
     * 根据供应商名称和编码获取供应商列表
     *
     * @param proName 供应商名称,用于模糊查询
     * @param proCode 供应商编码,用于精确查询
     * @return 返回一个包含查询结果的供应商列表如果查询结果为空,则返回一个空列表
     */
    @Override
    public List<Provider> getProviderList(String proName, String proCode) {

        // 初始化供应商列表
        List<Provider> providers = new ArrayList<>();
        // 获取数据库连接
        Connection conn = BaseDao.connection();

        try {
            // 调用Dao层方法,根据供应商名称和编码查询供应商列表
            providers = providerDao.getProviderList(conn, proName, proCode);
        } catch (Exception e) {
            // 异常处理:打印异常信息
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            BaseDao.closeConnection(conn);
        }

        // 返回查询到的供应商列表
        return providers;
    }

ProviderServlet

   /**
     * 处理HTTP Post请求的方法
     * 根据请求参数中的method字段值,决定执行相应的操作
     *
     * @param req  HttpServletRequest对象,用于获取请求参数
     * @param resp HttpServletResponse对象,用于向客户端发送数据
     * @throws ServletException 如果Servlet操作失败
     * @throws IOException      如果发生输入输出异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数中的method值,如果为空则默认为空字符串
        String method = req.getParameter("method") == null ? "" : req.getParameter("method");
        
        // 根据method值调用对应的方法执行操作
        switch (method) {
            case "modify":
                modifyProvider(req, resp);
                break;
        }
    }

    /**
     * 获取多条记录
     *
     * @param req  用于从HTTP请求中获取参数和设置属性
     * @param resp 用于发送HTTP响应
     */
    private void getProviderList(HttpServletRequest req, HttpServletResponse resp) {
        // 从请求中获取查询参数
        String queryProCode = req.getParameter("queryProCode");
        String queryProName = req.getParameter("queryProName");
        // 对查询参数进行空值检查并赋予默认值
        queryProCode = queryProCode == null ? "" : queryProCode;
        queryProName = queryProName == null ? "" : queryProName;

        // 调用服务层方法获取供应商列表
        List<Provider> providerList = providerService.getProviderList(queryProCode, queryProName);

        try {
            if (providerList != null) {
                // 如果列表不为空,设置请求属性并转发到供应商列表页面
                req.setAttribute("providerList", providerList);
                req.getRequestDispatcher("/providerlist.jsp");
            } else {
                // 如果列表为空,重定向到供应商查询页面
                resp.sendRedirect(req.getContextPath() + "/provider?method=query");
            }
        } catch (Exception e) {
            // 异常处理: 打印异常信息
            e.printStackTrace();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨DaB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值