元数据最本质、最抽象的定义为:data about data (关于数据的数据)。它是一种广泛存在的现象,在许多领域有其具体的定义和应用。
JDBC中的元数据,有数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaData)
分别封装了数据库产品名字等数据库信息、查询参数的个数等参数信息、结果集的列数等结果集信息。
数据库元数据
/** *数据库的整体综合信息。 */ public interface DatabaseMetaData extends Wrapper { /** * 查询数据库产品的名字 */ String getDatabaseProductName() throws SQLException; /** * 查询数据库产品的版本号。 */ String getDatabaseProductVersion() throws SQLException; } /** * 一个被用来获得每一个参数的类型和属性的对象 */ public interface ParameterMetaData extends Wrapper { /** * 查询参数的个数。 */ int getParameterCount() throws SQLException; } /** * 一个被用来获得ResultSet中的列的类型和属性的对象。 */ public interface ResultSetMetaData extends Wrapper { /** * 返回结果集中的列数。 */ int getColumnCount() throws SQLException; }
上述不完整源码,摘自OpenJDK源码java.sql包,完整源码请参考OpenJDK源码,完整用法请参考JDK API文档。
小试牛刀
package cn.fansunion.project; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; /** * * OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData) * ,结果集元数据(ResultSetMetaData) * * @author LeiWen@FansUnion.cn 2013年11月2日 * */ public class JDBCMetadataExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection con = getOneConnection(); // 数据库元数据 DatabaseMetaData dbmd = con.getMetaData(); displayDatabaseMetaData(dbmd); println(" "); // Password是密文,Windows数据库表名不区分大小写 String sql = "select User,Password,Host from mysql.user where User=? and Host = ?"; PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, "root"); ps.setString(2, "localhost"); ResultSet userResultSet = ps.executeQuery(); // 参数元数据 ParameterMetaData pmd = ps.getParameterMetaData(); displayParameterMedata(pmd); println(); // 结果集元数据 ResultSetMetaData rsmd = userResultSet.getMetaData(); displayResultSetMetaData(rsmd); println("查询的用户列表:"); while (userResultSet.next()) { print(userResultSet.getString("User") + " "); print(userResultSet.getString("Password") + " "); println(userResultSet.getString("Host")); } } // 获得一个数据库连接 private static Connection getOneConnection() throws ClassNotFoundException, SQLException { // 加载MySQL数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 根据3个参数构造数据库连接 String url = "jdbc:mysql://localhost:3306"; String name = "root"; String password = "123456"; Connection con = DriverManager.getConnection(url, name, password); return con; } // 工具方法:打印数据库的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。 private static void displayDatabaseMetaData(DatabaseMetaData dbmd) throws SQLException { // 元数据信息 println("驱动的名字:" + dbmd.getDriverName()); println("驱动的版本号:" + dbmd.getDriverVersion()); println("数据库产品名字:" + dbmd.getDatabaseProductName()); println("数据库产品版本号:" + dbmd.getDatabaseProductVersion()); println("数据库主版本号:" + dbmd.getDatabaseMajorVersion()); println("数据库次版本号:" + dbmd.getDatabaseMinorVersion()); println("JDBC主版本号:" + dbmd.getJDBCMajorVersion()); println("JDBC次版本号:" + dbmd.getJDBCMinorVersion()); // 元数据获得的数据库名字结果集 ResultSet dbResultSet = dbmd.getCatalogs(); // 打印所有数据库的名字 while (dbResultSet.next()) { print(dbResultSet.getString(1) + " "); } } // 工具方法:打印结果集的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要代码结构。 private static void displayResultSetMetaData(ResultSetMetaData rsmd) throws SQLException { int columnCount = rsmd.getColumnCount(); println("查询的列数:" + columnCount); } // 工具方法:打印参数的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。 private static void displayParameterMedata(ParameterMetaData pmd) throws SQLException { int parameterCount = pmd.getParameterCount(); println("参数的个数:" + parameterCount); } // 工具方法:简化打印输出 private static void println() { System.out.println(); } private static void println(Object o) { System.out.println(o); } private static void print(Object o) { System.out.print(o); } }
有模有样
驱动的名字: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数据库管理器的设计与实现(源码)
相关阅读
OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。
原文参见:http://FansUnion.cn/articles/3066(小雷网-FansUnion.cn)