壹、 通過SqlRowSetMetaData類
使用到的類或接口有如下幾個:
org.springframework.jdbc.support.rowset.SqlRowSet接口:該對象和javax.sql.RowSet類相對應,它和RowSet的區別是SqlRowSet中的方法從來不會拋出SQLException異常,通過jdbcTemplate可以獲得該對象的實例;
org.springframework.jdbc.support.rowset.SqlRowSetMetaData接口:是對應於SqlRowSet的元數據接口,和java.sql.ResultSetMetaData相壹致,也只是從來不會拋出SQLException異常,通過SqlRowSet可以獲得該類的實例;
具體使用實例如下:
SqlRowSet?rowSet?=?jdbcTemplate.queryForRowSet("select?*?from?user?limit?0");?SqlRowSetMetaData?metaData?=?rowSet.getMetaData();?
int?columnCount?=?metaData.getColumnCount();?
for?(int?i?=?1;?i?<=?columnCount;?i++)?{
Map<String,String>?fieldMap?=?new?HashMap<String,String>();?
fieldMap.put("ColumnName",?metaData.getColumnName(i));?
fieldMap.put("ColumnType",?String.valueOf(metaData.getColumnType(i)));?
fieldMap.put("ColumnTypeName",?metaData.getColumnTypeName(i));?
fieldMap.put("CatalogName",?metaData.getCatalogName(i));?
fieldMap.put("ColumnClassName",?metaData.getColumnClassName(i));?
fieldMap.put("ColumnLabel",?metaData.getColumnLabel(i));?
fieldMap.put("Precision",?String.valueOf(metaData.getPrecision(i)));?
fieldMap.put("Scale",?String.valueOf(metaData.getScale(i)));?
fieldMap.put("SchemaName",?metaData.getSchemaName(i));?
fieldMap.put("TableName",?metaData.getTableName(i));?
fieldMap.put("SchemaName",?metaData.getSchemaName(i));?
System.out.println(fieldMap);?
}
上述所用的信息都應列出來了,發現只有壹些簡單的信息,並沒有涉及索引和其他約束等的信息。
二、通過RowCountCallbackHandler類
使用到的類或接口有如下幾個:
org.springframework.jdbc.core.RowCallbackHandler接口:用於處理結果集中的每壹行數據;
org.springframework.jdbc.core.RowCountCallbackHandler類:實現了RowCallbackHandler接口,其中簡單的實現了對結果集元數據的獲取,包括行數、列數、列名、列的類型等信息,順便說壹下這個類的實例只可以用壹次;
在源代碼中給出了簡單的使用方式,如下:
JdbcTemplate?jdbcTemplate?=?new?JdbcTemplate(dataSource);?//?reusable?object?RowCountCallbackHandler?countCallback?=?new?RowCountCallbackHandler();?//?not?reusable?
jdbcTemplate.query("select?*?from?user",?countCallback);?
int?rowCount?=?countCallback.getRowCount();
所有能獲得的信息如下:
String?sql?=?"select?*?from?user";?RowCountCallbackHandler?rcch?=?new?RowCountCallbackHandler();?
jdbcTemplate.query(sql,?rcch);?
System.out.println("column?count?:"?+?rcch.getColumnCount());?
System.out.println("column?count?:"?+?rcch.getRowCount());?
for(int?i=0;?i<rcch.getColumnCount();?i++){?
System.out.println("column?name?:"?+?rcch.getColumnNames()[i]);?
System.out.println("column?type?:"?+?rcch.getColumnTypes()[i]);?
}
輸出如下:
從輸出可以看出有壹個問題,列的類型只能用數字來標識,這與java.sql.Types相對應,我們可以通過壹下的程序來獲得字符串的形式:
String?getTypeName(int?type)?throws?SQLException?{?
switch?(type)?{?
case?Types.ARRAY:?
break;?
case?Types.BIGINT:?
return?"BIGINT";?
case?Types.BINARY:?
return?"BINARY";?
case?Types.BIT:?
return?"BIT";?
case?Types.BLOB:?
return?"BLOB";?
case?Types.BOOLEAN:?
return?"BOOLEAN";?
//..?
}
由以上可知,該類的方法有限,也只能獲得列名和列的類型的信息,關於索引和約束等也沒有涉及