資料庫中樹結構資料,轉換為Java對象樹結構( 多叉樹結構 )

來源:互聯網
上載者:User

標籤:java   tree   轉換   

總體就是圖所表示所表示的轉換,由資料庫 => Java對象轉換,代碼比較簡單,但對資料庫壓力可以大一點,多次查詢.

主要是對象之間建立關聯 No.2 : MapToTree()


思路為: 用pid(父id)作分組 ,這樣每一個組的父節點是同一樣,換句話說就是同一分組裡,所有節點pid是相同的.這樣就針對分組操作,建立關聯.

用Map做封裝,key為父ID, value為分組List

用到了QueryRunner這個是資料庫工具,只要在網上找,下載就可以,能直接查詢List. 

QueryRunner jar包名=> commons-dbutils-1.5.jar 


 DTO代碼:tree 類的代碼.Javabean:

public class Tree{private String AREA_ID;//主鍵IDprivate String AREA_NAME;//用來顯示的名稱private String PARENT_ID;//父親參照AREA_IDprivate List<Tree> children = new ArrayList<Tree>();//子節點



執行代碼:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;import org.apache.commons.dbutils.DbUtils;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ColumnListHandler;/** * 資料庫中樹結構資料,轉換為Java對象樹結構( 多叉樹結構 ) * @author liupengyuan * */public class ListToTree {public static void main(String[] args) throws Exception {//No.1:從資料庫中查詢所以分組的節點Map<String, List<Tree>> arrMap = queryGroupToMap();//No.2:讓節點與子節點之間彼此關聯MapToTree(arrMap);//從map裡把根找到.返回List . 可能有多個根List<Tree> list = arrMap.get("root");System.out.println(list.size());}/** * No.1:  * 用父ID分組,用Map封裝. key為父ID, value是所有父ID為KEY的節點數組array. * 每個數組裡都是一組子節點,他們的根是同一個. 換句話說它們的父ID相同, 而Map的Key就是他們是父ID * @return * @throws SQLException */@SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })public static Map<String,List<Tree>> queryGroupToMap() throws SQLException{/* * 該表為中國地區組織,到 區縣級 * 比如,中國下分:北京市,河北省,山東省... * 山東下分:濟南市,青島市,煙台市... *  */// QueryRunner 這個是資料庫工具,只要在網上找下載就可以 commons-dbutils-1.5.jarQueryRunner qr = new QueryRunner();Connection connection = getJdbcConnection("jdbc:oracle:thin:@192.168.3.34:1521:ORCL", "DSD_ZJK", "DSD_ZJK", "oracle.jdbc.driver.OracleDriver");String sqlGroup = "select parent_id from  HM_F_AREA t group by t.parent_id";List<String> sqlGroupList = (List<String>)qr.query(connection, sqlGroup, new String[]{}, new ColumnListHandler("PARENT_ID"));Map<String,List<Tree>> arrMap = new HashMap<String,List<Tree>>(sqlGroupList.size());for(int i=0; i <sqlGroupList.size(); i++){String _pid = sqlGroupList.get(i);String sql = "select area_id , area_name , parent_id from  HM_F_AREA t where t.parent_id = '"+_pid + "'";List<Tree> listTree = (List<Tree>) qr.query(connection, sql, new String[]{} , new BeanListHandler(Tree.class));arrMap.put( _pid , listTree );}DbUtils.close(connection);return arrMap;}/** * No.2: * 讓節點與子節點之間彼此關聯 * 資料庫格式並沒有換,只是建立了關聯 * @param arrMap */public static void MapToTree(Map<String, List<Tree>> arrMap){//所以pid的整合Set<String> pidSet = arrMap.keySet();//遍曆所有的父ID,然後與所以的節點比對,父id與id相同的    //找出對應的tree節點,然後將該節點的for (Iterator<String> it = pidSet.iterator(); it.hasNext();) {    String pid = (String) it.next();        /*     * 按分組的方式與pid比對.     * 如果找到,那麼將該pid分組的List,做為子節點 賦值給該找到的節點的 setChildren(list)     *      */        for (Iterator<String> it2 = pidSet.iterator(); it2.hasNext();) {                String key = (String) it2.next();        //不尋找自己的分組        if(pid.equals(key)){        break;        }                List<Tree> list = arrMap.get(key);                //No.3:找出對應的tree節點,然後將該節點的        Tree tree = indexOfList(list , pid);        //通過pid在Map裡找出節點的子節點.        List<Tree> list2 = arrMap.get(pid);        if(tree!=null){        //TODO這裡是我自己定義的變成成,都不一樣.所以需要自訂        // 把子節點List賦值給Tree節點的Children            tree.setChildren(list2);            }        }        }}/** * No.3: * 找出 list 中元素的id與pid相關的並返回.對應關係為: id與父id相同 * @param list * @param pid * @return */public static Tree  indexOfList(List<Tree> list , String pid){for(int i=0 ;i<list.size();i++){Tree tree = list.get(i);/* * pid:是 父ID * area_id:是 ID *///TODO這裡是我自己定義的變成成,都不一樣.所以需要自訂if(pid.equals(tree.getAREA_ID())){return tree;}}return null;}/** * 資料庫連接 * @param url * @param username * @param password * @param driverClassName * @return */public static Connection getJdbcConnection(String url, String username, String password, String driverClassName){Connection connection = null;try {Properties props =new Properties(); props.put("user",username);props.put("password",password);props.put("remarksReporting","true");try {Class.forName(driverClassName).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}connection=DriverManager.getConnection(url,props);} catch (SQLException e) {e.printStackTrace();}return connection;}}





資料庫中樹結構資料,轉換為Java對象樹結構( 多叉樹結構 )

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.