级联树状结构,删除的时候,需要一级一级查找,并一级级删除操作,如此反复操作,需要不断调用同一个函数,所以这里使用递归操作十分方便
递归函数需要单独书写,并在方法中调用。
以下示例代码,为一个级联删除,有个父id 然后不断查找其子id 并删除 通过子id 继续查找其id的子id 删除,由于多语句操作,所以使用了事物手动提交方式
(其中处理异常方式不严谨!!)
/**
* 级联删除的递归函数
* @param conn 调用者需要将其连接对象传入,方便事物操作
* @param id 将删除的父id传入
* @throws Exception
*/
public void doDel(Connection conn,int id) throws Exception{
//查找id进行删除操作
String sql = "delete from address where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
//将此id作为父id查找其子id(级联子)
sql = "select id from address where parentId = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
//此条件没有数据时可结束递归,然后不断跳出,结束循环
while(rs.next()){
//这里通过传入其子ID 再不断查找其子孙id进行删除和查询删除往复操作
this.doDel(conn,rs.getInt("id"));
}
//rs ps每次递归函数调用时新创建,所以用完关闭
//对于Connection是调用函数传入,不能关闭,要使用此连接提交和回滚事务
rs.close();
ps.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
ProxyDAO proxy = new ProxyDAO();
int id = Integer.parseInt(request.getParameter("Id"));
Connection conn = proxy.getConn();
try{
//这里由于是多语句操作,考虑异常问题,需要设置手动提交
conn.setAutoCommit(false);
//调用递归函数,并传入当前连接与当前id
this.doDel(conn, id);
//如果正常运行无异常,此方法会被调用,提交事务
conn.commit();
}catch(Exception ex){
try {
//如果出现异常,事物回滚
conn.rollback();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ex.printStackTrace();
}
//业务处理完毕,进行其他操作.....
}