//这是个BBS删除帖子的实现的是先把id下的pid子贴删除掉再把自己本身删掉可是我一直搞不懂子贴被查找出来后怎么被删除掉了,来帮我解释下这个新人问题吧谢谢各位....
private void del(Connection conn, int id){
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.createStatement();
String sql ="select * from article where pid = " + id;
rs = stmt.executeQuery(sql);
while(rs.next()){
del(conn,rs.getInt("id"));
}//请问到这里pid和id相等的条目被删除了没?如果有怎么被删的?
stmt.executeUpdate("delete from article where id = " + id );//这里是只删除自己本身的条目吧?
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(rs != null){
rs.close();
rs = null;
}
if(stmt != null){
stmt.close();
stmt = null;
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
private void del(Connection conn, int id){
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.createStatement();
String sql ="select * from article where pid = " + id;
rs = stmt.executeQuery(sql);
while(rs.next()){
del(conn,rs.getInt("id"));
}//请问到这里pid和id相等的条目被删除了没?如果有怎么被删的?
stmt.executeUpdate("delete from article where id = " + id );//这里是只删除自己本身的条目吧?
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(rs != null){
rs.close();
rs = null;
}
if(stmt != null){
stmt.close();
stmt = null;
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
你按住Ctrl键进入你的del方法看看就知道了!!!
}//请问到这里pid和id相等的条目被删除了没?如果有怎么被删的?-----------
------如果你的del(int id)是这样的,而里面的sql 语句是"delete from article where id = " + id 这,英爱就能删除,如果不是在一个while循环里的,那么就要改"="为in
还有就是del(conn,rs.getInt("id"));里的id 是pid呢还是id??
rs = stmt.executeQuery(sql);
while(rs.next()){
del(conn,rs.getInt("id"));//循环遍历所有子帖,并对其删除(细节去看del方法的实现代码)
}
stmt.executeUpdate("delete from article where id = " + id );//删完所有子帖,这里就删除自己本身的条目了
}
你删贴前将他所有的子贴查出,使用递归就能找到末端叶子,将其删除,
返回后就可将其父节点删除,最终返回时就刚好将你所有子贴删除了,就可以直接删除主帖了
大概结构如下:
1.删除直接子贴-》删除直接子贴-》。。-》无子贴
-》删除该叶子节点
-》。。
-》删除该贴
2.删除该贴
从后往前不就刚好将所有帖子删了吗?这就跟java文件操作里面删文件(文件夹)一样嘛!
那个del是个方法,你应该去del方法中查看实现
这句里面的数据表是不变,看起来时递归,其实肯本就不是的
stmt = conn.createStatement();
String sql ="select * from article where pid = " + id;
rs = stmt.executeQuery(sql);
while(rs.next()){
del(conn,rs.getInt("id"));
}//请问到这里pid和id相等的条目被删除了没?如果有怎么被删的?(到这里子贴到底是怎么被删除的啊.!!)
stmt.executeUpdate("delete from article where id = " + id );//这里是只删除自己本身的条目吧?(这里只是删除父id的那个帖子吧)
想要知道如何删除的子贴和本身,就要看清楚函数执行的整个过程。
(1)首先,要调用del这个函数,必须要传给他实参,而这个int型的参数就是你要删除的帖子的id,当然,还要顺便把他所有的子贴一并删除。
(2)del函数得到了要删除帖子的id,并根据这个id找到了那个帖子的子贴(通过select * from article where pid = " + id;)
(3)然后遍历这些子贴,用他们的id作为参数又调用了del函数(通过del(conn,rs.getInt("id"))
这样就能递归的删除这个帖子的所有子贴了。
你可能会问,为什么就del(conn,rs.getInt("id")这样一句就能把所有子贴都删除呢,那我们就一起看一下del(conn,rs.getInt("id")后又发生了什么吧
(1)首先,while(rs.next())循环遍历了刚刚查出来的那一堆子贴,分别取得了每个子贴的id,并以这个id为参数调用了del函数,也就是调用了自己,这样,del函数又从头开始执行了,不过这次执行和第一次调用的目的不一样,第一次执行是为了要删除主贴,而这次调用的目的是要删除他的一个子贴。
(2)当第二次调用del执行的时候,同样会查询这个子贴的子贴,同样会遍历这些子贴,而到执行到while(rs.next())的时候又会再一次调用del,这一次的目的是要删除第三级的子贴。
(3)就这样,会一直向里走,直到有一次,要删除的帖子没有子贴了,就不会执行While了,也就是说不会在调用del(自己本身)了,会执行下面的delete语句,删除当前的子贴,也就是最下层的子贴。
(4)删除了这个子贴之后,还会删除同一层的其他子贴,然后删除上一层的子贴,直至把所有帖子都删除为止
流程大概就是这样
stmt.executeUpdate("delete from article where id = " + id );其实这个语句在整个函数的执行过程中调用了很多次,这样一层一层的把所有的子贴包括主贴都删除了
个人意见,仅供参考