MySQL樹形遍歷(三)

壹頁書發表於2015-12-07
MySQL雖然也可以實現Oracle的sys_connect_by_path功能.但是效能很差.
詳見:
http://blog.itpub.net/29254281/viewspace-1851457/

其實這種還是用程式算比較好.
  1. import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5. import java.util.ArrayList;  
  6. import java.util.Collections;  
  7. import java.util.List;  
  8.   
  9. public class TreeScan {  
  10.     private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";  
  11.     private static String USERNAME = "xx";  
  12.     private static String PWD = "xx";  
  13.   
  14.     public static void main(String[] args) throws ClassNotFoundException, SQLException, CloneNotSupportedException {  
  15.         List list = new ArrayList();  
  16.         Class.forName("com.mysql.jdbc.Driver");  
  17.         Connection con = DriverManager.getConnection(URL, USERNAME, PWD);  
  18.         ResultSet rs = con.createStatement().executeQuery("select employee_id,manager_id from employees");  
  19.         while (rs.next()) {  
  20.             Employee e = new Employee();  
  21.             e.setEmployeeId(rs.getInt("employee_id"));  
  22.             e.setManagerId(rs.getInt("manager_id"));  
  23.             list.add(e);  
  24.         }  
  25.         rs.close();  
  26.         con.close();  
  27.         treeScan(list);  
  28.     }  
  29.   
  30.     private static void treeScan(List list) throws CloneNotSupportedException {  
  31.         for (Employee e : list) {  
  32.             Employee e1 = findManager(list, e);  
  33.             while (e1 != null) {  
  34.                 e1 = findManager(list, e1);  
  35.             }  
  36.         }  
  37.         Collections.sort(list);  
  38.         for (Employee ee : list) {  
  39.             System.out.println(ee.toString());  
  40.         }  
  41.     }  
  42.   
  43.     private static Employee findManager(List list, Employee e) throws CloneNotSupportedException {  
  44.         Employee manager = null;  
  45.         for (Employee em : list) {  
  46.             if (em.getEmployeeId().equals(e.getManagerId())) {  
  47.                 manager = new Employee();  
  48.                 manager.setEmployeeId(em.getEmployeeId());  
  49.                 manager.setManagerId(em.getManagerId());  
  50.                 e.setManager(manager);  
  51.                 return manager;  
  52.             }  
  53.         }  
  54.         return manager;  
  55.     }  
  56. }  
  57.   
  58. class Employee implements Comparable {  
  59.     private Integer employeeId = null;  
  60.     private Integer managerId = null;  
  61.     private Employee manager = null;  
  62.   
  63.     public Integer getEmployeeId() {  
  64.         return employeeId;  
  65.     }  
  66.   
  67.     public void setEmployeeId(Integer employeeId) {  
  68.         this.employeeId = employeeId;  
  69.     }  
  70.   
  71.     public Integer getManagerId() {  
  72.         return managerId;  
  73.     }  
  74.   
  75.     public void setManagerId(Integer managerId) {  
  76.         this.managerId = managerId;  
  77.     }  
  78.   
  79.     public Employee getManager() {  
  80.         return manager;  
  81.     }  
  82.   
  83.     public void setManager(Employee manager) {  
  84.         this.manager = manager;  
  85.     }  
  86.   
  87.     public String toString() {  
  88.         if (this.manager != null) {  
  89.   
  90.             return this.manager.toString() + "/" + this.getEmployeeId();  
  91.         }  
  92.         return this.getEmployeeId().toString();  
  93.     }  
  94.   
  95.     @Override  
  96.     public int compareTo(Employee o) {  
  97.         return this.toString().compareTo(o.toString());  
  98.     }  
  99. }  

本質還是用了遞迴,用程式做遞迴,比用SQL做遞迴真是簡單多了.
JAVA結果和資料庫運算結果比對:
  

ITPUB的程式碼貼上不支援泛型,估計是根據正則過濾了...
需要補全泛型才能執行.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1867455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章