Java 元数据
在数据库编程中,元数据(Metadata)是"关于数据的数据",它描述了数据库或其组成部分的结构和特性。通过JDBC,Java程序可以访问数据库元数据,获取有关数据库、表、列、结果集等信息,这 对于开发动态SQL查询、数据库管理工具和报表生成器等应用非常有用。
什么是元数据?
元数据是描述其他数据的数据。在JDBC中,元数据主要提供以下信息:
- 数据库的结构(表、视图、存储过程等)
- 表的结构(列名、数据类型、约束等)
- 结果集的结构(列数、列名、类型等)
- 数据库和驱动程序的功能和限制
JDBC API提供了三种主要的元数据接口:
- DatabaseMetaData:提供数据库整体信息
- ResultSetMetaData:提供结果集的列信息
- ParameterMetaData:提供PreparedStatement中参数信息
DatabaseMetaData
DatabaseMetaData接口提供了关于整个数据库的综合信息,包括数据库产品信息、支持的SQL功能、表信息等。
获取DatabaseMetaData对象
Connection connection = DriverManager.getConnection(url, username, password);
DatabaseMetaData dbMetaData = connection.getMetaData();
常用方法
以下是一些常用的DatabaseMetaData方法:
// 获取数据库产品名称和版本
String productName = dbMetaData.getDatabaseProductName();
String productVersion = dbMetaData.getDatabaseProductVersion();
// 获取JDBC驱动信息
String driverName = dbMetaData.getDriverName();
String driverVersion = dbMetaData.getDriverVersion();
// 检查功能支持
boolean supportsBatchUpdates = dbMetaData.supportsBatchUpdates();
boolean supportsStoredProcedures = dbMetaData.supportsStoredProcedures();
// 获取表信息
ResultSet tables = dbMetaData.getTables(null, null, "%", new String[]{"TABLE"});
// 获取列信息
ResultSet columns = dbMetaData.getColumns(null, null, "表名", null);
实例:列出所有表
下面是一个列出数据库中所有表的例子:
import java.sql.*;
public class TableInfoExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
DatabaseMetaData metaData = conn.getMetaData();
// 获取数据库信息
System.out.println("数据库产品名称: " + metaData.getDatabaseProductName());
System.out.println("数据库产品版本: " + metaData.getDatabaseProductVersion());
// 获取所有表信息(catalog=null, schema=null, tableNamePattern=%, types=TABLE)
ResultSet tables = metaData.getTables(null, null, "%", new String[]{"TABLE"});
System.out.println("\n数据库中的表:");
while (tables.next()) {
String tableName = tables.getString("TABLE_NAME");
String tableType = tables.getString("TABLE_TYPE");
String remarks = tables.getString("REMARKS");
System.out.println("表名: " + tableName);
System.out.println("类型: " + tableType);
System.out.println("备注: " + (remarks != null ? remarks : "无"));
System.out.println("------------------------");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
输出示例:
数据库产品名称: MySQL
数据库产品版本: 8.0.26
数据库中的表:
表名: customers
类型: TABLE
备注: 客户信息表
------------------------
表名: orders
类型: TABLE
备注: 订单表
------------------------
表名: products
类型: TABLE
备注: 产品信息表
------------------------
ResultSetMetaData
ResultSetMetaData提供有关ResultSet对象中列的信息,如列数、列名、列的数据类型等。
获取ResultSetMetaData对象
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
ResultSetMetaData rsMetaData = rs.getMetaData();
常用方法
// 获取结果集中的列数
int columnCount = rsMetaData.getColumnCount();
// 获取指定列的名称(索引从1开始)
String columnName = rsMetaData.getColumnName(1);
// 获取指定列的标签名
String columnLabel = rsMetaData.getColumnLabel(1);
// 获取指定列的SQL类型
int columnType = rsMetaData.getColumnType(1);
String columnTypeName = rsMetaData.getColumnTypeName(1);
// 判断指定列是否可为空
int nullable = rsMetaData.isNullable(1);
// 判断指定列是否自动递增
boolean isAutoIncrement = rsMetaData.isAutoIncrement(1);