论坛首页 Java企业应用论坛

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

浏览 4438 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-07  

首先是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();
		}
		
	}

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

   发表时间:2010-01-07  

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

 

 

太多了,不再粘贴了。大致就是这样了。

 

 

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics