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,我们可以更好地了解和处理这些数据源和数据类型,实现更准确和高效的数据转换、数据格式化、数据映射等操作。