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

来源:互联网 发布:python impacket库 编辑:程序博客网 时间:2024/06/07 01:13

本篇文章才是我写这一个系列文章的目的,原来我一般都是使用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 objectRowCountCallbackHandler countCallback = new RowCountCallbackHandler();  // not reusablejdbcTemplate.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接口详解

0 0
原创粉丝点击