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

总体就是图所表示所表示的转换,由数据库 => 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;	//主键ID
	private String AREA_NAME;	//用来显示的名称
	private String PARENT_ID;	//父亲	参照AREA_ID
	private 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.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<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;

	}

}
时间: 2024-10-13 16:20:27

数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )的相关文章

是用JDBC从数据库中获取数据并以java对象返回

/** * * @param c * for example Person.class * @param primaryKeys * primaryKeys为主键,参数顺序和表中保持一致 如果id, name 为主键 类名为Person 则 getEntity(Person.class,1,"name") * @return */ public static Object getEntity(Class c, Object... primaryKeys) { PreparedState

Java实现Excel导入数据库,数据库中的数据导入到Excel

实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的lib目录下­ 2.Excel文件目录:D://book.xls 3.数据库名:javenforexcel 4.表名:stu 5.编写类:连接mysql的字符串方法.插入的方法.实体类­­ 表结构如下 : 连接数据库的工具类 package com.javen.db; import java.sql.Co

java更改数据库中的数据

不废话,上代码 1 package com.ningmeng; 2 3 import java.sql.*; 4 5 /** 6 * 1:更改数据库中的数据 7 * @author biexiansheng 8 * 9 */ 10 public class Test04 { 11 12 public static void main(String[] args) { 13 // TODO Auto-generated method stub 14 try { 15 Class.forName("

Eclipse中java向数据库中添加数据

前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) 1 package com.ningmeng; 2 3 import java.sql.*; 4 5 /** 6 * 1:向数据库中添加数据 7 * @author biexiansheng 8 * 9 */ 10 public class Test01 { 11 12 public static void main(String

用java向mysql数据库中插入数据为空

利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util.Scanner; import org.junit.Test;public class JDBCTest { //2).在测试方法testAAddStudent()中 //1.获取从控制台输入的Student对象:Student student=getStudentFromConsole(); /

Java实现Excel导入数据库,数据库中的数据导入到Excel。。转载

自学资料总结 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的lib目录下­ 2.Excel文件目录:D://book.xls 3.数据库名:javenforexcel 4.表名:stu 5.编写类:连接mysql的字符串方法.插入的方法.实体类­­ 表结构如下 : 连接数据库的工具类 package com.javen.db; import java

JSON数据与Java对象的相互转换

JSON数据与Java对象的相互转换 JSON解析器 常见的解析器:Jsonlib .Gson. fastjson. jackson JSON转化为Java对象 使用步骤: 1.导入jackson的相关jar包 2.创建jackson核心对象ObjectMapper 3.使用ObjectMapper的相关方法进行转换 1.readValue(json字符串数组,Class) Java转化为JSON对象 使用步骤 1.导入jackson的相关jar包 2.创建jackson核心对象ObjectMa

Kettle实现从数据库中提取数据到Excel

因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ 首先我们需要新建 转换  转换: 可以将数据从数据库中提取到excel中  然后我们如果想要定时提取数据的话,可以新建 作业 作业: 可以定时执行转换任务,然后还可以将发送邮件耶~ (不过这个技能我还不是很熟悉,等我熟悉了再更新嘻嘻) 一 . 新建转换 1.点击 + 号 ,也就是新建 ,然后选择 转

关于SimpleCursorAdapter在sqlite数据库中取数据报错 : java.lang.IllegalArgumentException: column &#39;_id&#39; does not exist

_id列不存在 需要创建一个 id列 因为SQLlite数据库 的onCreate方法是在数据库不存在的时候才调用所以我们需要清除一下这个app 的数据 将数据清空 关于SimpleCursorAdapter在sqlite数据库中取数据报错 : java.lang.IllegalArgumentException: column '_id' does not exist