10. jdbc 元数据

it2022-05-05  130

jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》

1. jdbc 元数据

jdbc 的元数据, 指的是数据库的基本信息(数据库版本号, 数据库列表等) 和 查询结果集中的列信息(列名称, 列数量等).

1.1 DatabaseMetaData 常用API

DatabaseMetaData 用于获取数据库的基本信息, 如数据库版本号, 数据库连接地址,用户名, 数据库表类型等信息.DatabaseMetaData 通过Connection 对象获取, 也就是说只要拿到数据库连接, 便可以获取到数据库的一切信息DatabaseMetaData 很多API 会返回ResultSet 类型返回值, 需要对ResultSet 进行遍历解析DatabaseMetaData API 有很多, 笔者列举几个常用的: 方法签名方法描述String getURL()获取数据库连接URL, 即配置的jdbcUrlString getUserName()获取数据库连接用户名String getDatabaseProductName()获取数据库产品名称String getDatabaseProductVersion()获取数据库版本号int getDatabaseMajorVersion()获取数据库主版本号int getDatabaseMinorVersion()获取数据库子版本号String getDriverName()获取jdbc驱动名称ResultSet getTableTypes()获取数据库支持的表类型ResultSet getCatalogs()获取数据库列表ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])获取数据库表列表

1.2 ResultSetMetaData 常用API

ResultSetMetaData 用于获取ResultSet 结果集返回的信息, 可以获取ResultSet 的列数, 列名称, 列别名, 列类型等ResultSetMetaData 不仅仅可用于查询返回的ResultSet的信息, 只要是ResultSet 便可以获取其MetaData 信息. 如DatabaseMetaData 的某些APIResultSetMetaData API 有很多, 笔者列举几个常用的: 方法签名方法描述int getColumnCount()获取列数量String getColumnName(int column)获取列名称String getColumnLabel(int column)获取列别名, 若未指定别名,则返回列名称int getColumnType(int column)获取列类型, 返回数据库类型, 为java.sql.Types中常量对应的数值String getColumnClassName(int column)获取列自动映射的java类型String getTableName(int column)获取表名称String getCatalogName(int column)获取数据库名称

2. API 测试

2.1 测试用例

拿到数据库连接对象, 便可以获取数据库相关信息.任何返回ResultSet类型的API, 都可以获取ResultSet 的相关信息 // 测试DatabaseMetaData @Test public void test_database_metadata() throws SQLException { //1. 获取数据库连接 Connection connection = DbConnUtil.getConnection(); //2. 获取数据库信息 DatabaseMetaData dbMetaData = connection.getMetaData(); System.out.println("数据库连接地址:" + dbMetaData.getURL()); System.out.println("用户名:" + dbMetaData.getUserName()); System.out.println("数据库名称:" + dbMetaData.getDatabaseProductName()); System.out.println("数据库版本号:" + dbMetaData.getDatabaseProductVersion()); System.out.println("数据库主版本号:" + dbMetaData.getDatabaseMajorVersion()); System.out.println("数据库小版本号:" + dbMetaData.getDatabaseMinorVersion()); System.out.println("jdbc驱动名称:" + dbMetaData.getDriverName()); System.out.println("jdbc驱动版本号:" + dbMetaData.getDriverVersion()); System.out.println("******************** 数据表类型 ********************"); // 不知道结果集返回列名称时, 可先获取列数量, 再获取列的标签名或列名. ResultSet tableTypesRs = dbMetaData.getTableTypes(); int columnCount = tableTypesRs.getMetaData().getColumnCount(); while (tableTypesRs.next()) { for (int i = 1; i <= columnCount; i++) { System.out.println(tableTypesRs.getMetaData().getColumnLabel(i) + ":" + tableTypesRs.getObject(i)); } } // 通过上面方法获取到返回结果的列名称之后, 可直接通过getObject(labelName) 获取列值 System.out.println("******************** 数据库列表 ********************"); ResultSet catalogsRs = dbMetaData.getCatalogs(); while (catalogsRs.next()) { System.out.println(catalogsRs.getObject("TABLE_CAT")); } System.out.println("******************** 数据表列表 ********************"); ResultSet tableNamesRs = dbMetaData.getTables("learn-mybatis3", null, null, new String[]{"TABLE"}); while (tableNamesRs.next()) { System.out.println(tableNamesRs.getObject("TABLE_NAME")); } } // 测试ResultSetMetaData public void test_result_metaData() throws SQLException, ClassNotFoundException { // 1. 获取数据库连接 Connection connection = DbConnUtil.getConnection(); // 2. 查询结果 String sql = "select id uId, name uName, password from t_user where id = 1"; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); // 3. 获取结果集信息 ResultSetMetaData metaData = resultSet.getMetaData(); // 获取结果集中列信息 System.out.println("结果集中列数量:" + metaData.getColumnCount() + ", 列详情:"); for (int i = 1; i <= metaData.getColumnCount(); i++) { System.out.print("列名称:" + metaData.getColumnName(i)); System.out.print(",\t\t列别名:" + metaData.getColumnLabel(i)); System.out.print(",\t\t列数据库类型:" + metaData.getColumnType(i)); System.out.print(",\t\t列java类型:" + metaData.getColumnClassName(i)); System.out.print(",\t\t表名称:" + metaData.getTableName(i)); System.out.println(",\t\t数据库名:" + metaData.getCatalogName(i)); } // 遍历结果集, 纵使结果集中只有一行数据, 也得先执行resultSet.next操作, 让游标下移一行. while (resultSet.next()) { // 通过列名获取列值 Integer id = resultSet.getObject("id", Integer.class); // 通过列别名获取列值 String uName = resultSet.getObject("uName", String.class); // 通过列索引获取列值, 索引下标从1 开始 Object password = resultSet.getObject(3); System.out.println("id:" + resultSet.getObject("id")); System.out.println("name:" + resultSet.getObject("uName")); System.out.println("password:" + resultSet.getObject(3)); } }

2.2 控制台输出

test_database_metadata:

数据库连接地址:jdbc:mysql://localhost:3306/learn-jdbc?characterEncoding=UTF-8 用户名:root@localhost 数据库名称:MySQL 数据库版本号:5.7.20-0ubuntu0.16.04.1 数据库主版本号:5 数据库小版本号:7 jdbc驱动名称:MySQL Connector Java jdbc驱动版本号:mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e20009be ) ******************** 数据表类型 ******************** TABLE_TYPE:LOCAL TEMPORARY TABLE_TYPE:SYSTEM TABLE TABLE_TYPE:SYSTEM VIEW TABLE_TYPE:TABLE TABLE_TYPE:VIEW ******************** 数据库列表 ******************** information_schema learn-jdbc learn-mybatis3 learn-sboot2 ******************** 数据表列表 ******************** t_person t_user

test_result_metaData:

结果集中列数量:3, 列详情: 列名称:id, 列别名:uId, 列数据库类型:4, 列java类型:java.lang.Integer, 表名称:t_user, 数据库名:learn-jdbc 列名称:name, 列别名:uName, 列数据库类型:12, 列java类型:java.lang.String, 表名称:t_user, 数据库名:learn-jdbc 列名称:password, 列别名:password, 列数据库类型:12, 列java类型:java.lang.String, 表名称:t_user, 数据库名:learn-jdbc

最新回复(0)