版权声明:本文为博主原创文章,转载请注明原出处,谢谢! https://blog.csdn.net/czw2010/article/details/18816599

1. 前言

在JDBC技术规范中,提供了Connection,Statement,ResultSet这三个开发过程中经常用到的接口。针对与每个接口,JDBC规范提供了相应的接口描述对象,也就是xxxMetaData系列描述对象。DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。

本文地址:http://blog.csdn.net/chen_zw/article/details/18816599

2. DatabaseMetaData接口常用的方法:

(1) ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types);   //获取表信息

(2) ResultSet getPrimaryKeys(String catalog,String schema,String table);  //获取表主键信息

(3) ResultSet getIndexInfo(String catalog,String schema,String table,boolean unique,boolean approximate);  //获取表索引信息

(4) ResultSet getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern); //获取表列信息

3. Demo封装演示:

package com.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import oracle.jdbc.driver.OracleConnection;/*** @Description: JDBC操作元数据示例-- DatabaseMetaData接口* @CreateTime: 2014-1-19 下午9:46:44* @author: chenzw * @version V1.0*/
public class JdbcUtil {//获得驱动  private static String DRIVER = "oracle.jdbc.driver.OracleDriver";  //获得url  private static String URL = "jdbc:oracle:thin:@localhost:test";  //获得连接数据库的用户名  private static String USER = "root";  //获得连接数据库的密码  private static String PASS = "root";  static {  try {   //初始化JDBC驱动并让驱动加载到jvm中  Class.forName(DRIVER);  } catch (ClassNotFoundException e) {  e.printStackTrace();  }  }  public static Connection getConnection(){  Connection conn = null;  try {   //连接数据库  /** 设置可获取REMARK备注信息Properties props =new Properties();props.put("remarksReporting","true");props.put("user", USER);props.put("password", PASS);conn =DriverManager.getConnection(URL,props);*/conn = DriverManager.getConnection(URL,USER,PASS);  conn.setAutoCommit(true);} catch (SQLException e) {  e.printStackTrace();  }  return conn;  }  //关闭连接public static void close(Object o){  if (o == null){  return;  }  if (o instanceof ResultSet){  try {  ((ResultSet)o).close();  } catch (SQLException e) {  e.printStackTrace();  }  } else if(o instanceof Statement){  try {  ((Statement)o).close();  } catch (SQLException e) {  e.printStackTrace();  }  } else if (o instanceof Connection){  Connection c = (Connection)o;  try {  if (!c.isClosed()){  c.close();  }  } catch (SQLException e) {  e.printStackTrace();  }  }    }  public static void close(ResultSet rs, Statement stmt,   Connection conn){  close(rs);  close(stmt);  close(conn);  }  public static void close(ResultSet rs,   Connection conn){  close(rs);   close(conn);  }  /*** @Description: 获取数据库相关信息* @author: chenzw * @CreateTime: 2014-1-27 下午5:09:12 * @throws*/public static void getDataBaseInfo() {  Connection conn =  getConnection();ResultSet rs = null;try{  DatabaseMetaData dbmd = conn.getMetaData();System.out.println("数据库已知的用户: "+ dbmd.getUserName());    System.out.println("数据库的系统函数的逗号分隔列表: "+ dbmd.getSystemFunctions());    System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ dbmd.getTimeDateFunctions());    System.out.println("数据库的字符串函数的逗号分隔列表: "+ dbmd.getStringFunctions());    System.out.println("数据库供应商用于 'schema' 的首选术语: "+ dbmd.getSchemaTerm());    System.out.println("数据库URL: " + dbmd.getURL());    System.out.println("是否允许只读:" + dbmd.isReadOnly());    System.out.println("数据库的产品名称:" + dbmd.getDatabaseProductName());    System.out.println("数据库的版本:" + dbmd.getDatabaseProductVersion());    System.out.println("驱动程序的名称:" + dbmd.getDriverName());    System.out.println("驱动程序的版本:" + dbmd.getDriverVersion());  System.out.println("数据库中使用的表类型");    rs = dbmd.getTableTypes();    while (rs.next()) {    System.out.println(rs.getString("TABLE_TYPE"));    }    }catch (SQLException e){  e.printStackTrace();  } finally{JdbcUtil.close(rs,conn);} } /*** @Description:获得数据库中所有Schemas(对应于oracle中的Tablespace)* @author: chenzw * @CreateTime: 2014-1-27 下午5:10:35 * @throws*/public static void getSchemasInfo(){  Connection conn =  getConnection();ResultSet rs = null;try{  DatabaseMetaData dbmd = conn.getMetaData();rs = dbmd.getSchemas();   while (rs.next()){     String tableSchem = rs.getString("TABLE_SCHEM"); System.out.println(tableSchem);     }     } catch (SQLException e){  e.printStackTrace();     } finally{JdbcUtil.close(rs,conn);}  }  /*** @Description: 获取数据库中所有的表信息* @author: chenzw * @CreateTime: 2014-1-27 下午5:08:28 * @throws*/public static void getTablesList() {  Connection conn =  getConnection();ResultSet rs = null;try {  /*** 设置连接属性,使得可获取到表的REMARK(备注)*/((OracleConnection)conn).setRemarksReporting(true); DatabaseMetaData dbmd = conn.getMetaData();String[] types = { "TABLE" };  rs = dbmd.getTables(null, null, "%", types);  while (rs.next()) {  String tableName = rs.getString("TABLE_NAME");  //表名  String tableType = rs.getString("TABLE_TYPE");  //表类型  String remarks = rs.getString("REMARKS");       //表备注  System.out.println(tableName + " - " + tableType + " - " + remarks);  }  } catch (SQLException e) {  e.printStackTrace();  } finally{JdbcUtil.close(rs,conn);} }  /*** @Description: 获取某表信息* @author: chenzw * @CreateTime: 2014-1-27 下午3:26:30 * @throws*/public static void getTablesInfo(){Connection conn =  getConnection();ResultSet rs = null;try {/*** 设置连接属性,使得可获取到表的REMARK(备注)*/((OracleConnection)conn).setRemarksReporting(true); DatabaseMetaData dbmd = conn.getMetaData();/*** 获取给定类别中使用的表的描述。* 方法原型:ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types);* catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。* schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%");* tableNamePattern - 表名称;可包含单字符通配符("_"),或多字符通配符("%");* types - 表类型数组; "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM";null表示包含所有的表类型;可包含单字符通配符("_"),或多字符通配符("%"); */rs = dbmd.getTables(null, null, "CUST_INTER_TF_SERVICE_REQ", new String[]{"TABLE","VIEW"}); while(rs.next()){String tableCat = rs.getString("TABLE_CAT");  //表类别(可为null) String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知     String tableName = rs.getString("TABLE_NAME");  //表名  String tableType = rs.getString("TABLE_TYPE");  //表类型,典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。String remarks = rs.getString("REMARKS");       //表备注  System.out.println(tableCat + " - " + tableSchemaName + " - " +tableName + " - " + tableType + " - " + remarks);  }} catch (Exception ex) {ex.printStackTrace();}finally{JdbcUtil.close(rs,conn);}}/*** @Description: 获取表主键信息* @author: chenzw * @CreateTime: 2014-1-27 下午5:12:53 * @throws*/public static void getPrimaryKeysInfo() {  Connection conn =  getConnection();ResultSet rs = null;try{  DatabaseMetaData dbmd = conn.getMetaData();/*** 获取对给定表的主键列的描述* 方法原型:ResultSet getPrimaryKeys(String catalog,String schema,String table);* catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。* schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%");* table - 表名称;可包含单字符通配符("_"),或多字符通配符("%");*/rs = dbmd.getPrimaryKeys(null, null, "CUST_INTER_TF_SERVICE_REQ");  while (rs.next()){  String tableCat = rs.getString("TABLE_CAT");  //表类别(可为null) String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知     String tableName = rs.getString("TABLE_NAME");  //表名  String columnName = rs.getString("COLUMN_NAME");//列名  short keySeq = rs.getShort("KEY_SEQ");//序列号(主键内值1表示第一列的主键,值2代表主键内的第二列)  String pkName = rs.getString("PK_NAME"); //主键名称    System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + columnName + " - "+ keySeq + " - " + pkName);     }  }catch (SQLException e){  e.printStackTrace();  }finally{JdbcUtil.close(rs,conn);}}  /*** @Description: 获取表索引信息* @author: chenzw * @CreateTime: 2014-1-27 下午5:12:04 * @throws*/public static void getIndexInfo() { Connection conn =  getConnection();ResultSet rs = null;try{  DatabaseMetaData dbmd = conn.getMetaData();/*** 获取给定表的索引和统计信息的描述* 方法原型:ResultSet getIndexInfo(String catalog,String schema,String table,boolean unique,boolean approximate)* catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。* schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%");* table - 表名称;可包含单字符通配符("_"),或多字符通配符("%");* unique - 该参数为 true时,仅返回唯一值的索引; 该参数为 false时,返回所有索引;* approximate - 该参数为true时,允许结果是接近的数据值或这些数据值以外的值;该参数为 false时,要求结果是精确结果;*/rs = dbmd.getIndexInfo(null, null, "CUST_INTER_TF_SERVICE_REQ", false, true);  while (rs.next()){  String tableCat = rs.getString("TABLE_CAT");  //表类别(可为null) String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知     String tableName = rs.getString("TABLE_NAME");  //表名  boolean nonUnique = rs.getBoolean("NON_UNIQUE");// 索引值是否可以不唯一,TYPE为 tableIndexStatistic时索引值为 false;String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引类别(可能为空),TYPE为 tableIndexStatistic 时索引类别为 null; String indexName = rs.getString("INDEX_NAME");//索引的名称 ;TYPE为 tableIndexStatistic 时索引名称为 null;/*** 索引类型: *  tableIndexStatistic - 此标识与表的索引描述一起返回的表统计信息 *  tableIndexClustered - 此为集群索引 *  tableIndexHashed - 此为散列索引 *  tableIndexOther - 此为某种其他样式的索引 */short type = rs.getShort("TYPE");//索引类型;short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列顺序号;TYPE为 tableIndexStatistic 时该序列号为零;String columnName = rs.getString("COLUMN_NAME");//列名;TYPE为 tableIndexStatistic时列名称为 null;String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序顺序:升序还是降序[A:升序; B:降序];如果排序序列不受支持,可能为 null;TYPE为 tableIndexStatistic时排序序列为 null;int cardinality = rs.getInt("CARDINALITY");   //基数;TYPE为 tableIndexStatistic 时,它是表中的行数;否则,它是索引中唯一值的数量。   int pages = rs.getInt("PAGES"); //TYPE为 tableIndexStatisic时,它是用于表的页数,否则它是用于当前索引的页数。String filterCondition = rs.getString("FILTER_CONDITION"); //过滤器条件,如果有的话(可能为 null)。System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + nonUnique + " - " + indexQualifier + " - " + indexName + " - " + type + " - " + ordinalPosition + " - " + columnName + " - " + ascOrDesc + " - " + cardinality + " - " + pages + " - " + filterCondition);     }     } catch (SQLException e){  e.printStackTrace();     } finally{JdbcUtil.close(rs,conn);}  }  /*** @Description: 获取表中列值信息* @author: chenzw * @CreateTime: 2014-1-27 下午2:55:56 * @throws*/public static void getColumnsInfo(){Connection conn =  getConnection();ResultSet rs = null;try{/*** 设置连接属性,使得可获取到列的REMARK(备注)*/((OracleConnection)conn).setRemarksReporting(true); DatabaseMetaData dbmd = conn.getMetaData();/*** 获取可在指定类别中使用的表列的描述。* 方法原型:ResultSet getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern)* catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。* schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%");* tableNamePattern - 表名称;可包含单字符通配符("_"),或多字符通配符("%");* columnNamePattern - 列名称; ""表示获取列名为""的列(当然获取不到);null表示获取所有的列;可包含单字符通配符("_"),或多字符通配符("%");*/rs =dbmd.getColumns(null, null, "CUST_INTER_TF_SERVICE_REQ", null);while(rs.next()){String tableCat = rs.getString("TABLE_CAT");  //表类别(可能为空)                  String tableSchemaName = rs.getString("TABLE_SCHEM");  //表模式(可能为空),在oracle中获取的是命名空间,其它数据库未知     String tableName_ = rs.getString("TABLE_NAME");  //表名  String columnName = rs.getString("COLUMN_NAME");  //列名  int dataType = rs.getInt("DATA_TYPE");     //对应的java.sql.Types的SQL类型(列类型ID)     String dataTypeName = rs.getString("TYPE_NAME");  //java.sql.Types类型名称(列类型名称)int columnSize = rs.getInt("COLUMN_SIZE");  //列大小  int decimalDigits = rs.getInt("DECIMAL_DIGITS");  //小数位数 int numPrecRadix = rs.getInt("NUM_PREC_RADIX");  //基数(通常是10或2) --未知/***  0 (columnNoNulls) - 该列不允许为空*  1 (columnNullable) - 该列允许为空*  2 (columnNullableUnknown) - 不确定该列是否为空*/int nullAble = rs.getInt("NULLABLE");  //是否允许为null  String remarks = rs.getString("REMARKS");  //列描述  String columnDef = rs.getString("COLUMN_DEF");  //默认值  int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH");    // 对于 char 类型,该长度是列中的最大字节数 int ordinalPosition = rs.getInt("ORDINAL_POSITION");   //表中列的索引(从1开始)  /** * ISO规则用来确定某一列的是否可为空(等同于NULLABLE的值:[ 0:'YES'; 1:'NO'; 2:''; ])* YES -- 该列可以有空值; * NO -- 该列不能为空;* 空字符串--- 不知道该列是否可为空*/  String isNullAble = rs.getString("IS_NULLABLE");  /** * 指示此列是否是自动递增 * YES -- 该列是自动递增的* NO -- 该列不是自动递增* 空字串--- 不能确定该列是否自动递增*/  //String isAutoincrement = rs.getString("IS_AUTOINCREMENT");   //该参数测试报错    System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName_ + " - " + columnName + " - " + dataType + " - " + dataTypeName + " - " + columnSize + " - " + decimalDigits + " - " + numPrecRadix + " - " + nullAble + " - " + remarks + " - " + columnDef + " - " + charOctetLength+ " - " + ordinalPosition + " - " + isNullAble ); }}catch(SQLException ex){ex.printStackTrace();}finally{JdbcUtil.close(rs,conn);}}/*** @Description: TODO* @author: chenzw * @CreateTime: 2014-1-17 下午2:47:45* @param args * @throws */public static void main(String[] args) {getDataBaseInfo();  //获取数据库信息getSchemasInfo(); //获取数据库所有SchemagetTablesList();  //获取某用户下所有的表getTablesInfo();  //获取表信息getPrimaryKeysInfo(); //获取表主键信息getIndexInfo();  //获取表索引信息getColumnsInfo(); //获取表中列值信息}
}

Note: (1)JDBC元数据的操作是很消耗性能的,所以应尽量避免使用。

(2)在获取元数据中的REMARK(即 备注)前,需要设置RemarksReporting属性为true,否则获取到的REMARK属性都是null,设置该属性有两种方法,请参阅上面的Demo。

JDBC元数据操作-- DatabaseMetaData接口详解相关推荐

  1. mysql中jdbc的metadata_JDBC元数据操作——DatabaseMetaData接口详解

    在JDBC技术规范中,提供了Connection,Statement,ResultSet这三个开发过程中经常用到的接口.针对与每个接口,JDBC规范提供了相应的接口描述对象,也就是xxxMetaDat ...

  2. JDBC元数据操作(一)-- DatabaseMetaData接口详解

    转自: https://blog.csdn.net/chen_zw/article/details/18816599 1. 前言     在JDBC技术规范中,提供了Connection,Statem ...

  3. MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结

    文章目录 SQL注入 Statement详解 基本介绍 Navicat演示SQL注入 JDBC演示SQL注入 PreparedStatement详解 基本介绍 预处理好处 预处理案例(selete语句 ...

  4. java JDBC事务和JTA事务详解

    什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...

  5. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  6. 【JavaWeb】Servlet系列——HttpServletRequest接口详解

    文章目录 23 HttpServletRequest接口详解 23.1 关于HttpServletRequest接口 23.2 HttpServletRequest接口的实现类谁写的? HttpSer ...

  7. 微信机器人网页版接口详解

    微信网页版接口详解 本系列会讲述微信机器人技术的实现,第一讲主要了解微信网页版给我们提供的http接口,这一步是做一个基于微信网页版机器人的基础和难点. 本讲将微信网页版的主要接口罗列出,并给出了入参 ...

  8. Java接口 详解(二)

    上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用-工厂设计模式(Factory) 我们先看一个范例: package com. ...

  9. 兄弟机cnc系统面板图解_数控机床操作面板图文详解

    <数控机床操作面板图文详解>由会员分享,可在线阅读,更多相关<数控机床操作面板图文详解(53页珍藏版)>请在人人文库网上搜索. 1.数 控 车 床 编 程 和 操 作(一) 熟 ...

最新文章

  1. Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
  2. SLAM综述|激光与视觉融合SLAM
  3. 计算机导论的学科知识体,依托学科课程体系的《计算机导论》课程改革
  4. python微信红包代码_Python实现的微信红包提醒功能示例
  5. 量子信息先行者中科院院士郭光灿:“要把中国量子计算机卖到国外”
  6. 汇编指令长度计算方法
  7. 如何让你用 Python 年薪 40 万?答案早就写到 JD 上了
  8. delphi中的第三方控件如何安装
  9. C#抓取网页HTML内容
  10. [JavaWeb]web相关概念回顾
  11. TFS(Team Foundation Server)敏捷使用教程
  12. Scapy 中文文档:一、介绍
  13. 存储过程可重用的代码块_如何使您的代码可重用
  14. scrapy 在迭代爬取时被拒 offsite 增加dont_filter=True
  15. MySQL 基础操作
  16. 软件工程——五大模型
  17. 单片微型计算机原理及应用考试,单片机原理及应用《微机原理及应用》试卷(A卷)附答案...
  18. 中国搜索20年:巨头百度的兴衰密码
  19. lookup-method方法理解
  20. 操作系统安装磁盘清理方法

热门文章

  1. 《你就是孩子最好的玩具》学习笔记 - 第一章
  2. 远程控制 远程监控软件2013年终极排行榜
  3. 不同网段远程操作linux,Linux下如何实现不同网段之间的访问
  4. 著名SaaS研究员许卫国:我看XTools上央视
  5. NOIP 2013 计数问题
  6. 前端学习:学习笔记(JS部分)
  7. 固态硬盘各种受损,数据恢复一个对策,你值得拥有!
  8. 预防计算机病毒注意事项,看过来:预防病毒的八点注意事项
  9. 百度手机卫士联手央视3·15大数据分析 女性、老年人易遭电信诈骗
  10. 攀升闪电龙BG1电脑总是自动关机怎么重装系统教学