目录
集元数据是有关数据库和表结构的信息,如表、列、索引等,可以通过JDBC的DatabaseMetaData和ResultSetMetaData接口对这些信息进行获取
DatabaseMetaData接口主要用于获取数据库的相关信息,如表的列表,系统函数,数据库产品名及驱动类型等
DatabaseMetaData接口的对象是通过Connection接口的getMetaData()方法进行获取
DatabaseMetaData接口的方法可分两大类:
| 方法 | 功能 |
| boolean supportsOuterJolns() | 检查数据库是否支持外部连接 |
| boolean supportsStoredProcedures() | 检查数据库是否支持存储过程 |
| String getURL() | 返回用于连接数据库的URL地址 |
| String getUserName() | 获取当前用户名 |
| String getDatabaseProductName() | 获取数据库产品名 |
| String getDatabaseProductVersion() | 获取数据库版本号 |
| String getDriverName() | 获取用以连接的驱动类型名称 |
| String getProductVersion() | 获取用以连接的驱动器版本号 |
| ResultSet getTypeInfo() | 获取数据库中可能取得的所有数据类型的描述 |
- import java.sql.*;
-
- public class DatabaseMetaDataDemo {
-
- // DatabaseMetaData接口用于获取数据库的相关信息
- // DatabaseMetaData对象是通过Connection接口的getMetaData()方法进行获取
-
- private static String driver = "com.mysql.cj.jdbc.Driver";
- private static String url = "jdbc:mysql://localhost:3306/de?serverTimezone=UTC&useSSL=false";
- private static String user = "root";
- private static String password = "root";
-
- public static void main(String[] args) {
- Connection connection = null;
- DatabaseMetaData databaseMetaData = null;
- try {
- Class.forName(driver);
- connection = DriverManager.getConnection(url,user,password); // 获取数据库连接对象
- databaseMetaData = connection.getMetaData();
-
- boolean storeProcedures = databaseMetaData.supportsStoredProcedures();
- System.out.println("检查数据库是否支持存储过程:"+storeProcedures);
-
- boolean outerJoins = databaseMetaData.supportsOuterJoins();
- System.out.println("检查数据库是否支持外部连接:"+outerJoins);
-
- String databaseProductName = databaseMetaData.getDatabaseProductName();
- System.out.println("获取数据库产品名:"+databaseProductName);
-
- String databaseProductVersion = databaseMetaData.getDatabaseProductVersion();
- System.out.println("获取数据库产品版本号:"+databaseProductVersion);
-
- String url = databaseMetaData.getURL();
- System.out.println("获取连接数据库的URL地址:"+url);
-
- String user = databaseMetaData.getUserName();
- System.out.println("获取连接数据库的用户名:"+user);
-
- String driverName = databaseMetaData.getDriverName();
- System.out.println("获取连接数据库的驱动类型名称:"+driverName);
-
- String driverVersion = databaseMetaData.getDriverVersion();
- System.out.println("获取连接数据库的驱动类型版本号:"+driverVersion);
-
- ResultSet rs = databaseMetaData.getTypeInfo();
- System.out.println("获取数据库中可能取得的所有数据类型的描述:"+rs);
-
- } catch (SQLException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } finally {
- if (connection != null){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- }
- }
- }

ResultSetMetaData接口是用来获取结果集的结构,如结果集的列数和列名等信息
| 方法 | 功能 |
| int getColumnCount() | 返回ResultSet对象中的列数 |
| String getColumnName(int column) | 获取指定列的名称 |
| int getColumnType(int coulumn) | 获取指定列的SQL类型 |
| String getTableName(int column) | 获取指定列所在表的名称 |
| int getColumnDisplaySize(int column) | 获取指定列的最大标准宽度,以字符为单位 |
| boolean isAutoIncrement(int column) | 指定是否为指定列进行编号,这些列仍然是只读的 |
| int isNullable(int column) | 指定指定列的值是否可以为null |
| boolean isSearchable(int column) | 指定是否可以在where字句中使用指定的列 |
| boolean isReadOnly(int column) | 指定指定的列是否明确不可写入 |
- import java.sql.*;
-
- public class ResultSetMetaDataDemo {
-
- // ResultSetMetaData接口:包含查询后的结果集相关信息
-
- private static String driver = "com.mysql.cj.jdbc.Driver";
- private static String url = "jdbc:mysql://localhost:3306/de?serverTimezone=UTC&useSSL=false";
- private static String user = "root";
- private static String password = "root";
-
- public static void main(String[] args) {
- Connection connection = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try {
- connection = DriverManager.getConnection(url,user,password);
- String sql = "SELECT * FROM tb_student";
- pstmt = connection.prepareStatement(sql);
- rs = pstmt.executeQuery();
- while(rs.next()){
- int no = rs.getInt(1);
- String name = rs.getString(2);
- System.out.println(no+"\t"+name);
- }
-
- // 通过ResultSetMetaData接口获取其元数据信息:
- ResultSetMetaData resultSetMetaData = rs.getMetaData();
- int column = resultSetMetaData.getColumnCount();
- System.out.println("\n返回此ResultSet对象中的列数:"+column);
-
- String columnName = resultSetMetaData.getColumnName(2);
- System.out.println("获取指定列的名称:"+columnName);
-
- int sqlType = resultSetMetaData.getColumnType(2);
- System.out.println("检索指定列的SQL类型:"+sqlType);
-
- String tableName = resultSetMetaData.getTableName(2);
- System.out.println("获取指定列所在表的名称:"+tableName);
-
- int maxSize = resultSetMetaData.getColumnDisplaySize(2);
- System.out.println("指示指定列的最大标准宽度,以字符为单位:"+maxSize);
-
- boolean isAutoIncrement = resultSetMetaData.isAutoIncrement(2);
- System.out.println("指示是否自动为指定列进行编号,这样这些列仍然是只读的:"+isAutoIncrement);
-
- int isNull = resultSetMetaData.isNullable(2);
- System.out.println("指示指定列中的值是否可以为null:"+isNull);
-
- boolean isRead = resultSetMetaData.isReadOnly(2);
- System.out.println("指示指定的列是否明确不可写入:"+isRead);
-
- } catch (SQLException e) {
- e.printStackTrace();
- }
- finally {
- if (rs != null){
- try {
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (pstmt != null){
- try {
- pstmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (connection != null){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- }
-
- }
-
- }
