java 数据库树结构_数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )

df68fe51e67138a34c74f05070846d5a.png

infodetail-339502.html

总体就是图所表示所表示的转换,由数据库 => Java对象转换,代码比较简单,但对数据库压力可以大一点,多次查询.

主要是对象之间建立关联 No.2 : MapToTree()

思路为: 用pid(父id)作分组 ,这样每一个组的父节点是同一样,换句话说就是同一分组里,所有节点pid是相同的.这样就针对分组操作,建立关联.

用Map做封装,key为父ID, value为分组List

用到了QueryRunner这个是数据库工具,只要在网上找,下载就可以,能直接查询List.

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

DTO代码:tree 类的代码.Javabean:

public class Tree{

private String AREA_ID;//主键ID

private String AREA_NAME;//用来显示的名称

private String PARENT_ID;//父亲参照AREA_ID

private List children = new ArrayList();//子节点

执行代码:

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> arrMap = queryGroupToMap();

//No.2:让节点与子节点之间彼此关联

MapToTree(arrMap);

//从map里把根找到.返回List . 可能有多个根

List 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> queryGroupToMap() throws SQLException{

/*

* 该表为中国地区组织,到 区县级

* 比如,中国下分:北京市,河北省,山东省...

* 山东下分:济南市,青岛市,烟台市...

*

*/

// QueryRunner 这个是数据库工具,只要在网上找下载就可以 commons-dbutils-1.5.jar

QueryRunner 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 sqlGroupList = (List)qr.query(connection, sqlGroup, new String[]{}, new ColumnListHandler("PARENT_ID"));

Map> arrMap = new HashMap>(sqlGroupList.size());

for(int i=0; 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 listTree = (List) 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> arrMap){

//所以pid的集成

Set pidSet = arrMap.keySet();

//遍历所有的父ID,然后与所以的节点比对,父id与id相同的 //找出对应的tree节点,然后将该节点的

for (Iterator it = pidSet.iterator(); it.hasNext();) {

String pid = (String) it.next();

/*

* 按分组的方式与pid比对.

* 如果找到,那么将该pid分组的List,做为子节点 赋值给该找到的节点的 setChildren(list)

*

*/

for (Iterator it2 = pidSet.iterator(); it2.hasNext();) {

String key = (String) it2.next();

//不查找自己的分组

if(pid.equals(key)){

break;

}

List list = arrMap.get(key);

//No.3:找出对应的tree节点,然后将该节点的

Tree tree = indexOfList(list , pid);

//通过pid在Map里找出节点的子节点.

List 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 list , String pid){

for(int i=0 ;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;

}

}

原文:http://blog.csdn.net/lpy3654321/article/details/38928701

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值