转载地址:
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 类的代码如下:
003 | public static void main(String argv[]) |
007 | String ul,namestr,typestr,cstr,strn,indexstr,prostr; |
010 | String[] type={ "table" }; |
011 | ul= "jdbc:odbc:useDSN" ; |
013 | Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); |
015 | Connection con=DriverManager.getConnection(ul, "sa" , "" ); |
017 | DatabaseMetaData dbmd=con.getMetaData(); |
019 | ResultSet rs=dbmd.getTables( null , null , null ,type); |
024 | namestr=rs.getString( "TABLE_NAME" ); |
026 | typestr=rs.getString( "TABLE_TYPE" ); |
028 | System.out.println( "输出数据源中所有表的信息" ); |
029 | strn= "数据库表名:" +namestr+ " " + "表的类型:" +typestr; |
030 | System.out.println(strn); |
033 | rs=dbmd.getColumns( null , null , "student" , "%" ); |
038 | namestr=rs.getString( "TABLE_NAME" ); |
040 | cstr=rs.getString( "COLUMN_NAME" ); |
042 | typestr=rs.getString( "TYPE_NAME" ); |
044 | data=rs.getShort( "DATA_TYPE" ); |
046 | System.out.println( "输出数据库中列的信息" ); |
047 | strn= "表名:" +namestr+ " " + "列名:" +cstr+ " " + "列类型:" + " " + "列SQL 类型:" +data; |
048 | System.out.println(strn); |
051 | rs=dbmd.getIndexInfo( null , null , "student" , false , false ); |
056 | namestr=rs.getString( "INDEX_NAME" ); |
058 | index=rs.getInt( "TYPE" ); |
082 | strn= "索引名:" +namestr+ " " + "索引类型:" +index; |
083 | System.out.println(strn); |
086 | rs=dbmd.getProcedures( null , null , "%" ); |
088 | System.out.println( "存储过程信息" ); |
092 | namestr=rs.getString( "PROCEDURE_NAME" ); |
094 | pron=rs.getInt( "PROCEDURE_TYPE" ); |
113 | strn= "存储过程名称:" +namestr+ " " + "存储过程类型:" +prostr; |
114 | System.out.println(strn); |
117 | rs=dbmd.getProcedureColumns( null , null , "%" , "%" ); |
119 | System.out.println( "存储过程列信息" ); |
123 | namestr=rs.getString( "PROCEDURE_NAME" ); |
125 | prostr=rs.getString( "COLUMN_NAME" ); |
126 | strn= "存储过程:" +namestr+ " " + "存储过程列名:" +prostr; |
127 | System.out.println(strn); |
134 | System.out.println(e.getMessage()); |
因为程序使用了JDBC 类,所以需要引入import java.sql.*;包。