Spring JdbcTemplate怎样获得表中的所有字段
一、 通过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";
//..
}
由以上可知,该类的方法有限,也只能获得列名和列的类型的信息,关于索引和约束等也没有涉及