• 沒有找到結果。

访问数据库元信息

处理异常和警告 处理异常和警告 处理异常和警告 处理异常和警告

4.4 访问数据库元信息

}

catch(Exception ex){

System.out.println(ex.getMessage() );

ex.printStackTrace ();

} }

}

该例程运行结果如下

Mike Joden 45 New York Three Stree [email protected] H.J.Scolly 27 Florlida NewBridge D [email protected] Cheng Jun 28 ChengDuShiYangShiJie [email protected]

4.4 访问数据库元信息

数据库元信息包括数据库中的表 表中的列 表的索引 数据类型 存储过程和对SQL 的支持程度等信息 利用这些信息 用户可以在完全不了解数据库结构的情况下编写访问 数据库的应用程序

当创 建了与数据流 的连接后 Connection 对象包含数据库的各种元信息 利 用 Connection 对象的 getMetaData()方法可以创建一个 DatabaseMetaData 对象 在该对象上可 以获取到数据库的元信息

创建DatabaseMetaData 对象可以使用类似下面的语句 DatabaseMetaData dmd=con.getMetaData();

DatabaseMetaData 对象有很多方法用于获取数据库元信息 在这些方法中 有些方法 的参数会使用到字符串搜索匹配模式 这些匹配模式的使用方法和 ODBC 中一样 即 字符 - 用于匹配任意的单个字符 % 匹配任意长度的任意字符串 在 Java 中 值为 null 的字符串可以匹配任意字符串

1. 获取数据库基本信息

下面的一些方法用于获取数据库基本信息

getDatabaseProductName 返回连接的数据库的DBMS 名称 getDatabaseProductVersion 返回连接的数据库的DBMS 版本号 getDriverName 返回驱动程序名称

getDriverName 返回驱动程序版本号

getURL 用于获取数据库的URL 返回值是 String 对象 getUserName 返回建立连接使用的用户的名称

IsReadOnly 返回数据库是否为只读状态

在例程4-2 中使用了上述的一些方法 读者可以参考 2. 获取表的信息

获取表的信息可以使用getTables 如



ResultSet ts=dmd.getTables(catalog schemapattern tablenamepattern type[]);

其中参数意义分别如下

catalog 字符串 为目录名 使用 空串 可检索没有目录的表 null 表示忽略 目录

schemapattern 字符串 为大纲名称的匹配模式 使用 空串 可检索没有大纲 的表

tablenamepattern 字符串 为表名匹配模式

type 字符串 为需要检索的表类型列表 null 表示返回所有类型

使用getTables()方法可得到一个 ResultSet 对象 其每一行都对一个表的描述 每一行 各列的类型和意义分别如下

TABLE_CAT String 类型 表的目录 可能为 null TABLE_NAME String 类型 表的名称

TABLE_SCHEMA String 类型 表的大纲 可能为 null

TABLE_TYPE String 类型 表的类型 可能的类型有 TABLE VIEW SYSTEM TABLE GLOBAL TEMPORARY ALIAS 和 SYNONYM

REMARKS String 类型 表的注释 可能为 null

下面的例程4-9 使用了 getTables 方法来获得创建连接的数据库中的表的信息 程 序运行将获得数据库中的表名及其类型

例程 4-10 import java.sql.*;

class testtableinfo{

public static void main(String argv[]){

try{

String url user pwd;

String tn tt str;

String[] types={"TABLE"};

url="jdbc:odbc:mytestDSN";

user="sa";

pwd="";

//加载驱动程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//建立连接

Connection con=DriverManager.getConnection(url user pwd);

//使用 DataMetaData 对象获取数据源相关信息 DatabaseMetaData dmd=con.getMetaData();

//获得表信息结果集

ResultSet rs=dmd.getTables("mysqldata" "dbo" null types);

//输出表信息 while(rs.next()){

//获取表名



tn=rs.getString("TABLE_NAME");

//获取表类型

tt=rs.getString("TABLE_TYPE");

str="表名 "+tn+" "+"表类型 "+tt;

System.out.println(str);

}

con.close();

}

catch(Exception e){

System.out.println(e.getMessage() );

e.printStackTrace ();

} }

}

例程运行结果如下

表名 customer 表类型 TABLE 表名 employee 表类型 TABLE 3. 获取列的信息

获取表的信息可以使用getColumns 如

ResultSet ts=dmd. getColumns (catalog schemapattern

tablenamepattern columnsnamepattern);

其中参数意义分别如下

catalog 字符串 为目录名 使用 空串 可检索没有目录的表 null 表示忽略 目录

schemapattern 字符串 为大纲名称的匹配模式 使用 空串 可检索没有大纲 的表

tablenamepattern 字符串 为表名匹配模式 columnsnamepattern 字符串 为列名匹配模式

使用getColumns ()方法可得到一个 ResultSet 对象 其每一行都对一个列的描述 每一 行各列的类型和意义分别如下

TABLE_CAT String 类型 表的目录 可能为 null TABLE_NAME String 类型 表的名称

TABLE_SCHEMA String 类型 表的大纲 可能为 null COLUMN_NAME String 类型 列名

DATA_TYPE short 类型 列的 SQL 类型

TYPE_NAME String 类型 数据源中的数据类型名

COLUMN_SIZE int 类型 列的大小 对 char 或 date 类型 该值为最长字符串长度 对于numeric 或 decimal 类型 该值表示精度

BUFFER_LENGTH 没有使用



SQL_DATETIME_SUB int 类型 没有使用

CHAR_OCTET_LENGTH int 类型 对 char 类型 表示允许的最多字符数 import java.sql.*;

class testcolumninfo{

public static void main(String argv[]){

try{

String url user pwd;

String tn cn ct str;

url="jdbc:odbc:mytestDSN";

user="sa";

pwd="";

//加载驱动程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//建立连接

Connection con=DriverManager.getConnection(url user pwd);

//使用 DataMetaData 对象获取数据源相关信息 DatabaseMetaData dmd=con.getMetaData();

//获得表信息结果集

ResultSet rs=dmd.getColumns("mysqldata" "dbo" "employee" "%");

//输出表信息 while(rs.next()){

//获取表名

tn=rs.getString("TABLE_NAME");

//获取列名

cn=rs.getString("COLUMN_NAME");

//获得列类型

ct=rs.getString("TYPE_NAME");

str="表名 "+tn+" 列名 "+cn+" 列类型名 "+ct;



System.out.println(str);

}

con.close();

}

catch(Exception e){

System.out.println(e.getMessage() );

e.printStackTrace ();

} }

}

该例程运行结果如下

表名 employee 列名 EmployeeID 列类型名 nvarchar 表名 employee 列名 employeeName 列类型名 nvarchar 表名 employee 列名 employeeAddress 列类型名 nvarcha 表名 employee 列名 employeeAge 列类型名 smallint 表名 employee 列名 employeeEmail 列类型名 nvarchar 4. 获取索引的信息

获取索引的信息可以使用getIndexInfo 如

ResultSet ts=dmd. getIndexInfo (catalog schemapattern

tablenamepattern unique approximate);

其中参数意义分别如下

catalog 字符串 为目录名 使用 空串 可检索没有目录的表 null 表示忽略 目录

schemapattern 字符串 为大纲名称的匹配模式 使用 空串 可检索没有大纲 的表

tablenamepattern 字符串 为表名匹配模式

unique 布尔值 为 true 时 只返回具有唯一值的索引 为 false 值时 不论索引值是 否只有唯一值都返回

approximate 布尔值 为 true 时 返回结果可以是近似值 为 false 值时 返回结果为 精确值

getIndexInfo 方法返回一个ResultSet 对象 对象中的每一行都是一个索引的描述 每一行中各列的名称 类型和意义分别如下

TABLE_CAT String 表目录 可能为 null TABLE_SCHEMA String 表大纲 可能为 null TABLE_NAME String 表名

NON_UNIQUE boolean 索引是否为唯一值 当类型为 tableIndexStatistic 时 值为 false

INDEX_QUALIFIER String 索引类型 当类型为 tableIndexStatistic 时 值为 null INDEX_NAME String 索引名 当类型为 tableIndexStatistic 时 值为 null



TYPE short 索引类型 有如下索引类型

tableIndexStatic 当与表的索引描述连接时 返回该类型 tableIndexClustered 聚集索引

tableIndexHashed 哈希索引 tableIndexOther 其他索引

ORDINAL_POSITION short 索引中的列顺序号 当类型为 tableIndexStatistic 时 值为0

COLUMN_NAME String 列名 当类型为 tableIndexStatistic 时 值为 null ASC_OR_DESC String 排序方法 A 为升序 D 为降序 如果数据库不支 持排序 则值为null 当类型为 tableIndexStatistic 时 值为 null

CARDINALITY int 当类型为 tableIndexStatistic 时 该值表示表中的行数 否则表 示索引中的唯一值的个数

PAGES int 当类型为 tableIndexStatistic 时 该值表示表的页数 否则表示当前索引 的页数

FILTER_CONDITION String 过滤条件

在下面的例程4-12 中 使用了 getIndexInfo 方法来获得表的索引信息 例程 4-12

import java.sql.*;

class testindexinfo{

public static void main(String argv[]){

try{

String url user pwd;

String tn in it str;

url="jdbc:odbc:mytestDSN";

user="sa";

pwd="";

//加载驱动程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//建立连接

Connection con=DriverManager.getConnection(url user pwd);

//使用 DatabaseMetaData 对象获取数据源相关信息 DatabaseMetaData dmd=con.getMetaData();

//获得索引信息结果集

ResultSet rs=dmd.getIndexInfo ("mysqldataSQL" "dbo" "employee" false false);

//输出索引信息 while(rs.next()){

//获取表名

tn=rs.getString("TABLE_NAME");

//获取索引名

in=rs.getString("INDEX_NAME");



//获取索引类型

int i=rs.getInt("TYPE");

it="";

switch(i) {

case 0:

{it="无索引";break;}

case 1:

{it="聚集索引";break;}

case 2:

{it="哈希排序索引";break;}

case 3:

{it="其他索引";break;}

}

str="表名 "+tn+" 索引名 "+in+" 索引类型 "+it;

System.out.println(str);

}

con.close();

}

catch(Exception e){

System.out.println(e.getMessage() );

e.printStackTrace ();

} }

}

该例程运行结果如下

表名 employee 索引名 null 索引类型 无索引 表名 employee 索引名 index_name 索引类型 聚集索引 表名 employee 索引名 index_address 索引类型 其他索引 表名 employee 索引名 PK_employee 索引类型 其他索引 5. 获取存储过程信息

获取存储过程的信息可以使用getProcedures 如

ResultSet ts=dmd. getProcedures(catalog schemapattern procedurenamepattern);

其中 参数类型和意义分别如下

catalog String 类型 为目录名 使用 空串 可检索没有目录的存储过程 null 表示忽略目录

schemapattern String 类型 表示大纲名称 使用 表示仅返回没有大纲的结果 procedurenamepattern String 类型 表示存储过程名的匹配模式

getProcedures 方法从目录中获取存储过程的描述信息 返回值为ResultSet 对象



结果集中的各列是对存储过程的描述信息 注意 只返回同大纲一致的存储过程描述及标 准的存储过程名 一般按PROCEDURE SCHEMA 和 PROCEDURE NAME 来排序 结 果集中各列的名称 类型和意义分别如下

PROCEDURE CAT String 类型 表示存储过程目录 可为空值 PROCEDURE SCHEMA String 类型 表示存储过程大纲 可为空值 PROCEDURE_NAME String 类型 表示存储过程名

第四 五 六列保留未使用

REMARKS String 类型 存储过程中的解释性说明

PROCEDURE_TYPE short 类型 存储过程的类型 有如下类型 procedureResultUnknown 不知道存储过程是否有返回结果 procedureNoResult 存储过程没有返回结果

procedureReturnResult 存储过程有返回结果

获取存储过程信息的另外一个方法是getProcedureColumns 如 ResultSet rs=dmd.getProceduresColumns(catalog schemapattern

procedurenamepattern columnnamepattern) 其中 参数的类型和意义分别如下

catalog String 类型 表示目录名 表示返回没有目录的结果 null 则表示从选择 标准中删除一个目录名

schemapattern String 类型 表示大纲名称的匹配模式 表示返回没有大纲的结 果

procedurenamepattern String 类型 表示存储过程名的匹配模式 columnnamepattern String 类型 表示列名称的匹配模式

该方法从目录中获得存储过程的参数和结果列的描述 只返回同大纲 存储过程和参 数名一致的存储过程描述 一般按PROCEDURE_SCHEMA 和 PROCEDURE_NAME 来排 序 这样先返回存储过程名 然后是调用的参数名 最后是按列号顺序排列的列的描述

结果集中各个列的名称 类型和意义分别如下

PROCEDURE_CAT String 类型 存储过程目录 可为空值 PROCEDURE_SCHEMA String 类型 存储过程大纲 可为空值 PROCEDURE_NAME String 类型 存储过程名

COLUMN_NAME String 类型 列或参数值

COLUMN_TYPE Short 类型 列或参数的类型 有如下列类型 procedureColumnUnknown 未知的列

procedureColumnIn IN 参数

procedureColumnInOut INOUT 参数 procedureColumnOut OUT 参数

procedureColumnReturn 存储过程返回值 procedureColumnResult 结果集中的结果列

DATA_TYPE Short 类型 java.sql.Types 中的 SQL 类型 TYPE_NAME String 类型 SQL 类型名

PRECISION int 类型 精确值



LENGTH int 类型 按字节计算的数据长度 SCALE short 类型 标度

RADIX short 类型 基数

NULLABLE short 类型 是否包含空值 有如下值 procedureNoNulls 不允许空值

procedureNullable 允许包含空值

procedureNullableUnknown 不能确定是否包含空值 REMARKS String 类型 描述参数或列的内容

有些数据库可能不返回存储过程的列的描述 数据库可自己定义除了REMARKS 之外 的附加列

在下面的例程4-13 中 使用了 getProcedures 和getProcedureColumns 方法来获 取数据库中的存储过程的相关信息

例程 4-13 import java.sql.*;

class testprocedureinfo{

public static void main(String argv[]){

try{

String url,user,pwd;

String pn,pt,str;

url="jdbc:odbc:mytestDSN";

user="sa";

pwd="";

//加载驱动程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//建立连接

Connection con=DriverManager.getConnection(url,user,pwd);

//使用 DatabaseMetaData 对象获取数据源相关信息 DatabaseMetaData dmd=con.getMetaData();

//获得以名称"my"开头的存储过程信息结果集

ResultSet rs=dmd.getProcedures("mysqldataSQL","dbo","my%");

//输出存储过程信息

//输出存储过程信息