ResultSetMetaData

使用DatabaseMetaData接口和ResultSetMetaData查询数据库结构

首先是DatabaseMetaData接口:

Java代码
  1. public static void main(String[] args) {   
  2.            
  3.         //这里没有指定数据库   
  4.         String url = "jdbc:mysql://127.0.0.1:3306/";   
  5.         String user = "root";   
  6.         String pass = "";   
  7.         try {   
  8.   
  9.             Class.forName("com.mysql.jdbc.Driver").newInstance();   
  10.             Connection conn = DriverManager.getConnection(url, user, pass);   
  11.             DatabaseMetaData metadata = conn.getMetaData();   
  12.             System.out.println("数据库已知的用户: "+ metadata.getUserName());   
  13.             System.out.println("数据库的系统函数的逗号分隔列表: "+ metadata.getSystemFunctions());   
  14.             System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ metadata.getTimeDateFunctions());   
  15.             System.out.println("数据库的字符串函数的逗号分隔列表: "+ metadata.getStringFunctions());   
  16.             System.out.println("数据库供应商用于 'schema' 的首选术语: "+ metadata.getSchemaTerm());   
  17.             System.out.println("数据库URL: " + metadata.getURL());   
  18.             System.out.println("是否允许只读:" + metadata.isReadOnly());   
  19.             System.out.println("数据库的产品名称:" + metadata.getDatabaseProductName());   
  20.             System.out.println("数据库的版本:" + metadata.getDatabaseProductVersion());   
  21.             System.out.println("驱动程序的名称:" + metadata.getDriverName());   
  22.             System.out.println("驱动程序的版本:" + metadata.getDriverVersion());   
  23.                
  24.             System.out.println();   
  25.             System.out.println("数据库中使用的表类型");   
  26.             ResultSet rs = metadata.getTableTypes();   
  27.             while (rs.next()) {   
  28.                 System.out.println(rs.getString(1));   
  29.             }   
  30.             rs.close();   
  31.                
  32.             System.out.println();   
  33.             /**  
  34.              * 获取指定的数据库的所有表的类型,getTables()的第一个参数就是数据库名  
  35.              * 因为与MySQL连接时没有指定,这里加上,剩下的参数就可以为null了  
  36.              * 第二个参数是模式名称的模式,但是输出也是什么都没有。谁知道告诉我一声  
  37.              */  
  38.             System.out.println("获取指定的数据库的所有表的类型");   
  39.             ResultSet rs1 = metadata.getTables("ssi2bbs"nullnullnull);   
  40.             while (rs1.next()) {   
  41.                 System.out.println();   
  42.                 System.out.println("数据库名:"+ rs1.getString(1));   
  43.                 System.out.println("表名: "+rs1.getString(3));   
  44.                 System.out.println("类型: "+rs1.getString(4));   
  45.             }   
  46.             rs1.close();   
  47.                
  48.             System.out.println();   
  49.             System.out.println("获取指定的数据库的表的主键");   
  50.             //获取指定的数据库的表的主键,第二个参数也是模式名称的模式,使用null了  
  51.             ResultSet rs2 = metadata.getPrimaryKeys("mysql"null"db");   
  52.             while (rs2.next()) {   
  53.                 System.out.println("主键名称: "+ rs2.getString(4));   
  54.             }   
  55.             rs2.close();   
  56.                
  57.             System.out.println();   
  58.             System.out.println("DatabaseMetaData.getIndexInfo()方法返回信息:");   
  59.             ResultSet rs3 = metadata.getIndexInfo("ssi2bbs"null"user"falsetrue);   
  60.             while (rs3.next()) {   
  61.                 System.out.println("数据库名: "+ rs3.getString(1));   
  62.                 System.out.println("表模式: "+ rs3.getString(2));   
  63.                 System.out.println("表名称: "+ rs3.getString(3));   
  64.                 System.out.println("索引值是否可以不唯一: "+ rs3.getString(4));   
  65.                 System.out.println("索引类别: "+ rs3.getString(5));   
  66.                 System.out.println("索引名称: "+ rs3.getString(6));   
  67.                 System.out.println("索引类型: "+ rs3.getString(7));   
  68.                 System.out.println("索引中的列序列号: "+ rs3.getString(8));   
  69.                 System.out.println("列名称: "+ rs3.getString(9));   
  70.                 System.out.println("列排序序列: "+ rs3.getString(10));   
  71.                 System.out.println("TYPE为 tableIndexStatistic时它是表中的行数否则它是索引中唯一值的数量: "+ rs3.getString(11));   
  72.                 System.out.println("TYPE为 tableIndexStatisic时它是用于表的页数否则它是用于当前索引的页数: "+ rs3.getString(12));   
  73.                 System.out.println("过滤器条件: "+ rs3.getString(13));   
  74.             }   
  75.             rs3.close();   
  76.                
  77.         } catch (Exception e) {   
  78.             e.printStackTrace();   
  79.         }   
  80.     }  

 ResultSetMetaData接口, 用于获取关于ResultSet 对象中列的类型和属性信息的对象。下面的代码是把一个表的列信息打印了出来。当然了,这只是一部分。详细的参考JAVA JDK。

Java代码
  1. public static void main(String[] args) {   
  2.         try {   
  3.             Class.forName("com.mysql.jdbc.Driver").newInstance();   
  4.             Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssi2bbs","root","");   
  5.             PreparedStatement ps = conn.prepareStatement("select * from bbs");   
  6.             ResultSet rs = ps.executeQuery();   
  7.             ResultSetMetaData rsme = rs.getMetaData();   
  8.                
  9.             int columnCount = rsme.getColumnCount();   
  10.             System.out.println("ResultSet对象中的列数"+ columnCount);   
  11.             for (int i = 1; i < columnCount ; i++) {   
  12.                 System.out.println();   
  13.                 System.out.println("列名称: "+ rsme.getColumnName(i));   
  14.                 System.out.println("列类型(DB): " + rsme.getColumnTypeName(i));   
  15.                 System.out.println("长度: "+ rsme.getPrecision(i) );   
  16.                 System.out.println("是否自动编号: "+ rsme.isAutoIncrement(i));   
  17.                 System.out.println("是否可以为空: "+ rsme.isNullable(i));   
  18.                 System.out.println("是否可以写入: "+ rsme.isReadOnly(i));   
  19.             }   
  20.                
  21.         } catch (Exception e) {   
  22.             e.printStackTrace();   
  23.         }   
  24.            
  25.     } 

返回值类型   方法名称
String    getCatalogName(int column) 
获取指定列的表目录名称。 
 String    getColumnClassName(int column) 
如果调用方法 ResultSet.getObject 从列中检索值,则返回构造其实例的 Java 类的完全限定名称。 
 int       getColumnCount() 
返回此 ResultSet 对象中的列数。 
 int       getColumnDisplaySize(int column) 
指示指定列的最大标准宽度,以字符为单位。 
 String    getColumnLabel(int column) 
获取用于打印输出和显示的指定列的建议标题。 
 String    getColumnName(int column) 
获取指定列的名称。 
 int       getColumnType(int column) 
检索指定列的 SQL 类型。 
 String    getColumnTypeName(int column) 
检索指定列的数据库特定的类型名称。 
 int       getPrecision(int column) 
获取指定列的小数位数。 
 int       getScale(int column) 
获取指定列的小数点右边的位数。 
 String    getSchemaName(int column) 
获取指定列的表模式。 
 String    getTableName(int column) 
获取指定列的名称。 
 boolean   isAutoIncrement(int column) 
指示是否自动为指定列进行编号,这样这些列仍然是只读的。 
 boolean   isCaseSensitive(int column) 
指示列的大小写是否有关系。 
 boolean   isCurrency(int column) 
指示指定的列是否是一个哈希代码值。 
 boolean   isDefinitelyWritable(int column) 
指示在指定的列上进行写操作是否明确可以获得成功。 
 int       isNullable(int column) 
指示指定列中的值是否可以为 null。 
 boolean   isReadOnly(int column) 
指示指定的列是否明确不可写入。 
 boolean   isSearchable(int column) 
指示是否可以在 where 子句中使用指定的列。 
 boolean   isSigned(int column) 
指示指定列中的值是否带正负号。 
 boolean   isWritable(int column) 
指示在指定的列上进行写操作是否可以获得成功


最近做反射的时候,在jdbc执行sql后,ResultSetMetaData获取到表的结果集,这里着重注意下getColumnLabel和getColumnName   这连个方法,getColumnName它获取的是当前操作表的最原始的列名,而getColumnLabel操作的是当前命名的列名,以防混淆,我举个例子:

首先:sql如下:SELECT WORKERNAME AS NAME,WORKERID AS CODE from WORKER

执行:    rs = st.executeQuery(sql);//查询结果集 ResultSetMetaData rsmd = rs.getMetaData();//整表属性结果集

        int len = rsmd.getColumnCount()+1; while(rs.next()){ for(int i=1;i<len;i++){ //String field = rsmd.getColumnLabel(i);//此时field只能是 NAME,CODE//(即当前的列名)

String field = rsmd.getColumnName(i);//此时field是 WORKERNAME,WORKERID(即原始的列名)

}

}

这个对于经验丰富的可能不算什么,但对于新手

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值