批量刪除是我們在實踐項目中很常見的一個知識點,批量刪除中都會和前臺頁面的循環選擇相關聯,如下面的圖片顯示:
頁面selectFlags循環選擇
這是前臺頁面中的javascript循環選擇的代碼:
function modifyUser() {
//獲得頁面 name爲selectFlag的複選框的ID
var selectFlags = document.getElementsByName("selectFlag");
var count = 0;
var j = 0;
for (var i=0; i<selectFlags.length; i++) {
if (selectFlags[i].checked) {
//將選中的selectFlags(用戶)的ID值賦給變量j
j = i;
count++;
}
}
if (count == 0) {
alert("請選擇需要修改的用戶!");
return;
}
if (count > 1) {
alert("一次只能修改一個用戶!");
return;
}
//傳遞要修改的用戶id
window.self.location = "user_modify.jsp?userId=" + selectFlags[j].value;
}
下面的代碼是通過前臺提交的selectflags到jsp中循環刪除,這樣的刪除效率較低
<%
String command=request.getParameter("command");
if("del".equals(command)){
//循環刪除
for(int i=0;i<userIds.length;i++){
UserManager.getInstance().delUser(userIds[i]);
}
}
%>
下面的代碼是jsp中的批量刪除
<%
String command=request.getParameter("command");
if("del".equals(command)){
String[] userIds=request.getParameterValues("selectFlag");
//批量刪除
UserManager.getInstance().delUser(userIds);
}
%>
下面的代碼是D層sql語句的批量刪除代碼
/**
* 批量刪除用戶
*
* 採用一條語句完成刪除
* 只提交一次
*
* 採用PreparedStatement佔位符方式
*
* delete from t_user where user_id in (?, ?, ?)
* @param userIds
*/
public void delUser(String[] userIds) {
StringBuilder sbStr = new StringBuilder();
//拼SQL語句中的佔位符的‘,’和‘?’
for (int i=0; i<userIds.length; i++) {
sbStr.append("?");
if (i < (userIds.length - 1)) {
sbStr.append(",");
}
}
//SQL語句連接
String sql = "delete from t_user where user_id in (" + sbStr.toString() + ")";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DbUtil.getConnection();
pstmt = conn.prepareStatement(sql);
//爲pstmt賦參
for (int i=0; i<userIds.length; i++) {
pstmt.setString(i + 1, userIds[i]);
}
pstmt.executeUpdate();
}catch(SQLException e) {
e.printStackTrace();
}finally {
DbUtil.close(pstmt);
DbUtil.close(conn);
}
}
總結:關於批量刪除是一個很常見的知識點,而批量刪除的關鍵點就在於sql語句的拼接,上面的代碼註釋的很清楚,總結成博客積澱下來。