【項目實踐】SMBMS(Javaweb版)(五)供應商管理模塊
文章目錄
供應商管理
前期準備
- 創建供應商 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;
// 檢查數據庫連接是否非空,確??梢园踩貓绦蠸QL語句
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();
}
}

浙公網安備 33010602011771號