JDBC查询数据库表信息
得到这个对象的实例
Connection con ;
con = DriverManager.getConnection(url,userName,password);
DatabaseMetaData dbmd = con.getMetaData();
获取DataBaseMetadata对象
我们需用使用Connection对象的getMetaData方法来获取DataBaseMeta对象,如下示例代码,我们演示获取DataBaseMetadata对象,并从DataBaseMetadata对象中获取数据库信息。
public static void getDataBaseInfo() {
Connection conn = getConnection();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
System.out.println("数据库已知的用户: " + dbmd.getUserName());
System.out.println("数据库的系统函数的逗号分隔列表: " + dbmd.getSystemFunctions());
System.out.println("数据库的时间和日期函数的逗号分隔列表: " + dbmd.getTimeDateFunctions());
System.out.println("数据库的字符串函数的逗号分隔列表: " + dbmd.getStringFunctions());
System.out.println("数据库供应商用于 'schema' 的首选术语: " + dbmd.getSchemaTerm());
System.out.println("数据库URL: " + dbmd.getURL());
System.out.println("是否允许只读:" + dbmd.isReadOnly());
System.out.println("数据库的产品名称:" + dbmd.getDatabaseProductName());
System.out.println("数据库的版本:" + dbmd.getDatabaseProductVersion());
System.out.println("驱动程序的名称:" + dbmd.getDriverName());
System.out.println("驱动程序的版本:" + dbmd.getDriverVersion());
System.out.println("数据库中使用的表类型");
rs = dbmd.getTableTypes();
while (rs.next()) {
System.out.println(rs.getString("TABLE_TYPE"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, conn);
}
}
获取数据表
- 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types) 功能描述:得到指定参数的表信息 参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schemaPattern: 数据库名称模式匹配,null表示不缩小搜索范围数据库名,对于oracle来说就用户名 参数tableNamePattern: 表名称模式匹配字符, 参数types: 表类型列表,包含值(TABLE | VIEW),null返回所有类型
来看下面的演示示例:
//获取test数据库下面所有表信息
public static void getTablesList() {
Connection conn = getConnection();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
String[] types = {"TABLE"};
rs = dbmd.getTables("test", null, "%", types);
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME"); //表名
String tableType = rs.getString("TABLE_TYPE"); //表类型
String remarks = rs.getString("REMARKS"); //表备注
System.out.println(tableName + " - " + tableType + " - " + remarks);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, conn);
}
}
获取字段
- 功能描述:得到指定表的列信息。 原型: ResultSet DatabaseMetaData getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern)
参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schemaPattern: 数据库名称模式匹配,null表示不缩小搜索范围数据库名,对于oracle来说就用户名 参数tableNamePattern: 表名称模式匹配字符 参数columnNamePattern: 列名模式匹配字符
下面来看一个演示示例
//获取test数据库中所有表id列信息
public static void getColumnsInfo() {
Connection conn = getConnection();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
rs = dbmd.getColumns("test", null, null, "id");
while (rs.next()) {
String tableCat = rs.getString("TABLE_CAT"); //表类别(可能为空)
String tableSchemaName = rs.getString("TABLE_SCHEM"); //表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知
String tableName_ = rs.getString("TABLE_NAME"); //表名
String columnName = rs.getString("COLUMN_NAME"); //列名
int dataType = rs.getInt("DATA_TYPE"); //对应的java.sql.Types的SQL类型(列类型ID)
String dataTypeName = rs.getString("TYPE_NAME"); //java.sql.Types类型名称(列类型名称)
int columnSize = rs.getInt("COLUMN_SIZE"); //列大小
int decimalDigits = rs.getInt("DECIMAL_DIGITS"); //小数位数
int numPrecRadix = rs.getInt("NUM_PREC_RADIX"); //基数(通常是10或2) --未知
/**
* 0 (columnNoNulls) - 该列不允许为空
* 1 (columnNullable) - 该列允许为空
* 2 (columnNullableUnknown) - 不确定该列是否为空
*/
int nullAble = rs.getInt("NULLABLE"); //是否允许为null
String remarks = rs.getString("REMARKS"); //列描述
String columnDef = rs.getString("COLUMN_DEF"); //默认值
int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH"); // 对于 char 类型,该长度是列中的最大字节数
int ordinalPosition = rs.getInt("ORDINAL_POSITION"); //表中列的索引(从1开始)
/**
* ISO规则用来确定某一列的是否可为空(等同于NULLABLE的值:[ 0:'YES'; 1:'NO'; 2:''; ])
* YES -- 该列可以有空值;
* NO -- 该列不能为空;
* 空字符串--- 不知道该列是否可为空
*/
String isNullAble = rs.getString("IS_NULLABLE");
System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName_ + " - " + columnName + " - " + dataType + " - " + dataTypeName + " - " + columnSize + " - " + decimalDigits + " - " + numPrecRadix + " - " + nullAble + " - " + remarks + " - " + columnDef + " - " + charOctetLength + " - " + ordinalPosition + " - " + isNullAble);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
close(rs, conn);
}
}
获取主键
- 功能描述:得到指定表的主键信息。 原型: ResultSet DatabaseMetaData getPrimaryKeys(String catalog,String schema,String table) 参数说明: 参数catalog : 目录名称,一般都为空,在MySQL中代表数据库名称 参数schema : 模式名称 参数table : 数据库表名称 备注:一定要指定表名称,否则返回值将是什么都没有。
下面来看一个示例
//获取表主键信息
public static void getPrimaryKeysInfo() {
Connection conn = getConnection();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
rs = dbmd.getPrimaryKeys(null, null, "account");
while (rs.next()) {
String tableCat = rs.getString("TABLE_CAT"); //表类别(可为null)
String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知
String tableName = rs.getString("TABLE_NAME"); //表名
String columnName = rs.getString("COLUMN_NAME");//列名
short keySeq = rs.getShort("KEY_SEQ");//序列号(主键内值1表示第一列的主键,值2代表主键内的第二列)
String pkName = rs.getString("PK_NAME"); //主键名称
System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + columnName + " - " + keySeq + " - " + pkName);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, conn);
}
}
获取索引
- 功能描述:获取给定表的索引和统计信息的描述 原型: ResultSet getIndexInfo(String catalog,String schema,String table,boolean unique,boolean approximate) 参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schema: 模式名称 参数table: 数据库表名称 参数unique: 该参数为true时,仅返回唯一值的索引; 该参数为false时,返回所有索引 参数approximate:该参数为true时,允许结果是接近的数据值或这些数据值以外的值;该参数为 false时,要求结果是精确结果;
下面来演示一个示例
//获取表索引信息
public static void getIndexInfo() {
Connection conn = getConnection();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
rs = dbmd.getIndexInfo(null, null, "account", false, true);
while (rs.next()) {
String tableCat = rs.getString("TABLE_CAT"); //表类别(可为null)
String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知
String tableName = rs.getString("TABLE_NAME"); //表名
boolean nonUnique = rs.getBoolean("NON_UNIQUE");// 索引值是否可以不唯一,TYPE为 tableIndexStatistic时索引值为 false;
String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引类别(可能为空),TYPE为 tableIndexStatistic 时索引类别为 null;
String indexName = rs.getString("INDEX_NAME");//索引的名称 ;TYPE为 tableIndexStatistic 时索引名称为 null;
/**
* 索引类型:
* tableIndexStatistic - 此标识与表的索引描述一起返回的表统计信息
* tableIndexClustered - 此为集群索引
* tableIndexHashed - 此为散列索引
* tableIndexOther - 此为某种其他样式的索引
*/
short type = rs.getShort("TYPE");//索引类型;
short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列顺序号;TYPE为 tableIndexStatistic 时该序列号为零;
String columnName = rs.getString("COLUMN_NAME");//列名;TYPE为 tableIndexStatistic时列名称为 null;
String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序顺序:升序还是降序[A:升序; B:降序];如果排序序列不受支持,可能为 null;TYPE为 tableIndexStatistic时排序序列为 null;
int cardinality = rs.getInt("CARDINALITY"); //基数;TYPE为 tableIndexStatistic 时,它是表中的行数;否则,它是索引中唯一值的数量。
int pages = rs.getInt("PAGES"); //TYPE为 tableIndexStatisic时,它是用于表的页数,否则它是用于当前索引的页数。
String filterCondition = rs.getString("FILTER_CONDITION"); //过滤器条件,如果有的话(可能为 null)。
System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + nonUnique + " - "
+ indexQualifier + " - " + indexName + " - " + type + " - " + ordinalPosition + " - " + columnName
+ " - " + ascOrDesc + " - " + cardinality + " - " + pages + " - " + filterCondition);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, conn);
}
}
注意: 1. JDBC元数据的操作是很消耗性能的,所以应尽量避免使用。 2. 在获取元数据中的REMARK(备注)前,需要设置在连接字符串中加入useInformationSchema=true。 3. 上述代码在MYSQL验证通过