#java.sql.ResultSetMetaData
# 描述
java.sql.ResultSetMetaData是JDBC规范中定义的结果集元数据接口,元数据即描述数据的数据,它不存储查询的具体行数据,而是描述ResultSet的结构特征,核心作用是:
- 获取结果集中列的总数、列名、列标签。
- 查询每列的SQL类型、Java类型、精度、刻度等属性。
- 判断列是否可为空、是否为自动递增列等特性。
- 适用于动态查询场景(不知道查询结果的列结构时,动态解析列信息)。
详细接口说明请参考JDBC官方网站 (opens new window)。
# 方法
YashanDB JDBC驱动对ResultSetMetaData接口有如下方法:
| 方法 | 返回类型 |
|---|---|
| getColumnCount() | int |
| isAutoIncrement(int column) | boolean |
| isCaseSensitive(int column) | boolean |
| isSearchable(int column) | boolean |
| isCurrency(int column) | boolean |
| isNullable(int column) | int |
| isSigned(int column) | boolean |
| getColumnLabel(int column) | String |
| getColumnName(int column) | String |
| getPrecision(int column) | int |
| getScale(int column) | int |
| getColumnDisplaySize(int column) | int |
| getColumnType(int column) | int |
| getColumnTypeName(int column) | String |
| isReadOnly(int column) | boolean |
| isWritable(int column) | boolean |
| isDefinitelyWritable(int column) | boolean |
| getColumnClassName(int column) | String |
# 示例
package quickstart;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class ResultSetMetaDataExample {
public static Connection getConnection() throws SQLException, ClassNotFoundException {
String url = "jdbc:yasdb://192.168.1.2:1688/yasdb";
Properties info = new Properties();
info.setProperty("user", "username");
info.setProperty("password", "passwd");
Class.forName("com.yashandb.jdbc.Driver");
return DriverManager.getConnection(url, info);
}
// 打印 ResultSet 结构
public void printResultSetStructure(ResultSet rs) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
for (int i = 1; i <= cols; i++) {
String name = meta.getColumnName(i);
String type = meta.getColumnTypeName(i);
System.out.println(name + " (" + type + ")");
}
}
// 自动映射到 Map
public Map<String, Object> toMap(ResultSet rs) throws SQLException {
Map<String, Object> map = new HashMap<>();
ResultSetMetaData meta = rs.getMetaData();
for (int i = 1; i <= meta.getColumnCount(); i++) {
String colName = meta.getColumnName(i);
map.put(colName, rs.getObject(i));
}
return map;
}
// 验证查询结果
public void validateResultSet(ResultSet rs) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
for (int i = 1; i <= meta.getColumnCount(); i++) {
if (meta.isNullable(i) == ResultSetMetaData.columnNoNulls) {
Object value = rs.getObject(i);
if (rs.wasNull()) {
throw new SQLException("Column " + meta.getColumnName(i) + " cannot be NULL");
}
}
}
}
// 生成 CSV 表头
public String generateCSVHeader(ResultSet rs) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
StringBuilder header = new StringBuilder();
for (int i = 1; i <= meta.getColumnCount(); i++) {
if (i > 1) header.append(",");
header.append(meta.getColumnLabel(i));
}
return header.toString();
}
// 类型安全读取
public Object getValueSafely(ResultSet rs, int columnIndex) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
String className = meta.getColumnClassName(columnIndex);
if ("java.lang.String".equals(className)) {
return rs.getString(columnIndex);
} else if ("java.lang.Integer".equals(className)) {
return rs.getInt(columnIndex);
} else if ("java.math.BigDecimal".equals(className)) {
return rs.getBigDecimal(columnIndex);
}
return rs.getObject(columnIndex);
}
public static void main(String[] args) {
try (Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1 AS ID, 'Alice' AS NAME, 12.34 AS AMOUNT FROM DUAL")) {
ResultSetMetaDataExample example = new ResultSetMetaDataExample();
example.printResultSetStructure(rs);
System.out.println(example.generateCSVHeader(rs));
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
正常情况下,程序输出如下:
ID (INTEGER)
NAME (CHAR)
AMOUNT (NUMBER)
ID,NAME,AMOUNT

