import java.sql.*; public class ArticleTree { public static void main(String[] args) { new ArticleTree().show(); } private void show(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager .getConnection("jdbc:mysql://localhost/bbs?user=root&password=root"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from article where pid=0"); while(rs.next()){ System.out.println(rs.getString("cont")); tree(conn,rs.getInt("id"),1); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null){ conn.close(); conn = null; } if (stmt != null){ stmt.close(); stmt = null; } if (rs != null){ rs.close(); rs = null; } } catch (SQLException e) { e.printStackTrace(); } } } private void tree(Connection conn,int id,int level) { Statement stmt = null; ResultSet rs = null; String str = "select * from article where pid ="; StringBuffer sbPre = new StringBuffer(""); for(int i=0;i<level; i++){ sbPre.append(" "); } try { stmt = conn.createStatement(); rs = stmt.executeQuery(str + id); while(rs.next()){ System.out.println(sbPre + rs.getString("cont")); if(rs.getInt("isleaf") != 0){ tree(conn,rs.getInt("id"),level+1); } } } 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(); } } } }
下图是article这张表的数据和结构:
下图是程序执行的输出结果:
首先,你的sbPre是在tree方法中的局部变量,每一次递归tree方法时,
StringBuffer sbPre= new StringBuffer("");
上面这条语句表明,sbPre都是一个新的局部对象。与上一次执行tree方法时的sbPre是不一样的。上一次执行的sbPre可能已经被垃圾回收了。
因此,sbPre只会因这个循环而变化,level是多少,就append多少次。
for(int i=0;i<level; i++){
sbPre.append(" ");
}
现在说说level,这个变量确实是在递归的。
if(rs.getInt("isleaf") != 0){
tree(conn,rs.getInt("id"),level+1);
}
这段代码表明,如果有叶子,level将继续加下去,因此sbPre会缩进的更多。
不过由于level是基本数据类型,形参和实参是传值并不是传址。所以每一次递归的tree方法中的level都可以看成不同的变量。因此,这样递归的level完全可以表示树的层次。
打印的结果完全是正确的,LS说的不对。
while(rs.next()){
System.out.println(sbPre + rs.getString("cont"));
if(rs.getInt("isleaf") != 0){
tree(conn,rs.getInt("id"),level+1);
}
}
核心代码就这是这些。
但是令我奇怪的是,你的输出结果???这段代码不可能输出这样的结果啊。