方法一 直接查詢:
SqlRowSet srcSqlRowSet = srcJdbcTemplate.queryForRowSet("SELECT * FROM tablename LIMIT 0"); //注意limit 0更合適 List<ColumnMetaData> columneMetaList = new LinkedList<ColumnMetaData>(); int columnCount; SqlRowSetMetaData sqlRowSetMetaData = sqlRowSet.getMetaData(); columnCount = sqlRowSetMetaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { columneMetaList.add(new ColumnMetaData(sqlRowSetMetaData.getColumnName(i), sqlRowSetMetaData.getColumnType(i), sqlRowSetMetaData.getColumnTypeName(i))); //獲取字段的名稱、類型和描述 } Collections.sort(columneMetaList);
方法一的ColumnMetaData類代碼如下:
public class ColumnMetaData implements Comparable<ColumnMetaData> { private String name; // 字段名稱 private int type; // 字段類型 private String typeName; // 字段類型名稱 private Object value; // 值
public ColumnMetaData(String columnName, int valueType, String typeName) { this.name = columnName; this.type = valueType; this.typeName = typeName; } }
方法二 使用RowCountCallbackHandler查詢
String sql = "select * from "+ tableName + " limit 0"; RowCountCallbackHandler rcch = new RowCountCallbackHandler(); this.jdbcTemplateDao.query(sql, rcch); String[] coloumnName = rcch.getColumnNames(); int[] coloumnType = rcch.getColumnTypes();
方法二效率高,但麻煩的是拿到了類型是數字,如果要獲得字段的描述信息,比如:int還是varchar等,需要一個對照關系類:
public class SqlTypeAdapter { public static 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"; //..代碼太多就不多寫啦default: break; } return "VARCHAR"; } }