`
windmerlin
  • 浏览: 4432 次
  • 性别: 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` 是Java中的一个接口,它提供了关于JDBC驱动程序和连接数据库的信息。通过调用`Connection`对象的`getMetaData()`方法,我们可以获取到`DatabaseMetaData`实例,从而获取到关于数据库的各种元...

    DatabaseMetaData 接口

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

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

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

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

    总结起来,`DatabaseMetaData`提供了丰富的接口,允许开发者在Java应用程序中获取Oracle数据库的元数据,包括表信息、列信息、主键和外键等,这对于数据库的设计、维护和查询优化都非常有价值。在使用时,需要注意...

    DatabaseMetaDate接口

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

    java判断数据库表是否存在

    ### Java判断数据库表是否存在 ...在实际开发过程中,这种方法可以帮助我们更好地管理和维护数据库结构,避免因表不存在而引发的各种错误。同时,掌握这些基础知识对于深入理解Java数据库编程也是非常有帮助的。

    JAVA连接数据库进行相应的操作

    以及获取和修改数据使用JDBC加载驱动程序、连接数据库、执行SQL语句和处理结果集使用处理预编译语句的接口PreparedStatement执行带参数的动态SQL语句利用CallableStatement接口执行SQL的存储过程使用Database...

    jsp数据库脱裤脚本,脱各种数据库

    22. 使用JSP可以实现数据备份和恢复,例如备份数据库结构和数据,恢复数据库。 23. 使用JSP可以实现数据库迁移,例如从一个数据库迁移到另一个数据库。 24. 使用JSP可以实现数据同步,例如同步两个数据库之间的...

    java获取数据库主外键

    本文将详细介绍如何使用Eclipse和JDBC API来获取MySQL数据库中的表结构以及主外键信息。 #### 一、准备工作 在开始之前,请确保你的开发环境已经安装了Eclipse IDE,并且项目中已经配置好了MySQL的JDBC驱动。此外...

    java对数据库操作常用对象及方法整合[归类].pdf

    Java 语言中经常使用的数据库操作对象和方法整合,主要包括 DatabaseMetaData、ResultSet、ResultSetMetaData 等对象。 DatabaseMetaData 对象 DatabaseMetaData 对象提供了关于整个数据库的信息,包括表名、表的...

    Accp8.0\S2\使用Java实现数据库编程 第二章

    9.数据库元数据:了解如何使用DatabaseMetaData接口获取数据库的元信息,如表结构、列信息等。 10.数据库设计和范式理论:可能涉及关系数据库设计的基本原则,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)...

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

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

    经典用户管理数据库结构

    本篇文章将详细探讨"经典用户管理数据库结构"的设计原理和关键要素,尤其适用于那些需要全面功能的开发项目。 首先,我们要理解用户管理数据库的核心目标:确保数据的安全性、完整性和易用性。一个良好的用户管理...

    通过代码导出数据库结构,变成文档

    数据库结构清晰、规范,能极大地提高数据管理和使用的效率。本话题主要关注如何通过代码自动化地将数据库结构导出并生成文档,这在数据库设计、维护、共享和版本控制等方面具有重要意义。 首先,我们需要理解...

    怎样用JDBC查看数据库的详细信息

    总结来说,使用JDBC查看数据库的详细信息主要涉及加载驱动、建立连接、获取`DatabaseMetaData`对象并调用其方法,以及正确处理结果集和关闭资源。这对于任何需要与数据库交互的Java应用都是至关重要的。通过阅读博文...

    Java程序设计:chapter14 JDBC技术和数据库开发应用.ppt

    Java程序设计:Chapter14主要探讨的是JDBC(Java Database Connectivity)技术和如何使用它进行数据库开发应用。JDBC是Java语言中用于与各种数据库交互的一组API,它为程序员提供了在Java应用程序中连接和访问数据库...

    metadata.db

    1. 数据库结构:“metadata.db”是一个SQLite数据库,SQLite是一种轻量级的关系型数据库管理系统,适用于单机环境或者小型网络,无需专门的服务器进程,直接嵌入到应用程序中。在Calibre中,每个电子书的条目对应...

    android资料

    这篇资料着重关注了两个关键知识点:`requestWindowFeature()`函数和数据库分析,特别是通过`DatabaseMetaData`接口进行的JDBC操作。 首先,`requestWindowFeature()`是Android应用开发中的一个重要方法,它属于`...

    数据库元数据资料,关于oracle的

    数据库元数据是关于数据库结构和内容的信息,包括但不限于表、列、索引、视图、存储过程等的详细描述。在Oracle数据库中,这些信息存储在数据字典中,可以通过数据库元数据API来访问和查询。 在Java编程中,我们...

Global site tag (gtag.js) - Google Analytics