-
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.*;包。