進(jìn)行編寫編程代碼就能實(shí)現(xiàn)批量刪除操作。
創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為集賢企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),集賢網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
具體代碼如下:
[java]? SPAN style="WHITE-SPACE: pre" /SPANpublic Connection con=null;??
public PreparedStatement pstmt=null;
/**
* 得到連接對象?
*/??
public void getConnection(){?? ? ?
String driver="com.mysql.jdbc.Driver";?? ? ?
String url="jdbc:mysql://localhost:3306/zufang?
user=rootpassword=rootuseUnicode=truecharacterEncoding=GB2312";?? ? ?
try {?? ? ? ? ?
Class.forName(driver);?? ? ? ? ?
con=DriverManager.getConnection(url,"root","root");?? ? ?
} catch (ClassNotFoundException e) {?? ? ? ? ?
e.printStackTrace();?? ? ?
} catch (SQLException e) {?? ? ? ? ?
e.printStackTrace();
}
}
public Connection con=null;
public PreparedStatement pstmt=null;
/**
* 得到連接對象
*/
public void getConnection(){
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/zufang?
user=rootpassword=rootuseUnicode=truecharacterEncoding=GB2312";
try {
Class.forName(driver);
con=DriverManager.getConnection(url,"root","root");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
[java]? SPAN style="WHITE-SPACE: pre" /SPAN/**
* 批量刪除信息表中的信息
* @param sql
* @param param
* @return
*/?
public boolean updateBatchDel(String sql,String[] param){?
boolean flag = false;?
getConnection();???
try {??
con.setAutoCommit(false);???
pstmt = con.prepareStatement(sql);???
for(int i =0 ;iparam.length;i++){????
pstmt.setString(1,param[i].trim());???
pstmt.addBatch();??????????????????
}????
pstmt.executeBatch(); //批量執(zhí)行
con點(diǎn)抗 mit();//提交事務(wù)????
flag = true;???
} catch (SQLException e) {???
try {???
con.rollback(); //進(jìn)行事務(wù)回滾????
} catch (SQLException ex) {??
ex.printStackTrace();?
}????
}finally {???
closeAll(null,pstmt,con);???
}??
return flag;?
}
/**
* 批量刪除信息表中的信息
* @param sql
* @param param
* @return
*/
public boolean updateBatchDel(String sql,String[] param){
boolean flag = false;
getConnection();?
try {
con.setAutoCommit(false);
pstmt = con.prepareStatement(sql);??
for(int i =0 ;iparam.length;i++){??
pstmt.setString(1,param[i].trim());?
pstmt.addBatch();
}???
pstmt.executeBatch(); //批量執(zhí)行??
con點(diǎn)抗 mit();//提交事務(wù)?
flag = true;
} catch (SQLException e) {?
try {??
con.rollback(); //進(jìn)行事務(wù)回滾
} catch (SQLException ex) {
ex.printStackTrace();
}??
}finally {
closeAll(null,pstmt,con);
}
return flag;
上面是進(jìn)行批量刪除的編程碼。
同意用存儲過程。用存儲過程的時(shí)候,你可以定義Handler,可以根據(jù)SQLSTATE來判斷,如果發(fā)現(xiàn)刪除失敗,而且是由于外鍵引起的(有對應(yīng)的SQLSTATE代碼的,不同sql方言可能不同),那么就不能刪除??梢苑祷劐e(cuò)誤代碼
另外,JAVA里面,其實(shí)你只要catch到sqlexception,管它是什么錯(cuò)誤呢?如果SQLEXCEPTION發(fā)生(1是SQL系統(tǒng)掛了,你的例子中2 是由于刪除失?。ㄍ怄I)。不管什么情況,都表征失敗了。不就可以了?
根據(jù)ER圖來判斷是否有外鍵,這樣可行嗎?
這樣JAVA代碼就要依靠ER圖了,實(shí)際開發(fā)中,這種后期維護(hù)挺不容易的。盡量要避免這種代碼依賴。
我會將在編寫過程中出現(xiàn)的一些小知識點(diǎn)也進(jìn)行總結(jié)概括的。
此項(xiàng)目基于的框架是:springmvc+mybatis
(1)controller
/**
* 批量刪除 batch
*/
@RequestMapping("/batchDeletes")
@ResponseBody
public void batchDeletes(HttpServletRequest request,HttpServletResponse response){
String items = request.getParameter("delitems");
ListString delList = new ArrayListString();
String[] strs = items.split(",");
for (String str : strs) {
delList.add(str);
}
userService.batchDeletes(delList);
}
代碼思路:
從前臺勾選的選擇框中傳過來的值用“,”分開,然后遍歷存放到delList集合里面,直接刪delList集合里面的所有字符串。
(2)service
/**
* 批量刪除
*/
void batchDeletes(List delList);
(3)impl
/**
* 批量刪除
*/
@Override
public void batchDeletes(List delList) {
userMapper.batchDeletes(delList);
}
(4)mapper
/**
* 批量刪除
*/
void batchDeletes(List delList);
(5)mapper.xml
!--批量刪除 --
delete id="batchDeletes" parameterType="java.util.List"
DELETE FROM tp_user where uname in
foreach collection="list" index="index" item="item" open="(" separator="," close=")"
#{item}
/foreach
/delete
如上的mybatis指代的意思如下:
foreach元素的屬性主要有 item,index,collection,open,separator,close。
item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名. (直接找到對應(yīng)的delList集合里面的所有元素,item="item"中的item(后一個(gè))必須與#{item} 中的item一致)
index指 定一個(gè)名字,用于表示在迭代過程中,每次迭代到的位置.
open表示該語句以什么開始,separator表示在每次進(jìn)行迭代之間以什么符號作為分隔 符.
close表示以什么結(jié)束.
前臺代碼:
user_list.jsp
//全選
function selectAll(){
if ($("#SelectAll").is(":checked")) {
$(":checkbox").prop("checked", true);//所有選擇框都選中
} else {
$(":checkbox").prop("checked", false);
}
}
//批量刪除
function batchDeletes(){
//判斷至少寫了一項(xiàng)
var checkedNum = $("input[name='subcheck']:checked").length;
if(checkedNum==0){
alert("請至少選擇一項(xiàng)!");
return false;
}
if(confirm("確定刪除所選項(xiàng)目?")){
var checkedList = new Array();
$("input[name='subcheck']:checked").each(function(){
checkedList.push($(this).val());
});
$.ajax({
type:"POST",
url:"web/user/batchDeletes.action",
data:{"delitems":checkedList.toString()},
datatype:"html",
success:function(data){
$("[name='checkbox2']:checkbox").attr("checked",false);
art.dialog.tips('刪除成功!');
setTimeout("location.reload()",1000);//頁面刷新
},
error:function(data){
art.dialog.tips('刪除失敗!');
}
});
}
}
table class="tb_list"
tr
td align="center"input type="checkbox" id="SelectAll"
onclick="selectAll();" / 全選/td
th序號/th
/tr
c:forEach items="${page.list }" var="items" varStatus="idx"
tr class="row_${idx.count%2+1}"
td style="display:none"${batch.id}/td
td align="center"input type="checkbox" id="subcheck"
name="subcheck" value="${items.UNAME }" /
/td
td${page.onePageCount*(page.currentPage-1)+idx.count }/td
tr
/table
備注:此代碼我傳值的主鍵是用uname來刪除的,實(shí)際應(yīng)該用id作為主鍵,因?yàn)閕d的unique
,uname若重名,則就會出現(xiàn)bug,相信大家都明白,就不再過多解釋了。