问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

通过java程序如何在已知表明的情况下获得数据库中该张表的表结构?

发布网友 发布时间:2022-04-08 06:41

我来回答

3个回答

懂视网 时间:2022-04-08 11:02

数据库设计

现在要设计一个目录数据库表,即一个表中存有根目录和各级子目录,这时候我们可以设计一张表,用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());
				}
			}
		}
		
	}
}

运行结果


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

总结

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



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

标签:

热心网友 时间:2022-04-08 08:10

public static void getConnAndTableStruct(){
Connection connection = null;
PreparedStatement pstmt = null;
ResultSetMetaData rsmd = null;
try {
//mysql连接
Class.forName("org.gjt.mm.mysql.Driver");
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
//oracle连接
// Class.forName("oracle.jdbc.driver.OracleDriver");
// String url="jdbc:oracle:thin:@173.10.2.11:1521:test";
// connection=DriverManager.getConnection(url,"root","root");

pstmt = (PreparedStatement) connection.prepareStatement("select * from user");
pstmt.execute(); //这点特别要注意:如果是Oracle而对于mysql可以不用加.
rsmd = (ResultSetMetaData) pstmt.getMetaData();
className="User";
tableName="user";
for (int i = 1; i < rsmd.getColumnCount() + 1; i++) {
Table table=new Table();
table.setColumnName(rsmd.getColumnName(i));
table.setColumnType(rsmd.getColumnClassName(i).substring(rsmd.getColumnClassName

(i).lastIndexOf(".")+1));
tables.add(table);
System.out.println(rsmd.getColumnName(i)+ " " +rsmd.getColumnTypeName(i)
+" " +rsmd.getColumnClassName(i)+ " "+rsmd.getTableName(i));
}
}
catch (ClassNotFoundException cnfex) {
cnfex.printStackTrace();
}
catch (SQLException sqlex) {
sqlex.printStackTrace();
}

}追问TeraData中能运行么? 数据库是TD的。

热心网友 时间:2022-04-08 09:28

在java端写sql语句啊,select * from tablename
然后execute就行
java中如何读出sqlserver数据库中的表结构

public interface ResultSetMetaData 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。以下代码片段创建 ResultSet 对象 rs,创建 ResultSetMetaData 对象 rsmd,并使用 rsmd 查找 rs 有多少列,以及 rs 中的第一列是否可以在 WHERE 子句中使用。ResultSet rs = stmt.executeQuery("SELECT a, ...

Java代码中,如何监控Mysql的binlog?

通过监听TableMapEventData事件,可以获取操作的数据库名称、表名称以及表ID,以便后续处理。在实际操作中,我们可能只需要关注特定表的事件,因此可以提前设置表名单,通过表ID到表名的映射关系实现数据过滤。针对更新操作,我们对返回的数据进行处理,使用UpdateRowsEventData获取更新的行数据,并通过自定义方法...

Java程序可以检测到Oracle中表的更新变化吗

自动检测可能有点困难,简单的做法是,你可以在每次查询的时候判断指定的字段是否更新了,当更新了再执行某些操作之类的,我做过类似的,每次查询看时间的变化,如果有变化,则做某些操作,至于实时监测,java里我倒没见过。

java用fileReader可以把.conf文件中的内容按行读取出来,然后要怎样把...

mysql数据库中的表结构是这样地:Product.Serial varchar(20)Beep.EnableLevel varchar(20)数据库名称是db_mydb 表名称是tb_mytable 从每行读出的内容提取出来:String str1 = "010";String str2 = "1";使用阿帕奇出品的commons包中的QueryRunner 对象来操作存入数据库(采用了c3p0连接池)Quer...

java 查询某一张表里面的数据,比对某一个数据库的数据,两边的数据...

两张表结构是否一样,如果一样的话,请问你的数据库是oracle数据库么,如果是oracle有merge语句,关于merge的语句使用,楼主可参考相关资料,如果是其他数据库,个人知道的只能是挨个比对,然后update

用java如何将查询的结果在table中显示

要连接此数据库,需使用java.sql包中的类DriverManager。此类是用于管理JDBC驱动程序的实用程序类。它提供了通过驱动程序取得连接、注册,撤消驱动程序, 设置登记和数据库访问登录超时等方法。具体连接方法如下:第一步:定位、装入和链接SybDriver类;driver="com.sybase.jdbc.SybDriver";SybDriver sybdriver=...

java五层架构(java五层架构模式书)

众所周知,java程序是依托于虚拟机来执行的,这样编译过的java代码不是真正意义的可以运行的代码,而是一个介于两者之间的中立体,这样就可以在任何平台上互补冲突的执行而不犯错误这也是java最大的特点之一。 三、API以及扩展 java基本功能都依赖于核心函数库(类库,方法库)来执行。所有基本方法和类,都可以在api文档中...

Java如何实现将源数据库A中的所有表及表数据复制到目标数据库B。(ORA...

如果A库中的数据量不大,可以直接使用pl/sql 工具,导出数据库结构和数据,然后到B数据库中执行导出的命令。这样不就解决了,干吗要有java呢?用java比较慢,我弄过一次!如果非要用java可以把A中的数据导入到一个excel表中,然后使用A库的建表语句在B中建表,使用java把excel表中的数据导入即可,...

java程序读取db2数据库中所有数据表以及表数据,创建到mysql数据库...

3. 帮刚刚读出来的表结构组装成建表语句. create 一下就可以了.4.关于数据类型我也不是很清楚,你可以在网上查一查db2有哪些数据类型.然后在建表的时候做一下儿转换就可以了.5.你说的也就是把刚刚查询出来的数据插入到数据库中.insert 就可以了.其实java 操作数据库很简单的.不同于c.查询出来后...

数据库表结构可以由hibernate等ORM工具生成,如何生成?请解释一下

PowerDesigner 主要是用于数据库表结构的设计阶段的,Hibernate 用于对数据库的访问的反转控制,让程序员从繁琐的SQL语句中解脱出来。例如:使用JDBC连接数据库,要对数据库做操作的话,必须组织具体execute的SQL语句——“select * from * [update/delete] ……”。相信此时你想的最多的是:“要是能...

如何利用已知程序的功能实现 已知程序如下 已知有如下程序 已知如下程序段for 已知某工程的作业程序 已知以下程序段 java简单程序 java程序分为哪两类 java简单程序代码大全
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
3dmax文件怎么保存为fbx格式 晒笋干碰上下雨天如何办 ...我的出行路线提建议。请推荐给朋友长辈的特产礼物 蓝莓玛格丽持小饼干制作方法 三国中,是不是郭嘉最聪明? SAMSUNG C&amp;T CORPORATION是什么公司 Normalized C&amp;L是什么意思? C&amp;W tech 是什么 我是一名高中生以成年,请问怎么才能办信用卡 哪些地区可以种植棕榈树?北方可以种哪些品种? 请问EXCEL 如何采集非首列的数据? WPS/EXCEL中,如何采集获取数值中的部分字段? 花呗到期还款还不上可以临时改成分期吗 花呗临时额度已到期,可以分期还款吗 使用java 读取指定路径的目录结构;帮我把具体的代码,例子写出来,谢谢~~ hpb59-1铅黄铜的介绍 头皮干燥有头皮屑怎么治 怎样区别青铜和黄铜 头皮干燥头屑多怎么办?有产品可以改善这一点吗? 干性头皮屑怎么治疗? 62铜,国标铜,黄铜有什么区别 500人的化粪池需做多大? 住宅人数9600人需要多大的化粪池?清淘周期是多久? Microsoft PowerPoint 2010被加密过的文件为什么WPS演示破解。 如果点击只读,打开后直接可以编辑或保存。 wps的ppt文档属性显示为“已加密&quot;打不开,怎么办 七八十人需要多大的化粪池才能够满足需求 七八十人需要多大的化粪池才能够满足需求? 我家WPS版的PPT无法加密? 一个三层办公楼,使用人数100人,大概需要多少立方的化粪池,,谢谢 1500人化粪池多大 法律对商标侵权免责事由有哪些 商标侵权被告人如何抗辩 侵犯商标专用权的抗辩有哪些形式 商标侵权免责条款有哪些 侵犯商标专用权的抗辩有什么形式 商标侵权的抗辩事由包括哪些? 如何在商标使用中进行商标侵权抗辩 商标侵权的抗辩事由包括哪些 被告商标侵权被告该如何抗辩 商标专利侵权的抗辩事由有哪些? 什么是商标合理使用,商标合理使用的侵权抗辩 法律规定商标侵权不能不承担赔偿责任有哪些 商标侵权免责有哪些 商标侵权的抗辩事由有哪些 商标法构成侵权不承担赔偿的有哪些 商标侵权免责条款 王强的近期工作 梦见我把开得鲜艳的百合花根拔了些 从结婚开始(琦琦) NBA快船队队员身一高、年薪