Java获取数据库的列名、列数、标题、类型等信息,ResultSetMetaData的各种方法举例
getColumnCount //列数
getColumnName //列名
getColumnLabel //列标题,别名
1 /** 2 * Gets the designated column's suggested title for use in printouts and 3 * displays. The suggested title is usually specified by the SQL <code>AS</code> 4 * clause. If a SQL <code>AS</code> is not specified, the value returned from 5 * <code>getColumnLabel</code> will be the same as the value returned by the 6 * <code>getColumnName</code> method. 7 * 8 * @param column the first column is 1, the second is 2, ... 9 * @return the suggested column title 10 * @exception SQLException if a database access error occurs 11 */ 12 String getColumnLabel(int column) throws SQLException; 13 14 /** 15 * Get the designated column's name. 16 * 17 * @param column the first column is 1, the second is 2, ... 18 * @return column name 19 * @exception SQLException if a database access error occurs 20 */ 21 String getColumnName(int column) throws SQLException;
注释说明getColumnLabel返回的是列标题,getColumnName返回的是列名,列标题和列名看起来是一个东西,其实并非这么简单,列标题是指select语句中的列别名,也就是查询结果集中显示出来的列,而列名指的是数据库表中的列名,以下边的sql为例:
select c1 as label from t
getColumnLabel应该返回label,getColumnName应该返回c1。
当你使用和学习JDK的时候,可以查看并学习它所提供给你的两个ResultSetMetaData和DataBaseMetaData类的源码并很好的了解它们的实现原理和思路,JDBC中提供有两种源数据,一种是数据库源数据,另一种是 ResultSet源数据。这些源数据就是描述存储用户数据的容器的数据结构。其中ResultSetMetaData类完成了查询结果信息和结果中的列的各种信息。下面我就以ResultSetMetaData为例,简单的罗列它的使用方法以及它内部的方法的使用。
1 import java.sql.*; 2 3 public class jdbcTest { 4 public static void main(String[] args) throws ClassNotFoundException, SQLException { 5 //1、加载驱动 6 Class.forName("com.mysql.jdbc.Driver"); 7 //2、用户信息和url 8 String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true"; 9 String username = "root"; 10 String password = "123456"; 11 //3、连接成功,数据库对象 12 Connection connection = DriverManager.getConnection(url, username, password); 13 14 //4、执行sql的对象 15 Statement statement = connection.createStatement(); 16 //5、执行sql的对象去执行sql,可能存在结果,查看返回结果 17 String sql = "select * from person"; 18 ResultSet resultSet = statement.executeQuery(sql); 19 ResultSetMetaData data = resultSet.getMetaData(); 20 testResultTableValues(data, resultSet); 21 22 while (resultSet.next()){ 23 System.out.print("id=" + resultSet.getObject("id")); 24 System.out.print("\tname=" + resultSet.getObject("name")); 25 System.out.println("\tage=" + resultSet.getObject("age")); 26 } 27 //6、释放连接 28 resultSet.close(); 29 statement.close(); 30 connection.close(); 31 } 32 33 static void testResultTableValues(ResultSetMetaData data, ResultSet rs) { 34 try { 35 while (rs.next()) { 36 for (int i = 1; i <= data.getColumnCount(); i++) { 37 //获得所有列的数目及实际列数 38 int columnCount = data.getColumnCount(); 39 //获得指定列的列名 40 String columnName = data.getColumnName(i); 41 //获得指定列的列值 42 String columnValue = rs.getString(i); 43 //获得指定列的数据类型 44 int columnType = data.getColumnType(i); 45 //获得指定列的数据类型名 46 String columnTypeName = data.getColumnTypeName(i); 47 //所在的Catalog名字 48 String catalogName = data.getCatalogName(i); 49 //对应数据类型的类 50 String columnClassName = data.getColumnClassName(i); 51 //在数据库中类型的最大字符个数 52 int columnDisplaySize = data.getColumnDisplaySize(i); 53 //默认的列的标题 54 String columnLabel = data.getColumnLabel(i); 55 //获得列的模式 56 String schemaName = data.getSchemaName(i); 57 //某列类型的精确度(类型的长度) 58 int precision = data.getPrecision(i); 59 //小数点后的位数 60 int scale = data.getScale(i); 61 //获取某列对应的表名 62 String tableName = data.getTableName(i); 63 //是否自动递增 64 boolean isAutoInctement = data.isAutoIncrement(i); 65 //在数据库中是否为货币型 66 boolean isCurrency = data.isCurrency(i); 67 //是否为空 68 int isNullable = data.isNullable(i); 69 //是否为只读 70 boolean isReadOnly = data.isReadOnly(i); 71 //能否出现在where中 72 boolean isSearchable = data.isSearchable(i); 73 System.out.println(columnCount); 74 System.out.println("获得列" + i + "的字段名称:" + columnName); 75 System.out.println("获得列" + i + "的字段值:" + columnValue); 76 System.out.println("获得列" + i + "的类型,返回SqlType中的编号:" + columnType); 77 System.out.println("获得列" + i + "的数据类型名:" + columnTypeName); 78 System.out.println("获得列" + i + "所在的Catalog名字:" + catalogName); 79 System.out.println("获得列" + i + "对应数据类型的类:" + columnClassName); 80 System.out.println("获得列" + i + "在数据库中类型的最大字符个数:" + columnDisplaySize); 81 System.out.println("获得列" + i + "的默认的列的标题:" + columnLabel); 82 System.out.println("获得列" + i + "的模式:" + schemaName); 83 System.out.println("获得列" + i + "类型的精确度(类型的长度):" + precision); 84 System.out.println("获得列" + i + "小数点后的位数:" + scale); 85 System.out.println("获得列" + i + "对应的表名:" + tableName); 86 System.out.println("获得列" + i + "是否自动递增:" + isAutoInctement); 87 System.out.println("获得列" + i + "在数据库中是否为货币型:" + isCurrency); 88 System.out.println("获得列" + i + "是否为空:" + isNullable); 89 System.out.println("获得列" + i + "是否为只读:" + isReadOnly); 90 System.out.println("获得列" + i + "能否出现在where中:" + isSearchable); 91 } 92 } 93 } catch (SQLException e) { 94 System.out.println("数据库连接失败"); 95 } 96 } 97 }