Spring JdbcTemplate怎样获得表中的所有字段

 我来答
ifeilong
2016-09-17 · TA获得超过8068个赞
知道大有可为答主
回答量:1187
采纳率:100%
帮助的人:805万
展开全部

一、 通过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";  
            //..  
        }

由以上可知,该类的方法有限,也只能获得列名和列的类型的信息,关于索引和约束等也没有涉及

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式