ResultSetMetaData 对象快速上手

177 阅读4分钟

JDBC - ResultSetMetaData

前言:为什么需要使用ResultSetMetaData

封装JDBC - ORM框架必须要知道的一个对象

通过使用 ResultSetMetaData,我们可以方便地获取结果集的元数据信息,从而更好地解析和处理结果集。

一、ResultSetMetaData是什么?

ResultSetMetaData 是 JDBC API 的一部分,在java.sql 包下,是一个接口。它提供了关于结果集元数据信息,例如列数,列名,列类型等。

二、常用 ResultSetMetaData api

下面列出 ResultSetMetaData 常用的一些 API 方法:

1、返回此ResultSet对象中的列数 :
  • int getColumnCount() throws SQLException;
2、指出指定列的正常最大宽度(以字符为单位) :
  • int getColumnDisplaySize(int column) throws SQLException;
3、获取指定列的建议标题,以用于打印输出和显示。建议的标题通常由SQL AS子句指定。
  • String getColumnLabel(int column) throws SQLException;
4、获取指定列的名称
  • String getColumnName(int column) throws SQLException;
5、获取指定列的表模式
  • String getSchemaName(int column) throws SQLException;
6、获取指定列的数据精度
  • int getPrecision(int column) throws SQLException;
7、获取指定列在小数点右侧的位数。
  • int getScale(int column) throws SQLException;
8、获取指定列的表名称
  • String getTableName(int column) throws SQLException;
9、获取指定列的表的编目名称。(数据库名)
  • String getCatalogName(int column) throws SQLException;
10、获取指定列的数据类型。返回的是java.sql.Types中的SQL类型。
  • int getColumnType(int column) throws SQLException;
11、获取指定列的数据库特定类型名称。
  • String getColumnTypeName(int column) throws SQLException;
12、返回生成其实例的Java类的全限定名称
  • String getColumnClassName(int column) throws SQLException;
13、指出指定的列是否为自增编号
  • boolean isAutoIncrement(int column) throws SQLException;
14、指出指定列是否区分大小写
  • boolean isCaseSensitive(int column) throws SQLException;
15、指出指定的列是否可用于where子句。
  • boolean isSearchable(int column) throws SQLException;
16、指出指定的列是否为货币类型
  • boolean isCurrency(int column) throws SQLException;
17、指出指定列中值的可空性(该列是否可以为null)
  • int isNullable(int column) throws SQLException;
18、指出指定列中的值是否为带符号的数字。(该列是否为无符号)
  • boolean isSigned(int column) throws SQLException;
19、指出指定列是否只读
  • boolean isReadOnly(int column) throws SQLException;
20、指出指定列是否可写。
  • boolean isWritable(int column) throws SQLException;

三、基本使用

那么接下来我们在实际操作一下,看一下从 ResultSetMetaData 中具体可以获取哪些信息。

import java.sql.*;

public class TestResultSetMetaData {
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1:3306/test_jdbc?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";
        String sql = "select * from teacher where id = ?";

        try {
            // 加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 声明数据库连接、预编译语句资源对象
        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(sql);){

            // 设置参数
            preparedStatement.setInt(1, 1);
            // 执行SQL查询语句,声明ResultSet资源对象
            try(ResultSet resultSet = preparedStatement.executeQuery();) {

                // 通过resultSet.getMetaData()获取该结果集的ResultSetMetaData对象
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
                // 获取列数
                int columnCount = resultSetMetaData.getColumnCount();
                System.out.println("查询结果一共有:" + columnCount + "列。");
                // 获取每列的信息,注意列的序列从1开始
                for (int i = 1; i <= columnCount; i++) {
                    System.out.println("===============================第" + i + "列==============================");
                    String columnName = resultSetMetaData.getColumnName(i);
                    int columnType = resultSetMetaData.getColumnType(i);
                    String columnTypeName = resultSetMetaData.getColumnTypeName(i);
                    String columnClassName = resultSetMetaData.getColumnClassName(i);
                    boolean isAutoIncrement = resultSetMetaData.isAutoIncrement(i);
                    
                    System.out.print("=》列名称:" + columnName);
                    System.out.print(",列类型: " + columnType);
                    System.out.print(",列类型名称: " + columnTypeName);
                    System.out.print(",列对应Java类型全限定名: " + columnClassName);
                    System.out.print(",列是否为自增:" + isAutoIncrement);
                    System.out.print(",列是否可为空:" + resultSetMetaData.isNullable(i));
                    System.out.print(",列的最大宽度:" + resultSetMetaData.getColumnDisplaySize(i));
                    System.out.println();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

下面为输出的内容:

查询结果一共有:7列。
===============================第1列==============================
=》列名称:id,列类型: 4,列类型名称: INT,列对应Java类型全限定名: java.lang.Integer,列是否为自增:true,列是否可为空:0,列的最大宽度:10
===============================第2列==============================
=》列名称:name,列类型: 12,列类型名称: VARCHAR,列对应Java类型全限定名: java.lang.String,列是否为自增:false,列是否可为空:0,列的最大宽度:24
===============================第3列==============================
=》列名称:age,列类型: 4,列类型名称: INT,列对应Java类型全限定名: java.lang.Integer,列是否为自增:false,列是否可为空:1,列的最大宽度:10
===============================第4列==============================
=》列名称:phone,列类型: 1,列类型名称: CHAR,列对应Java类型全限定名: java.lang.String,列是否为自增:false,列是否可为空:1,列的最大宽度:11
===============================第5列==============================
=》列名称:sta_pos,列类型: 12,列类型名称: VARCHAR,列对应Java类型全限定名: java.lang.String,列是否为自增:false,列是否可为空:1,列的最大宽度:20
===============================第6列==============================
=》列名称:add_time,列类型: 93,列类型名称: DATETIME,列对应Java类型全限定名: java.time.LocalDateTime,列是否为自增:false,列是否可为空:1,列的最大宽度:19
===============================第7列==============================
=》列名称:update_time,列类型: 93,列类型名称: DATETIME,列对应Java类型全限定名: java.time.LocalDateTime,列是否为自增:false,列是否可为空:1,列的最大宽度:19

总结:

ResultSetMetaData 是 JDBC 中非常重要的一个接口,它提供了关于结果集的元数据信息。通过使用 ResultSetMetaData,我们可以方便地获取结果集的列数、列名、列类型等,从而更好地解析和处理结果集。在实际应用中,我们可能会遇到不同的数据源和数据类型,通过使用 ResultSetMetaData,我们可以更好地了解和处理这些数据源和数据类型,实现更准确和高效的数据转换、数据格式化、数据映射等操作。