`
windmerlin
  • 浏览: 4300 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类

使用DatabaseMetaData接口和ResultSetMetaData扫描数据库结构

    博客分类:
  • J2SE
阅读更多

首先是DatabaseMetaData接口:

public static void main(String[] args) {
		
		//这里没有指定数据库
		String url = "jdbc:mysql://127.0.0.1:3306/";
		String user = "root";
		String pass = "";
		try {

			Class.forName("com.mysql.jdbc.Driver").newInstance();
			Connection conn = DriverManager.getConnection(url, user, pass);
			DatabaseMetaData metadata = conn.getMetaData();
			System.out.println("数据库已知的用户: "+ metadata.getUserName());
			System.out.println("数据库的系统函数的逗号分隔列表: "+ metadata.getSystemFunctions());
			System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ metadata.getTimeDateFunctions());
			System.out.println("数据库的字符串函数的逗号分隔列表: "+ metadata.getStringFunctions());
			System.out.println("数据库供应商用于 'schema' 的首选术语: "+ metadata.getSchemaTerm());
			System.out.println("数据库URL: " + metadata.getURL());
			System.out.println("是否允许只读:" + metadata.isReadOnly());
			System.out.println("数据库的产品名称:" + metadata.getDatabaseProductName());
			System.out.println("数据库的版本:" + metadata.getDatabaseProductVersion());
			System.out.println("驱动程序的名称:" + metadata.getDriverName());
			System.out.println("驱动程序的版本:" + metadata.getDriverVersion());
			
			System.out.println();
			System.out.println("数据库中使用的表类型");
			ResultSet rs = metadata.getTableTypes();
			while (rs.next()) {
				System.out.println(rs.getString(1));
			}
			rs.close();
			
			System.out.println();
			/**
			 * 获取指定的数据库的所有表的类型,getTables()的第一个参数就是数据库名
			 * 因为与MySQL连接时没有指定,这里加上,剩下的参数就可以为null了
			 * 第二个参数是模式名称的模式,但是输出也是什么都没有。谁知道告诉我一声
			 */
			System.out.println("获取指定的数据库的所有表的类型");
			ResultSet rs1 = metadata.getTables("ssi2bbs", null, null, null);
			while (rs1.next()) {
				System.out.println();
				System.out.println("数据库名:"+ rs1.getString(1));
				System.out.println("表名: "+rs1.getString(3));
				System.out.println("类型: "+rs1.getString(4));
			}
			rs1.close();
			
			System.out.println();
			System.out.println("获取指定的数据库的表的主键");
			//获取指定的数据库的表的主键,第二个参数也是模式名称的模式,使用null了
			ResultSet rs2 = metadata.getPrimaryKeys("mysql", null, "db");
			while (rs2.next()) {
				System.out.println("主键名称: "+ rs2.getString(4));
			}
			rs2.close();
			
			System.out.println();
			System.out.println("DatabaseMetaData.getIndexInfo()方法返回信息:");
			ResultSet rs3 = metadata.getIndexInfo("ssi2bbs", null, "user", false, true);
			while (rs3.next()) {
				System.out.println("数据库名: "+ rs3.getString(1));
				System.out.println("表模式: "+ rs3.getString(2));
				System.out.println("表名称: "+ rs3.getString(3));
				System.out.println("索引值是否可以不唯一: "+ rs3.getString(4));
				System.out.println("索引类别: "+ rs3.getString(5));
				System.out.println("索引名称: "+ rs3.getString(6));
				System.out.println("索引类型: "+ rs3.getString(7));
				System.out.println("索引中的列序列号: "+ rs3.getString(8));
				System.out.println("列名称: "+ rs3.getString(9));
				System.out.println("列排序序列: "+ rs3.getString(10));
				System.out.println("TYPE为 tableIndexStatistic时它是表中的行数否则它是索引中唯一值的数量: "+ rs3.getString(11));
				System.out.println("TYPE为 tableIndexStatisic时它是用于表的页数否则它是用于当前索引的页数: "+ rs3.getString(12));
				System.out.println("过滤器条件: "+ rs3.getString(13));
			}
			rs3.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 ResultSetMetaData接口, 用于获取关于ResultSet 对象中列的类型和属性信息的对象。下面的代码是把一个表的列信息打印了出来。当然了,这只是一部分。详细的参考JAVA JDK。

public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssi2bbs","root","");
			PreparedStatement ps = conn.prepareStatement("select * from bbs");
			ResultSet rs = ps.executeQuery();
			ResultSetMetaData rsme = rs.getMetaData();
			
			int columnCount = rsme.getColumnCount();
			System.out.println("ResultSet对象中的列数"+ columnCount);
			for (int i = 1; i < columnCount ; i++) {
				System.out.println();
				System.out.println("列名称: "+ rsme.getColumnName(i));
				System.out.println("列类型(DB): " + rsme.getColumnTypeName(i));
				System.out.println("长度: "+ rsme.getPrecision(i) );
				System.out.println("是否自动编号: "+ rsme.isAutoIncrement(i));
				System.out.println("是否可以为空: "+ rsme.isNullable(i));
				System.out.println("是否可以写入: "+ rsme.isReadOnly(i));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

 呵呵,希望对大家工作有帮助。

分享到:
评论
2 楼 rawli 2012-07-26  
DatabaseMetaData 接口的 getTables() 方法输出的结果如下



获取指定的数据库的所有表的类型

数据库名:ssi2bbs
表名: forum
类型: TABLE

数据库名:ssi2bbs
表名: forumbbs
类型: TABLE

数据库名:ssi2bbs
表名: user
类型: TABLE

数据库名:ssi2bbs
表名: ssi2view
类型: VIEW



因为是MySql , 只显示了数据库自身的表和视图。Oracle可以显示更多。再来看看 ResultSetMetaData 接口演示代码的打印结果



ResultSet对象中的列数20

列名称: Host
列类型(DB): CHAR
长度: 60
是否自动编号: false
是否可以为空: 0
是否可以写入: false

列名称: Db
列类型(DB): CHAR
长度: 64
是否自动编号: false
是否可以为空: 0
是否可以写入: false

列名称: User
列类型(DB): CHAR
长度: 16
是否自动编号: false
是否可以为空: 0
是否可以写入: false
1 楼 windmerlin 2010-01-07  
<p>DatabaseMetaData 接口的 getTables() 方法输出的结果如下</p>
<p> </p>
<p>获取指定的数据库的所有表的类型</p>
<p>数据库名:ssi2bbs<br>表名: forum<br>类型: <span style="color: #ff0000;">TABLE</span></p>
<p>数据库名:ssi2bbs<br>表名: forumbbs<br>类型: <span style="color: #ff0000;">TABLE</span></p>
<p>数据库名:ssi2bbs<br>表名: user<br>类型: <span style="color: #ff0000;">TABLE</span></p>
<p>数据库名:ssi2bbs<br>表名: ssi2view<br>类型: <span style="color: #ff0000;">VIEW</span></p>
<p> </p>
<p>因为是MySql , 只显示了数据库自身的表和视图。Oracle可以显示更多。再来看看 ResultSetMetaData 接口演示代码的打印结果</p>
<p> </p>
<p>ResultSet对象中的列数20</p>
<p>列名称: Host<br>列类型(DB): CHAR<br>长度: 60<br>是否自动编号: false<br>是否可以为空: 0<br>是否可以写入: false</p>
<p>列名称: Db<br>列类型(DB): CHAR<br>长度: 64<br>是否自动编号: false<br>是否可以为空: 0<br>是否可以写入: false</p>
<p>列名称: User<br>列类型(DB): CHAR<br>长度: 16<br>是否自动编号: false<br>是否可以为空: 0<br>是否可以写入: false</p>
<p> </p>
<p> </p>
<p>太多了,不再粘贴了。大致就是这样了。<img src="/images/smiles/icon_biggrin.gif" alt=""></p>
<p> </p>
<p> </p>
<p> </p>

相关推荐

    DatabaseMetaData生成数据库DLL

    DatabaseMetaData生成数据库DLL

    DatabaseMetaData 接口

    DatabaseMetaData 接口DatabaseMetaData 接口作为整体提供有关数据库的综合信息。 其中某些方法采用“字符串”自变量作为目录和模式名称。DB2 Everyplace 忽略这些自变量。 此处的某些方法以 ResultSet 对象的...

    JDBC元数据操作--DatabaseMetaData接口Demo

    DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。 文章地址:http://blog.csdn.net/chen_zw/article/details/18816599

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    DatabaseMetaDate接口

    DatabaseMetaData 接口作为整体提供有关数据库的综合信息。

    calibre-web 数据库文件metadata.db 下载

    calibre-web 数据库文件metadata.db 下载

    数据库原理网上授课平台(二).doc

    JDBC由一组用Java语言编写的接口和类组成,是对数据库操作的对象封装,可以实现与数据库的无关性。它以成为一种供数据库开发者使用的标准API。  6.1.1 JDBC的基本功能  a.建立与数据库的连接。  b.发送SQL语言。 ...

    数据库原理网上授课平台(一).doc

    JDBC由一组用Java语言编写的接口和类组成,是对数据库操作的对象封装,可以实现与数据库的无关性。它以成为一种供数据库开发者使用的标准API。  6.1.1 JDBC的基本功能  a.建立与数据库的连接。  b.发送SQL语言。 ...

    Java数据库编程宝典3

    第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...

    Java数据库编程宝典2

    第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...

    Java数据库编程宝典1

    第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...

    Java数据库编程宝典4

    第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...

    Java连接数据库和断开数据库讲解 代码.rar

    Java连接数据库和断开数据库讲解 代码,研究JDBC连接SQLServer数据库,很简单但很实用的例子,从建立驱动连接到打开数据库的过程,欢迎学习参考。主要代码如下:  Class.forName(...

    Java创建和关闭数据库连接的方法附代码.rar

    Java使用JDBC创建和关闭数据库连接的方法附代码,学习和熟悉一下JDBC的用法,创建一个数据库连接,并关闭或断开这个连接,面向java初学者。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载...

    metadata.db

    calibre 数据库,放在挂载的目录下面; 解决问题:DB location is not valid, please enter correct path

    自己开发java代码生成工具

    在公司做项目,特别是业务系统的时候,大量的表单和增删改查,而且后台Ui经常用一些easyui等...jdbc DatabaseMetaData(连接数据库 读取表结构) freemarker (根据订制的模版生成 文件) 美化swing界面 substance 皮肤包

    Java获取数据库属性信息.rar

    Java获取数据库属性信息,使用DatabaseMetaData对象获取数据源相关信息。还可获取索引名、获取存储过程信息、获取存储过程列信息、输出存储过程列信息等。

    jtdsJDBC Driver

    JTDS完全与JDBC 3.0兼容,支持只向前的,和可滚动/可更新的结果集(ResultSets)中并行(完全独立)语句,并且可实施所有databasemetadata和resultsetmetadata方法。 文件有说明spring+hibernate+c3p0+jtds的配置

    java数据库连接池代码实现

    DatabaseMetaData metaData=conn.getMetaData(); int dataCount=metaData.getMaxConnections(); //writerLog("数据库最大连接数为:"+dataCount); if(dataCount&gt;0&&maxCount&gt;dataCount){ ...

    jdbc基础和参考

    C语言实现的,提供语言和(基于SQL的)数据库进行交互的“一致性”的接口 JDBC:java版本的ODBC JDBC连接数据库的步骤: 1.注册驱动(加载驱动): 注册的方式: 1.使用类加载器(使用反射的方式) Class.for...

Global site tag (gtag.js) - Google Analytics