利用递归级联删除的代码

级联树状结构,删除的时候,需要一级一级查找,并一级级删除操作,如此反复操作,需要不断调用同一个函数,所以这里使用递归操作十分方便

递归函数需要单独书写,并在方法中调用。

以下示例代码,为一个级联删除,有个父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();
		}
			//业务处理完毕,进行其他操作.....
		
					
	}

  

posted @ 2015-12-21 10:17  WhyToHow  阅读(622)  评论(0编辑  收藏  举报