文章目录
供应商管理
前期准备
- 创建供应商 provider 的servlet
- 注册 provider 的servlet
- 创建相关的Dao,Service,javaBean等
- 导入相关的jsp
增加供应商
addProvider
PrivodeDao
- PrivodeDao
int addProvider(Provider provider);
- 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
- ProviderService
boolean addProvider(Provider provider) throws SQLException, Exception;
- 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
- ProviderDao
int deleteProvider(Connection connection, int id) throws SQLException;
- 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
- ProviderService
void deleteProvider(int id);
- 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
- ProviderDao
int updateProvider(Connection connection, Provider provider) throws SQLException;
- 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
- ProviderService
int updateProvider(Provider provider) throws SQLException;
- 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);
}
查询供应商信息
需要两个方法
- getProviderCounts、
- getProviderList
ProviderDao
- ProviderDao
public List<Provider> getProviderList(Connection connection, String proName, String proCode) throws Exception;
- 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
- ProviderService
List<Provider> getProviderList(String proName, String proCode);
- 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();
}
}