JDBC中的DatabaseMetaData用法
来源:互联网 发布:linux下删除ftp用户 编辑:程序博客网 时间:2024/05/24 06:58
我们在项目连接数据库,通常我们已经知道了数据库的表结构,无需获取表的基本元信息,但是有时候为了升级或者验证一下内容我们需要访问数据库的元信息,例如我们升级的时候需要删除一些表,但是我们已经无法确定这些表是否存在(可能因为之前的开发没有严格遵守一些约定导致,同一个版本数据库的表结构竟然不同)。当然我们可以使用数据库特定的一下sql语句。例如DROP TABLE IF EXISTS tbName
; 如果我们的产品支持多种数据库这样就不要方便,特别是判断表是否存在的时候,每种数据库有所不同。
首先,我们需要获得Connection,然后DatabaseMetaData meta = conn.getMetaData();
之后我们可以通过
getDatabaseProductName();
getDatabaseProductVersion();
getSchemas();
getTables(null, dbSchema, “%”, null);
getPrimaryKeys(null, “”, tableName);
getColumns(null, “”, tableName, null);
getImportedKeys(null, dbSchema, tableName);
getExportedKeys(null, dbSchema, tableName);
获取数据的名称,版本,schema,该数据库的表,表的主键,表的结构,表的索引外键等信息。
详细情况如代码所示
try { DatabaseMetaData meta = conn.getMetaData(); String dbVendorName = meta.getDatabaseProductName(); String dbVersion = meta.getDatabaseProductVersion(); System.out.println("dbVendorName:" + dbVendorName + ", dbVersion:" +dbVersion); ResultSet rsSchema = meta.getSchemas(); System.out.println("Schema ..."); String dbSchema = null; while(rsSchema.next()) { //TABLE_SCHEM String tableSchema = rsSchema.getString(1); dbSchema = tableSchema; //TABLE_CATALOG String tableCatalog = rsSchema.getString(2); System.out.println("tableSchema:" + tableSchema + ", tableCatalog:" + tableCatalog ); } //ResultSet rs = meta.getTables(null, "", null, null); ResultSet rs = meta.getTables(null, dbSchema, "%", null); System.out.println("Tables ..."); while(rs.next()) { //TABLE_CAT String tableCatalog = rs.getString(1); //TABLE_SCHEM String tableSchema = rs.getString(2); //table name String tableName = rs.getString(3); //table type String tableType = rs.getString(4); //TYPE_CAT String typeCatalog = rs.getString(5); //TYPE_NAME String typeName = rs.getString(5); System.out.println("tableCatalog:" + tableCatalog + ", tableSchema:" + tableSchema +", tableName:" + tableName + ", tableType:" +tableType + ", typeCatalog:" + typeCatalog + ", typeName:" + typeName + ", tableType:" +tableType); ResultSet rsPrimaryKeys = meta.getPrimaryKeys(null, "", tableName); while(rsPrimaryKeys.next()) { // COLUMN_NAME String keyColName = rsPrimaryKeys.getString(4); //PK_NAME String String pkName = rsPrimaryKeys.getString(6); System.out.println(" PrimaryKeyColumn:" + keyColName + ", primaryKeyName:" + pkName ); } ResultSet rsColumns = meta.getColumns(null, "", tableName, null); while(rsColumns.next()) { // COLUMN_NAME String columnName = rsColumns.getString(4); // DATA_TYPE int colType = rsColumns.getInt(5); //TYPE_NAME String String colTypeName = rsColumns.getString(6); // COLUMN_SIZE int => column size. int colSize = rsColumns.getInt(7); // IS_NULLABLE String isNullAble = rsColumns.getString(18); // COLUMN_DEF String columnDef = rsColumns.getString(13); // IS_AUTOINCREMENT String isAutoIncrement = rsColumns.getString(22); System.out.println(" columnName:" + columnName + ", colTypeName:" + colTypeName +", colSize:" + colSize + ", isNullAble:" +isNullAble + ", columnDef:" + columnDef + ", isAutoIncrement:" + isAutoIncrement); } ResultSet rsImportedKeys = meta.getImportedKeys(null, dbSchema, tableName); ResultSet rsExportedKeys = meta.getExportedKeys(null, dbSchema, tableName); System.out.println("ExportedKeys for table '" + tableName + "'"); while(rsExportedKeys.next()) { // COLUMN_NAME String pkTableName = rsExportedKeys.getString("PKTABLE_NAME"); String pkColumnName = rsExportedKeys.getString("PKCOLUMN_NAME"); String fkTableName = rsExportedKeys.getString("FKTABLE_NAME"); String fkColumnName = rsExportedKeys.getString("FKCOLUMN_NAME"); String fkName = rsExportedKeys.getString("FK_NAME"); System.out.println(" pkTableName:" + pkTableName + ", pkColumnName:" + pkColumnName +", fkTableName:" + fkTableName + ", fkColumnName:" +fkColumnName + ", fkName:" + fkName); System.out.println(""); } System.out.println("------"); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); } catch (Exception e) { } try { if (stmt != null) stmt.close(); } catch (Exception e) { } try { if (conn != null) conn.close(); } catch (Exception e) { } }
运行结果
0 0
- JDBC中的DatabaseMetaData用法
- DatabaseMetaData用法
- JDBC: ResultSetMetaData和DatabaseMetaData
- JDBC:MetaData(ResultSetMetaData、DataBaseMetaData)
- JDBC之DatabaseMetaData
- DatabaseMetaData的用法
- DatabaseMetaData的用法(转)
- DatabaseMetaData的用法(转)
- DatabaseMetaData的用法
- DatabaseMetaData的用法(转)
- DatabaseMetaData的用法
- DatabaseMetaData的用法(转)
- DatabaseMetaData的用法
- JDBC Connection Statement ResultSet DatabaseMetaData
- JDBC 获取元数据DatabaseMetaData
- JDBC片段学习关于DatabaseMetaData
- JDBC(5)—DatabaseMetaData
- ResultSetMetaData 和DatabaseMetaData的用法
- Debug Assertion Failed! f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winhand.cpp
- REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX, AUDIO_DEVICE_IN_REMOTE_SUBMIX含义
- php变量类型转换
- Spring启动时报异常:No String constructor found on type [java.lang.reflect.Method]
- php借助mcript扩展实现对称加密
- JDBC中的DatabaseMetaData用法
- svn分支管理的使用与经验
- Sencha Touch 和 jQuery Mobile 的比较
- Java中JNI接口
- ruby语言
- PAT乙 1019. 数字黑洞 (20)
- php使用openssl来实现非对称加密
- 使用USRP探索无线世界
- 输入表:EXE怎么样调用DLL