转载地址:
http://www.codefans.net/articles/1791.shtml
Java获得数据库基本信息,包括表的信息、表中列的信息、索引信息、存储过程信息等。先创建与数据库的连接,通过Connection 对象的getMetaData()方法可以创建DatabaseMetaData对象,从该对象中获取数据库的基本信息。通过使用DatabaseMetaData 对象的getDatabaseProductName()方法可以获取连接的数据库DBMS 名称,使用getUserName()方法可以获取建立连接使用的用户名。获取表的信息可以使用该对象的getTables()方法,如:
ResultSet rs=dbmd.getTables(catalog,schemapattern,tablenamepattern,type[]);
其中catalog 为目录名,null 表示忽略目录;schemapattern 为大纲的匹配模式,null 表示忽略;tablenamepattern 表示表名称的匹配模式;type 为需要检索的表类型列表。使用getTables()获得一个结果集,此结果集中每一行都有一个表的信息,可以通过getInt()、getString()等方法来获得每一行中各列的信息,主要有TABLE_NAME、TABLE_TYPE 等,关于这些信息的描述在程序中作了注释,也可以参考JDBC 的API 手册。通过使用DatabaseMetaData 对象的getColumns()方法来获得数据库表的列的信息,如:
ResultSet rs=dbmd.getColumns(catalog,schemapattern,tablenamepattern,columnsnamepattern);
其中columnsnamepattern 表示列名匹配模式。通过getColumns()方法获得的结果集每一行都是一个列的描述,主要有TABLE_NAME、COLUMN_NAME 、TYPE_NAME 等。获取索引信息是使用了DatabaseMetaData 对象的getIndexInfo()方法,方法使用如下:
ResultSet rs=dbmd.getIndexInfo(catalog,schemapattern,tablenamepattern,unique,approximate);
其中,unique 为boolean 型,当为真值时,返回具有唯一值的索引,而为假时,不论索引值是否唯一都返回;approximate 为true 时,返回近似值,为false 时,返回精确值。通过getIndexInfo()方法获得的结果集中每一行都是一个索引的描述,主要有TABLE_NAME、INDEX_NAME、TYPE 等。使用DatabaseMetaData 对象的getProcedures()方法获取存储过程的信息,使用方法如下:
ResultSet rs=dbmd.getProcedures(catalog,schemapattern,procedurenamepattern);
其中,procedurenamepattern 是存储过程名称的匹配模式。该方法返回的结果集是存储过程的描述信息,主要有PROCEDURE_NAME、PROCEDURE_TYPE 等。使用DatabaseMetaData 对象的getProceduresColumns()方法获取存储过程的信息,使用方法如下:
ResultSet rs=dbmd.getProceduresColumns(catalog,schemapattern,procedurenamepattern,cloumnnamepattern);
其中,cloumnnamepattern 表示列名的匹配模式。具体的程序代码如下:
1.编写useTable 类的基本框架,在该类中仅包括main()方法,在main()方法中先加载驱动程序,建立与数据库的连接,创建数据库表,获取表中信息的结果集,输出表的信息,获取表中列的信息,输出表中列的信息,获取索引信息,输出索引信息,获取存储过程信息,输出存储过程信息。
2.对数据库编程,useTable 类的代码如下:
001 |
class useTable |
002 |
{ |
003 |
public static void main(String argv[]) |
004 |
{ |
005 |
try |
006 |
{ |
007 |
String ul,namestr,typestr,cstr,strn,indexstr,prostr; |
008 |
short data; |
009 |
int index,pron; |
010 |
String[] type={ "table" }; |
011 |
ul= "jdbc:odbc:useDSN" ; |
012 |
//加载驱动程序 |
013 |
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); |
014 |
//建立连接 |
015 |
Connection con=DriverManager.getConnection(ul, "sa" , "" ); |
016 |
//使用DatabaseMetaData 对象获取数据源相关信息 |
017 |
DatabaseMetaData dbmd=con.getMetaData(); |
018 |
//获取表中信息的结果集 |
019 |
ResultSet rs=dbmd.getTables( null , null , null ,type); |
020 |
//输出表的信息 |
021 |
while (rs.next()) |
022 |
{ |
023 |
//获取表名 |
024 |
namestr=rs.getString( "TABLE_NAME" ); |
025 |
//获取表的类型 |
026 |
typestr=rs.getString( "TABLE_TYPE" ); |
027 |
//输出结果集 |
028 |
System.out.println( "输出数据源中所有表的信息" ); |
029 |
strn= "数据库表名:" +namestr+ " " + "表的类型:" +typestr; |
030 |
System.out.println(strn); |
031 |
} |
032 |
//获取表中列的信息 |
033 |
rs=dbmd.getColumns( null , null , "student" , "%" ); |
034 |
//输出表中列的信息 |
035 |
while (rs.next()) |
036 |
{ |
037 |
//获取表名 |
038 |
namestr=rs.getString( "TABLE_NAME" ); |
039 |
//获取列名 |
040 |
cstr=rs.getString( "COLUMN_NAME" ); |
041 |
//获取列类型 |
042 |
typestr=rs.getString( "TYPE_NAME" ); |
043 |
//获取列的SQL 类型 |
044 |
data=rs.getShort( "DATA_TYPE" ); |
045 |
//输出列信息 |
046 |
System.out.println( "输出数据库中列的信息" ); |
047 |
strn= "表名:" +namestr+ " " + "列名:" +cstr+ " " + "列类型:" + " " + "列SQL 类型:" +data; |
048 |
System.out.println(strn); |
049 |
} |
050 |
//获取索引信息 |
051 |
rs=dbmd.getIndexInfo( null , null , "student" , false , false ); |
052 |
//输出索引信息 |
053 |
while (rs.next()) |
054 |
{ |
055 |
//获取索引名 |
056 |
namestr=rs.getString( "INDEX_NAME" ); |
057 |
//获取索引类型 |
058 |
index=rs.getInt( "TYPE" ); |
059 |
switch (index) |
060 |
{ |
061 |
case 0 : |
062 |
{ |
063 |
indexstr= "没有索引" ; |
064 |
break ; |
065 |
} |
066 |
case 1 : |
067 |
{ |
068 |
indexstr= "聚集索引" ; |
069 |
break ; |
070 |
} |
071 |
case 2 : |
072 |
{ |
073 |
indexstr= "哈希表索引" ; |
074 |
break ; |
075 |
} |
076 |
case 3 : |
077 |
{ |
078 |
indexstr= "其它索引" ; |
079 |
break ; |
080 |
} |
081 |
} |
082 |
strn= "索引名:" +namestr+ " " + "索引类型:" +index; |
083 |
System.out.println(strn); |
084 |
} |
085 |
//获取存储过程信息 |
086 |
rs=dbmd.getProcedures( null , null , "%" ); |
087 |
//输出存储过程信息 |
088 |
System.out.println( "存储过程信息" ); |
089 |
while (rs.next()) |
090 |
{ |
091 |
//获取存储过程名称 |
092 |
namestr=rs.getString( "PROCEDURE_NAME" ); |
093 |
//获取存储过程类型 |
094 |
pron=rs.getInt( "PROCEDURE_TYPE" ); |
095 |
switch (pron) |
096 |
{ |
097 |
case 0 : |
098 |
{ |
099 |
prostr= "返回结果未知" ; |
100 |
break ; |
101 |
} |
102 |
case 1 : |
103 |
{ |
104 |
prostr= "没有返回结果" ; |
105 |
break ; |
106 |
} |
107 |
case 2 : |
108 |
{ |
109 |
prostr= "有返回结果" ; |
110 |
break ; |
111 |
} |
112 |
} |
113 |
strn= "存储过程名称:" +namestr+ " " + "存储过程类型:" +prostr; |
114 |
System.out.println(strn); |
115 |
} |
116 |
//获取存储过程列信息 |
117 |
rs=dbmd.getProcedureColumns( null , null , "%" , "%" ); |
118 |
//输出存储过程列信息 |
119 |
System.out.println( "存储过程列信息" ); |
120 |
while (rs.next()) |
121 |
{ |
122 |
//获取存储过程名称 |
123 |
namestr=rs.getString( "PROCEDURE_NAME" ); |
124 |
//获取存储过程类型 |
125 |
prostr=rs.getString( "COLUMN_NAME" ); |
126 |
strn= "存储过程:" +namestr+ " " + "存储过程列名:" +prostr; |
127 |
System.out.println(strn); |
128 |
} |
129 |
//关闭连接 |
130 |
con.close(); |
131 |
} |
132 |
catch (Exception e) |
133 |
{ |
134 |
System.out.println(e.getMessage()); |
135 |
e.printStackTrace(); |
136 |
} |
137 |
} |
138 |
} |
因为程序使用了JDBC 类,所以需要引入import java.sql.*;包。