级联树状结构,删除的时候,需要一级一级查找,并一级级删除操作,如此反复操作,需要不断调用同一个函数,所以这里使用递归操作十分方便
递归函数需要单独书写,并在方法中调用。
以下示例代码,为一个级联删除,有个父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(); } //业务处理完毕,进行其他操作..... }
时间: 2024-10-16 13:13:27