元数据最本质、最抽象的定义为:data about data (关于数据的数据)。它是一种广泛存在的现象,在许多领域有其具体的定义和应用。

JDBC中的元数据,有数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaData)

分别封装了数据库产品名字等数据库信息、查询参数的个数等参数信息、结果集的列数等结果集信息。

数据库元数据

  1. /**
  2. *数据库的整体综合信息。
  3.  
  4. */
  5.  
  6. public interface DatabaseMetaData extends Wrapper {
  7.  
  8. /**
  9. * 查询数据库产品的名字
  10. */
  11. String getDatabaseProductName() throws SQLException;
  12.  
  13. /**
  14. * 查询数据库产品的版本号。
  15. */
  16. String getDatabaseProductVersion() throws SQLException;
  17.  
  18. }
  19.  
  20. /**
  21. * 一个被用来获得每一个参数的类型和属性的对象
  22.  
  23. */
  24.  
  25. public interface ParameterMetaData extends Wrapper {
  26.  
  27. /**
  28. * 查询参数的个数。
  29. */
  30. int getParameterCount() throws SQLException;
  31.  
  32. }
  33.  
  34. /**
  35. * 一个被用来获得ResultSet中的列的类型和属性的对象。
  36.  
  37. */
  38.  
  39. public interface ResultSetMetaData extends Wrapper {
  40.  
  41. /**
  42. * 返回结果集中的列数。
  43. */
  44. int getColumnCount() throws SQLException;
  45.  
  46. }

上述不完整源码,摘自OpenJDK源码java.sql包,完整源码请参考OpenJDK源码,完整用法请参考JDK API文档。

小试牛刀

  1. package cn.fansunion.project;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DatabaseMetaData;
  5. import java.sql.DriverManager;
  6. import java.sql.ParameterMetaData;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.ResultSetMetaData;
  10. import java.sql.SQLException;
  11.  
  12. /**
  13. *
  14. * OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData)
  15. * ,结果集元数据(ResultSetMetaData)
  16. *
  17. * @author LeiWen@FansUnion.cn 2013年11月2日
  18. *
  19. */
  20. public class JDBCMetadataExample {
  21.  
  22. public static void main(String[] args) throws ClassNotFoundException,
  23. SQLException {
  24. Connection con = getOneConnection();
  25. // 数据库元数据
  26. DatabaseMetaData dbmd = con.getMetaData();
  27. displayDatabaseMetaData(dbmd);
  28.  
  29. println("\n");
  30.  
  31. // Password是密文,Windows数据库表名不区分大小写
  32. String sql = "select User,Password,Host from mysql.user where User=? and Host = ?";
  33. PreparedStatement ps = con.prepareStatement(sql);
  34. ps.setString(1, "root");
  35. ps.setString(2, "localhost");
  36. ResultSet userResultSet = ps.executeQuery();
  37. // 参数元数据
  38. ParameterMetaData pmd = ps.getParameterMetaData();
  39. displayParameterMedata(pmd);
  40. println();
  41.  
  42. // 结果集元数据
  43. ResultSetMetaData rsmd = userResultSet.getMetaData();
  44. displayResultSetMetaData(rsmd);
  45.  
  46. println("查询的用户列表:");
  47. while (userResultSet.next()) {
  48. print(userResultSet.getString("User") + "\t");
  49. print(userResultSet.getString("Password") + "\t");
  50. println(userResultSet.getString("Host"));
  51. }
  52. }
  53.  
  54. // 获得一个数据库连接
  55. private static Connection getOneConnection() throws ClassNotFoundException,
  56. SQLException {
  57. // 加载MySQL数据库驱动
  58. Class.forName("com.mysql.jdbc.Driver");
  59. // 根据3个参数构造数据库连接
  60. String url = "jdbc:mysql://localhost:3306";
  61. String name = "root";
  62. String password = "123456";
  63. Connection con = DriverManager.getConnection(url, name, password);
  64. return con;
  65. }
  66.  
  67. // 工具方法:打印数据库的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。
  68. private static void displayDatabaseMetaData(DatabaseMetaData dbmd)
  69. throws SQLException {
  70. // 元数据信息
  71. println("驱动的名字:" + dbmd.getDriverName());
  72. println("驱动的版本号:" + dbmd.getDriverVersion());
  73. println("数据库产品名字:" + dbmd.getDatabaseProductName());
  74. println("数据库产品版本号:" + dbmd.getDatabaseProductVersion());
  75. println("数据库主版本号:" + dbmd.getDatabaseMajorVersion());
  76. println("数据库次版本号:" + dbmd.getDatabaseMinorVersion());
  77.  
  78. println("JDBC主版本号:" + dbmd.getJDBCMajorVersion());
  79. println("JDBC次版本号:" + dbmd.getJDBCMinorVersion());
  80. // 元数据获得的数据库名字结果集
  81. ResultSet dbResultSet = dbmd.getCatalogs();
  82. // 打印所有数据库的名字
  83. while (dbResultSet.next()) {
  84. print(dbResultSet.getString(1) + "\t");
  85. }
  86. }
  87.  
  88. // 工具方法:打印结果集的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要代码结构。
  89. private static void displayResultSetMetaData(ResultSetMetaData rsmd)
  90. throws SQLException {
  91. int columnCount = rsmd.getColumnCount();
  92. println("查询的列数:" + columnCount);
  93. }
  94.  
  95. // 工具方法:打印参数的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。
  96. private static void displayParameterMedata(ParameterMetaData pmd)
  97. throws SQLException {
  98. int parameterCount = pmd.getParameterCount();
  99. println("参数的个数:" + parameterCount);
  100. }
  101.  
  102. // 工具方法:简化打印输出
  103. private static void println() {
  104. System.out.println();
  105. }
  106.  
  107. private static void println(Object o) {
  108. System.out.println(o);
  109. }
  110.  
  111. private static void print(Object o) {
  112. System.out.print(o);
  113. }
  114.  
  115. }

有模有样

驱动的名字:MySQL-AB JDBC Driver
驱动的版本号:mysql-connector-java-5.1.22 ( Revision: ${bzr.revision-id} )
数据库产品名字:MySQL
数据库产品版本号:5.5.17
数据库主版本号:5
数据库次版本号:5
JDBC主版本号:4
JDBC次版本号:0
information_schema     mysql

参数的个数:2

查询的列数:3
查询的用户列表:
root    *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9    localhost

元数据的一种典型应用-数据库管理系统

有兴趣的朋友,可以读下

一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)

相关阅读

我的CSDN博客专栏  OpenJDK源码研究笔记

OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。

原文参见http://FansUnion.cn/articles/3066(小雷网-FansUnion.cn)

OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa的更多相关文章

  1. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  2. OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计

    前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...

  3. OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类

    在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...

  4. OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言

    友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...

  5. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  6. OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式

    在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...

  7. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  8. OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法

    本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法.  这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...

  9. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

随机推荐

  1. 本地搭建MongoDB Server

    https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ Overview Requirements Get Mongo ...

  2. Pycharm-连接服务器

  3. Windows安装PHP MongoDB扩展

    本文将讲述一下在Wamp环境下安装MongoDB扩展的过程,大家可以略作参考 Linux 版本的可以参考之前发布的Linux安装PHP MongoDB扩展 安装环境 系统环境:Windows 7 64 ...

  4. RSA加密的方式和解密方式

    RSAsecurity.java package com.mstf.rsa; import java.security.KeyFactory; import java.security.KeyPair ...

  5. Spring MVC 核心架构图

    架构图对应的DispatcherServlet核心代码如下: //前端控制器分派方法 protected void doDispatch(HttpServletRequest request, Htt ...

  6. mac本 maven项目还没发布成功,tomcat就报没有监听ContextLoaderListener 的解决方法

    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL     严重: Error config ...

  7. datable

    $("#table_d").append("<table id='dmglTable' class='table table-striped table-hover ...

  8. [APIO2014]回文串 后缀自动机_Manancher_倍增

    Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...

  9. NodeJS学习笔记 (26)命令行设计-repl

    https://github.com/chyingp/nodejs-learning-guide

  10. Delayer 基于 Redis 的延迟消息队列中间件

    Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...