• 21【JDBC操作数据库元数据】



    21【JDBC操作数据库元数据】

    1.1 元数据

    1.1.1 数据库元数据

    Java通过JDBC获取到连接后,可以从连接对象中获取有关数据库的各种信息,包括数据库

    • Connection获取数据库元数据:
    方法名描述
    DatabaseMetaData getMetaData()获取数据库元数据信息
    • DatabaseMetaData类中提供了许多用于获取数据库信息的方法,方法如下:

      • getURL():返回一个String类对象,代表数据库的URL。
      • getUserName():返回连接当前数据库管理系统的用户名。
      • isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
      • getDatabaseProductName():返回数据库的产品名称。
      • getDatabaseProductVersion():返回数据库的版本号。
      • getDriverName():返回驱动驱动程序的名称。
      • getDriverVersion():返回驱动程序的版本号。
    • 测试代码:

    package com.dfbz.demo;
    
    import com.dfbz.utils.JdbcUtils;
    import org.junit.Test;
    
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    public class Demo16_元数据 {
    
        /**
         * 数据库元数据
         *
         * @throws Exception
         */
        @Test
        public void test1() throws Exception {
    
            Connection connection = JdbcUtils.getConnection();
    
            // 获取数据库元数据
            DatabaseMetaData metaData = connection.getMetaData();
    
            System.out.println(metaData.getURL());            // 打印数据库的URL
            System.out.println(metaData.getUserName());        // 打印数据库的用户名
            System.out.println(metaData.isReadOnly());        // 打印数据库的用户名
            System.out.println(metaData.getDatabaseProductName());    // 打印数据库产品的名称
            System.out.println(metaData.getDatabaseProductVersion());    // 打印数据库版本号
            System.out.println(metaData.getDriverName());    // 打印数据库版本号
            System.out.println(metaData.getDriverVersion());    // 打印数据库版本号
    
            JdbcUtils.close(connection, null);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行效果:

    在这里插入图片描述

    1.1.2 结果集元数据

    当使用语句对象(PreparedStatement、Statement)执行查询获取结果集时,使用结果集对象(ResultSet)可以获取本次查询结果集的元数据,元数据中包含了查询结果集的列数量、指定列的类型、指定列所在的表名等详细情况;

    • 使用ResultSet获取结果集元数据:
    方法名描述
    ResultSetMetaData getMetaData()获取结果集元数据信息
    • ResultSetMetaData 类中提供了许多用于获取数据库信息的方法,方法如下:

      • String getTableName(int column):获取指定列所在的表名
      • int getColumnCount():结果集中有多少列
      • String getColumnName(int column):结果集中指定列的列名
      • String getColumnTypeName(int column):结果集中指定列的类型
      • int getColumnDisplaySize(int column):结果集中指定列大小
      • boolean isAutoIncrement(int column):结果集中指定列是否是自增列
      • int isNullable(int column):结果集中指定列是否可以为null

    • 创建测试表:
    drop table if exists test1;
    drop table if exists test2;
    
    CREATE TABLE test1 (  
        id INT(10) PRIMARY KEY AUTO_INCREMENT,  
        name VARCHAR(20)
    );  
    
    
    insert into test1 values(1,'a');
    insert into test1 values(2,'b');
    
    CREATE TABLE test2 (  
        id INT(10) PRIMARY KEY AUTO_INCREMENT,  
        name VARCHAR(20)
    );  
    
    insert into test2 values(1,'a');
    insert into test2 values(2,'b');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 测试代码:
    /**
     * 结果集元数据
     *
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
    
        // 获取连接
        Connection connection = JdbcUtils.getConnection();
    
        // 获取语句对象
        Statement statement = connection.createStatement();
    
        // 执行查询,获取结果集
        ResultSet rs = statement.executeQuery("select * from test1,test2");
    
        // 获取结果集元数据对象
        ResultSetMetaData metaData = rs.getMetaData();
    
        // 获取指定列所在的表名
        System.out.println(metaData.getTableName(1));           // test1
        System.out.println(metaData.getTableName(3));           // test2
        System.out.println("----------------");
    
        // 结果集中有多少列
        System.out.println(metaData.getColumnCount());                  // 4
        System.out.println("----------------");
    
        // 结果集中的列名
        System.out.println(metaData.getColumnName(1));                  // id
        System.out.println(metaData.getColumnName(2));                  // name
        System.out.println("----------------");
    
        // 结果集中的列名
        System.out.println(metaData.getColumnTypeName(1));              // INT
        System.out.println(metaData.getColumnTypeName(2));              // VARCHAR
        System.out.println(metaData.getColumnTypeName(3));              // INT
        System.out.println("----------------");
    
        // 列大小
        System.out.println(metaData.getColumnDisplaySize(1));           // 10
        System.out.println(metaData.getColumnDisplaySize(2));           // 20
        System.out.println(metaData.getColumnDisplaySize(3));           // 10
        System.out.println("----------------");
    
        // 是否是自增列
        System.out.println(metaData.isAutoIncrement(1));        // true
        System.out.println(metaData.isAutoIncrement(2));        // false
        System.out.println(metaData.isAutoIncrement(3));        // true
        System.out.println("----------------");
    
        // 是否可以为null
        System.out.println(metaData.isNullable(1));             // 0(不可以为null)
        System.out.println(metaData.isNullable(2));             // 1(可以为null)
        System.out.println("----------------");
    
        JdbcUtils.close(connection, statement);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    执行结果集:

    test1
    test2
    ----------------
    4
    ----------------
    id
    name
    ----------------
    INT
    VARCHAR
    INT
    ----------------
    10
    20
    10
    ----------------
    true
    false
    true
    ----------------
    0
    1
    1
    ----------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.1.3 参数元数据

    当使用PreparedStatement对参数进行预编译处理时,可以获取参数的元数据,例如预编译的参数个数、参数的类型等,但在MySQL驱动大部分方法都不支持,关于这个功能我们了解即可;

    • 使用PreparedStatement获参数的元数据:
    方法名描述
    ParameterMetaData getParameterMetaData()获取参数元数据信息
    • ParameterMetaData 类中提供了许多用于获取数据库信息的方法,方法如下:
      • int getParameterCount():获取预编译的参数个数
      • String getParameterTypeName(int param):获取指定参数的sql类型,MySQL数据库驱动不支持

    • 测试Java代码:
    /**
     * 参数元数据
     *
     * @throws Exception
     */
    @Test
    public void test3() throws Exception {
    
        // 获取连接
        Connection connection = JdbcUtils.getConnection();
    
        // 获取语句对象
        PreparedStatement ps = connection.prepareStatement("select * from test1 where name=? and money=?");
    
        // 获取参数元数据
        ParameterMetaData metaData = ps.getParameterMetaData();
    
        // 获取预编译的参数个数
        System.out.println(metaData.getParameterCount());
    
        // 获取指定参数的sql类型,MySQL数据库驱动不支持
    //        System.out.println(metaData.getParameterTypeName(1));
    //        System.out.println(metaData.getParameterTypeName(2));
        System.out.println("--------------------");
    
        JdbcUtils.close(connection, ps);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

  • 相关阅读:
    EFLAGS寄存器与JCC指令
    [运维|数据库] 数据库迁移到金仓数据库时,sys_user表报错原因
    Go语言网络编程(socket编程)WebSocket编程
    DSDS/DSDA/DR-DSDS/DR-DSDA场景介绍和关键Log分析
    Harbor企业级私服Docker镜像仓库搭建及应用
    如何在Android平板上远程连接Ubuntu服务器code-server进行代码开发?
    面试官:说说反射的底层实现原理?
    SSH Keylogger密码抓取
    全志V3S开发板星光闪烁(linux LED驱动)
    计算机组成原理习题课第一章-1(唐朔飞)
  • 原文地址:https://blog.csdn.net/Bb15070047748/article/details/126570113