运用Java递归获取数据库的目录表结构

数据库设计

现在要设计一个目录数据库表,即一个表中存有根目录和各级子目录,这时候我们可以设计一张表,用parent_id来存储子目录对应的父目录的序号,设计表如下:

表的字段类型:

+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| type_id   | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| type_name | varchar(20)          | NO   |     | NULL    |                |
| parent_id | smallint(5) unsigned | YES  |     | 0       |                |
+-----------+----------------------+------+-----+---------+----------------+

表的内容:

+---------+-----------------------+-----------+
| type_id | type_name             | parent_id |
+---------+-----------------------+-----------+
|       1 | 图书                  |         0 |
|       2 | 科技                  |         1 |
|       3 | 摄影技术              |         2 |
|       4 | 电子与通信            |         2 |
|       5 | 建筑                  |         2 |
|       6 | 真空电子技术          |         4 |
|       7 | 无线通信              |         4 |
|       8 | 半导体技术            |         4 |
|       9 | 摄影理论              |         3 |
|      10 | 摄影机具与设备        |         3 |
|      11 | 建筑史                |         5 |
|      12 | 建筑设计              |         5 |
|      13 | 建筑材料              |         5 |
|      14 | 经济                  |         1 |
|      15 | 历史                  |         1 |
|      16 | 现代经济              |        14 |
|      17 | 古代经济              |        14 |
|      18 | 中国历史              |        15 |
|      19 | 西方历史              |        15 |
+---------+-----------------------+-----------+

从表中,我们可以得知,图书为根目录,科技是图书的一级子目录,然后摄影技术又是科技的子目录...等等,现在我们想通过Java的JDBC来得到这样的目录层次关系。

Java程序设计

package demo0807;
/**
 * 获取数据库的目录表
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class DB {
	//数据库名称
	private String dbName;
	//数据库登录名
	private String userName;
	//数据库登录密码
	private String password;

	//Statement对象
	private static Statement statement=null;

	//用于存储结果的散列表
	private LinkedList<Map<String, ArrayList<String>>> linkedList=new LinkedList<Map<String,ArrayList<String>>>();

	//含参构造函数
	public DB(String dbName, String userName, String password) {
		this.dbName = dbName;
		this.userName = userName;
		this.password = password;
	}

	/**
	 * 获取数据表的根目录
	 * @return 根目录线性表
	 */
	public ArrayList<String> getRootOrder() {
		String sql=null;
        ResultSet resultSet=null;
        Connection connection=null;
        ResultSetMetaData metaData=null;
        int columnCount = 0;
        ArrayList<String> parentList = new ArrayList<String>();

		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			System.err.println("无法启动mysql.jdbc驱动!");
		}

        try {
			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost/"+dbName
			        ,userName,password);
		} catch (SQLException e) {
			System.err.println("驱动管理器无法连接到数据库!");
		}

        //sql语句
        sql=" select type_name as 根目录 from tb3 where parent_id=0;";

        //执行sql语句
        try {
			statement=connection.createStatement();
			resultSet=statement.executeQuery(sql);
		} catch (SQLException e) {
			System.err.println("无法执行查询");
		}

		try {
			//获取结果的信息元数据
			metaData = resultSet.getMetaData();
			//获取列的总数
			columnCount = metaData.getColumnCount();
		} catch (SQLException e) {
			System.out.println("无法获取表信息");
		}

        try {
			while(resultSet.next()) {
				int index=1;
				while(index<=columnCount) {
					parentList.add(resultSet.getString(index));
					index++;
				}
			}
		} catch (SQLException e) {
			System.err.println("无法正确查询结果");
		}
        return parentList;
	}

	/**
	 * 递归地找出所有的目录结构
	 * 找法一:找出所有目录的子目录,直到子目录为空为止
	 * @param parentOrder
	 * @return
	 */
	public  LinkedList<Map<String, ArrayList<String>>> lookupSubOrder(ArrayList<String> parentOrder) {
		ResultSet resultSet=null;
		for(String dynamicParent:parentOrder) {

			//Map类型,用于存储key-value
			Map<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>();
			String key=dynamicParent;
			ArrayList<String> value = new ArrayList<String>();
			String sql="select child_type_name from (select p.type_id as type_id,p.type_name as type_name,s.type_name as child_type_name from tb3 as p left join tb3 as s on p.type_id=s.parent_id) as tb_tmp where type_name="+"‘"+dynamicParent+"‘";
			try {
				resultSet = statement.executeQuery(sql);
				if(resultSet.next()==false) {
					;
				} else {
					boolean flag=true;
					while(flag) {
						String tmp=null;
						if((tmp=resultSet.getString(1))!=null) {
							value.add(tmp);
						}
						flag=resultSet.next();
					}
					lookupSubOrder(value);
				}
				map.put(key, value);
			} catch (SQLException e) {
				System.err.println("数据库查询失败!");
				e.printStackTrace();
			}
			linkedList.add(map);
		}
		return linkedList;
	}
}

测试代码

package demo0807;
/**
 * 测试类
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		DB db = new DB("demo2", "root", "031422zw");
		ArrayList<String> mainOrder = db.getRootOrder();
		System.out.println("根目录为:"+mainOrder.toString());
		LinkedList<Map<String, ArrayList<String>>> linkedListSubOrder = db.lookupSubOrder(mainOrder);
		while(!linkedListSubOrder.isEmpty()) {
			Map<String, ArrayList<String>> subOrder = linkedListSubOrder.removeLast();
			Set<Entry<String, ArrayList<String>>> entrySet = subOrder.entrySet();
			Iterator<Entry<String, ArrayList<String>>> iterator = entrySet.iterator();
			while(iterator.hasNext()) {
				Entry<String, ArrayList<String>> next = iterator.next();
				String parent=next.getKey();
				ArrayList<String> children = next.getValue();
				if(!children.isEmpty()) {
					System.out.println(parent+"的子目录有"+children.toString());
				}
			}
		}

	}
}

运行结果

根目录为:[图书]
图书的子目录有[科技, 经济, 历史]
历史的子目录有[中国历史, 西方历史]
经济的子目录有[现代经济, 古代经济]
科技的子目录有[摄影技术, 电子与通信, 建筑]
建筑的子目录有[建筑史, 建筑设计, 建筑材料]
电子与通信的子目录有[真空电子技术, 无线通信, 半导体技术]
摄影技术的子目录有[摄影理论, 摄影机具与设备]

总结

程序还有很多小瑕疵,感觉熟悉基本的数据结构和递归算法对编程的帮助很大!

时间: 2024-09-29 08:24:27

运用Java递归获取数据库的目录表结构的相关文章

通过jdbc获取数据库中的表结构

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户.关于MetaData的说明网上也有不少,这里我只是从我自身学习的角度来记录一下简单使用JDBC以及获取数据表相关信息的方法. DatabaseMetaData dbmd = con.getMetaData()

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类

http://www.cnblogs.com/lbangel/p/3487796.html package cn.test; import java.io.File;import java.io.FileOutputStream;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.ResultSet;import java.text.Si

SQL获取数据库名,表名,列名,说明等信息

由于最近工作涉及SQL语句较多,对一些不常见的SQL函数.及存储过程下面进行整理和描述,供大家分享: /************************************************************************************************************** 1.获取所有用户名: islogin='1' :表示帐户 islogin='0' :表示角色 status='2' :表示用户帐户 status='0' :表示系统帐户 **

通过 jdbc 分析数据库中的表结构和主键外键

文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hibernate 是 ORM 框架,他是有能力根据实体生成数据库表的.我们在单元测试的时候用到了 dbUnit ,dbUnit 可以帮助我们在测试前把数据库的测试数据准备好,然后我们就利用现成的数据库环境测试,测试完成后需将数据库中的所有数据清除(为了不影响其他的单元测试),然后接着下一个测试.虽然已经

实体类(JavaBean)一般都是和数据库中的表结构一一对应

实体类(JavaBean)一般都是和数据库中的表结构一一对应 本节希望实现的是,一个java类,能和数据库对应上,然后操作数据库. 实体类 JavaBean有特定的写法 必须要有一个无惨构造 属性必须私有化 必须有对应的get/set方法 一般用来和数据库的字段做映射 ORM ORM:对象关系映射 表--->类 字段--->属性 行记录--->对象 id name age address 1 桐人 22 日本 2 亚丝娜 22 日本 3 爱丽丝 22 日本 class People{  

查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅 (1)查询SQLServer2005中某个数据库中的表结构 SELECT TOP 100 PERCENT --a.id,CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,CASE WHEN a.colorder = 1 THEN isnull(f.v

Toad导出数据字典,把数据库所有的表结构导出到htm中

Toad导出数据字典,把 数据库所有的表结构导出到htm中 第一步: 第二步:选择数据库 第三步:选择路径和设置其它配置 第四步:生成成功后, 系统会弹出提示框询问是否打开. 最终生成的表框架效果如下图所示: 在写软件文档时常常需要数据字典,用这个方法能够快速提取表结构.

如何导出远程oracle数据库中的表结构

从远程oracle数据库上导出指定表的表结构语句有两种方法: 方法一:通过sql语句获得 1,make sure that you can connect the remote database. 2,enter into the sqlplus,and execute the command: select dbms_metadata.getddl('TABLE',tablename) from user_tables and you will get all the tables defin

Java 递归获取一个路径下的所有文件,文件夹名称

package com.readfile; import java.io.File; public class GetAllFiles { public static void main(String[] args) { //路径 这里写一个路径进去 String path="F:\\QQ文档"; //调用方法 getFiles(path); } /** * 递归获取某路径下的所有文件,文件夹,并输出 */ public static void getFiles(String path