需要使用java从sql查询中获取元数据
Posted
技术标签:
【中文标题】需要使用java从sql查询中获取元数据【英文标题】:Need to fetch Metadata from sql query using java 【发布时间】:2015-03-25 11:54:38 【问题描述】:我有一个 sql 查询,我需要列名和数据类型以及它的表名和模式名:
这是我在 SQLSERVER 上使用和测试它的方法:
public static void getMetadataForConn(Connection conn) throws SQLException
ResultSet rs = null;
try
Statement stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT AB_DEMO_SRC.dbo.employee.dept_id dept_id, AB_DEMO_SRC.dbo.employee.email_add email_add, AB_DEMO_SRC.dbo.employee.emp_address emp_address, AB_DEMO_SRC.dbo.employee.emp_id emp_id, AB_DEMO_SRC.dbo.employee.emp_name emp_name FROM AB_DEMO_SRC.dbo.employee ");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
for (int i = 1; i <= columnCount; i++)
System.out.print(md.getColumnName(i) + "(" + md.getColumnType(i) + ") "+md.getSchemaName(i)+"."+md.getTableName(i));
System.out.println();
while (rs.next())
for (int i = 1; i <= columnCount; i++)
Object o = rs.getObject(i);
System.out.print(null == o ? "" : o.toString() + " ");
System.out.println();
finally
if (null != rs)
rs.close();
我得到了所有其他元数据详细信息,如数据类型、精度和比例。奇怪的是,我得到的表名和模式名称为“”,它是空白的。有没有其他方法可以获取中存在的列的元数据一个查询?
【问题讨论】:
尝试通过添加 sqljdbc41.jar 以及..其中提到这个 jar 用于 jdk7 和 jre7,并且它实现了 jdbc api 方法.. 我真的不明白为什么相同的方法返回 TableName 和ScehmaName 用于 Teradata 和 DB2,但不适用于 SQL Server 和 Oracle 【参考方案1】:我认为问题在于ResultSet
的列与任何表都不相关,它们仅与查询相关。查询可能很复杂,可能有计算列等。这就是它们的表名是空白的原因。
如果要获取特定表的列信息,可以使用数据库的元数据:
DatabaseMetaData meta = conn.getMetaData();
ResultSet columns = meta.getColumns(null, "dbo", "employee", null);
【讨论】:
我在代码中提到的方法适用于其他查询,例如来自 Teradata/DB2 的查询,无法指出为什么我没有仅为 SQLSERVER 和 ORACLE 获取 TableName 和模式名称【参考方案2】:您可以通过调用ResultSet的'getMetaData'方法来获取列名。
ResultSetMetaData metaData= resultSet.getMetaData();
String columnName = metaData.getColumnName(1);
所有其他列元数据也可以使用 ResultSetMetaData 对象获取
【讨论】:
这正是我在代码中提到的,谢谢以上是关于需要使用java从sql查询中获取元数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 sql server information_schema(元数据)中获取依赖表?
Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法