牛骨文教育服务平台(让学习变的简单)
博文笔记

Spring JDBC学习笔记(3):使用JdbcTemplate来获取数据库表和列的元数据

创建时间:2016-03-31 投稿人: 浏览次数:6539

本篇文章才是我写这一个系列文章的目的,原来我一般都是使用jdbc获取数据库的元数据,但是有点让我很不爽,每次查数据表和列的时候都要自己写“TABLE_NAME”和“COLUMN_HOME”等名称,所以干脆转到JdbcTemplate实现上。通过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";
            //..
        }
由以上可知,该类的方法有限,也只能获得列名和列的类型的信息,关于索引和约束等也没有涉及。

相关文章:

  • 使用jdbcTemplate查询的三种回调
  • Java 6 RowSet 使用完全剖析
  • RowSet与ResultSet的区别
  • JDBC元数据操作(一)-- DatabaseMetaData接口详解

阅读更多
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。