zoukankan      html  css  js  c++  java
  • OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质、最抽象的定义为: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数据库管理器的设计与实现(源码)

    相关阅读

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

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

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

  • 相关阅读:
    网页日历显示控件calendar3.1
    切换“使用被动式FTP”
    href="javascript:xxx(this);"和onclick="javascript:xxx(this);"的区别
    CSS布局--上中下布局(上下固定,中间自适应)
    css字体颜色动画
    怎么让jQuery支持swipe事件
    html 5 canvas
    javascript面向对象
    WEB相关存储方式
    angularjs
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463476.html
Copyright © 2011-2022 走看看