JDBC中DatabaseMetaData用法

JDBC中DatabaseMetaData用法DatabaseMetaData类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息。就如我们上面例子中所显示的几个信息[其他的方法请读者参考JDKAPI中的DatabaseMetaData类]:getURL()返回一个String类对象,代表数据库的URL。getUserName()返回连接当前数据库管理系统的用户名。isReadOnly(…

大家好,又见面了,我是你们的朋友全栈君。

DatabaseMetaData类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息。就如我们上面例子中所显示的几个信息[其他的方法请读者参考JDK API中的DatabaseMetaData类]:

getURL()

返回一个String类对象,代表数据库的URL。

getUserName()

返回连接当前数据库管理系统的用户名。

isReadOnly()

返回一个boolean值,指示数据库是否只允许读操作。

getDatabaseProductName()

返回数据库的产品名称。

getDatabaseProductVersion()

返回数据库的版本号。

getDriverName()

返回驱动驱动程序的名称。

getDriverVersion()

返回驱动程序的版本号。


一、获取数据库表信息
getTables
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException
检索可在给定类别中使用的表的描述。仅返回与类别、模式、表名称和类型标准匹配的表描述。它们根据 TABLE_TYPE、TABLE_SCHEM 和 TABLE_NAME 进行排序。
每个表描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
TABLE_TYPE String => 表类型。典型的类型是 “TABLE”、”VIEW”、”SYSTEM TABLE”、”GLOBAL TEMPORARY”、”LOCAL TEMPORARY”、”ALIAS” 和 “SYNONYM”。
REMARKS String => 表的解释性注释
TYPE_CAT String => 类型的类别(可为 null)
TYPE_SCHEM String => 类型模式(可为 null)
TYPE_NAME String => 类型名称(可为 null)
SELF_REFERENCING_COL_NAME String => 有类型表的指定 “identifier” 列的名称(可为null)
REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 “SYSTEM”、”USER” 和 “DERIVED”。(可能为null)
注: 有些数据库可能不返回用于所有表的信息。

参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern – 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern – 表名称模式,因为存储在数据库中,所以它必须匹配表名称
types – 要包括的表类型组成的列表,null 表示返回所有类型
返回:
ResultSet – 每一行都是一个表描述
抛出:
SQLException – 如果发生数据库访问错误


二、获取表中列信息

getColumns
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException

检索可在指定类别中使用的表列的描述。

仅返回与类别、模式、表和列名称标准匹配的列描述。它们根据 TABLE_SCHEM、TABLE_NAME 和ORDINAL_POSITION 进行排序。

每个列描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
COLUMN_NAME String => 列名称
DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
COLUMN_SIZE int => 列的大小。对于 char 或 date 类型,列的大小是最大字符数,对于 numeric 和 decimal 类型,列的大小就是精度。
BUFFER_LENGTH 未被使用。
DECIMAL_DIGITS int => 小数部分的位数
NUM_PREC_RADIX int => 基数(通常为 10 或 2)
NULLABLE int => 是否允许使用 NULL。
columnNoNulls – 可能不允许使用 NULL 值
columnNullable – 明确允许使用 NULL 值
columnNullableUnknown – 不知道是否可使用 null
REMARKS String => 描述列的注释(可为 null)
COLUMN_DEF String => 默认值(可为 null)
SQL_DATA_TYPE int => 未使用
SQL_DATETIME_SUB int => 未使用
CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数
ORDINAL_POSITION int => 表中的列的索引(从 1 开始)
IS_NULLABLE String => “NO” 表示明确不允许列使用 NULL 值,”YES” 表示可能允许列使用 NULL 值。空字符串表示没人知道是否允许使用 null 值。
SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为null)
参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern – 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern – 表名称模式,因为存储在数据库中,所以它必须匹配表名称
columnNamePattern – 列名称模式,因为存储在数据库中,所以它必须匹配列名称
返回:
ResultSet – 每一行都是一个列描述
抛出:
SQLException – 如果发生数据库访问错误
另请参见:
getSearchStringEscape()


三、表中主键信息

getPrimaryKeys
ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException
检索对给定表的主键列的描述。它们根据 COLUMN_NAME 进行排序。

每个主键列描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
COLUMN_NAME String => 列名称
KEY_SEQ short => 主键中的序列号
PK_NAME String => 主键的名称(可为 null)
参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schema – 模式名称,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为 null 则表示该模式名称不应用于缩小搜索范围
table – 表名称,因为存储在数据库中,所以它必须匹配表名称
返回:
ResultSet – 每一行都是一个主键列描述
抛出:
SQLException – 如果发生数据库访问错误

public static void main(String[] args) {   

        //这里没有指定数据库   
        String url = "jdbc:mysql://127.0.0.1:3306/"; 
        String user = "root"; 
        String pass = ""; 
        try {   

            Class.forName("com.mysql.jdbc.Driver").newInstance(); 
            Connection conn = DriverManager.getConnection(url, user, pass); 
            DatabaseMetaData metadata = conn.getMetaData(); 
            System.out.println("数据库已知的用户: "+ metadata.getUserName()); 
            System.out.println("数据库的系统函数的逗号分隔列表: "+ metadata.getSystemFunctions()); 
            System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ metadata.getTimeDateFunctions()); 
            System.out.println("数据库的字符串函数的逗号分隔列表: "+ metadata.getStringFunctions()); 
            System.out.println("数据库供应商用于 'schema' 的首选术语: "+ metadata.getSchemaTerm()); 
            System.out.println("数据库URL: " + metadata.getURL()); 
            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()); 

            System.out.println(); 
            System.out.println("数据库中使用的表类型"); 
            ResultSet rs = metadata.getTableTypes(); 
            while (rs.next()) {   
                System.out.println(rs.getString(1)); 
            }   
            rs.close(); 

            System.out.println(); 
            /** * 获取指定的数据库的所有表的类型,getTables()的第一个参数就是数据库名 * 因为与MySQL连接时没有指定,这里加上,剩下的参数就可以为null了 * 第二个参数是模式名称的模式,但是输出也是什么都没有。谁知道告诉我一声 */  
            System.out.println("获取指定的数据库的所有表的类型"); 
            ResultSet rs1 = metadata.getTables("ssi2bbs", null, null, null); 
            while (rs1.next()) {   
                System.out.println(); 
                System.out.println("数据库名:"+ rs1.getString(1)); 
                System.out.println("表名: "+rs1.getString(3)); 
                System.out.println("类型: "+rs1.getString(4)); 
            }   
            rs1.close(); 

            System.out.println(); 
            System.out.println("获取指定的数据库的表的主键"); 
            //获取指定的数据库的表的主键,第二个参数也是模式名称的模式,使用null了   
            ResultSet rs2 = metadata.getPrimaryKeys("mysql", null, "db"); 
            while (rs2.next()) {   
                System.out.println("主键名称: "+ rs2.getString(4)); 
            }   
            rs2.close(); 

            System.out.println(); 
            System.out.println("DatabaseMetaData.getIndexInfo()方法返回信息:"); 
            ResultSet rs3 = metadata.getIndexInfo("ssi2bbs", null, "user", false, true); 
            while (rs3.next()) {   
                System.out.println("数据库名: "+ rs3.getString(1)); 
                System.out.println("表模式: "+ rs3.getString(2)); 
                System.out.println("表名称: "+ rs3.getString(3)); 
                System.out.println("索引值是否可以不唯一: "+ rs3.getString(4)); 
                System.out.println("索引类别: "+ rs3.getString(5)); 
                System.out.println("索引名称: "+ rs3.getString(6)); 
                System.out.println("索引类型: "+ rs3.getString(7)); 
                System.out.println("索引中的列序列号: "+ rs3.getString(8)); 
                System.out.println("列名称: "+ rs3.getString(9)); 
                System.out.println("列排序序列: "+ rs3.getString(10)); 
                System.out.println("TYPE为 tableIndexStatistic时它是表中的行数否则它是索引中唯一值的数量: "+ rs3.getString(11)); 
                System.out.println("TYPE为 tableIndexStatisic时它是用于表的页数否则它是用于当前索引的页数: "+ rs3.getString(12)); 
                System.out.println("过滤器条件: "+ rs3.getString(13)); 
            }   
            rs3.close(); 

        } catch (Exception e) {   
            e.printStackTrace(); 
        }   
    }  

ResultSetMetaData接口, 用于获取关于ResultSet 对象中列的类型和属性信息的对象。下面的代码是把一个表的列信息打印了出来。当然了,这只是一部分。详细的参考JAVA JDK。

Java代码
public static void main(String[] args) {   
        try {   
            Class.forName("com.mysql.jdbc.Driver").newInstance(); 
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssi2bbs","root",""); 
            PreparedStatement ps = conn.prepareStatement("select * from bbs"); 
            ResultSet rs = ps.executeQuery(); 
            ResultSetMetaData rsme = rs.getMetaData(); 

            int columnCount = rsme.getColumnCount(); 
            System.out.println("ResultSet对象中的列数"+ columnCount); 
            for (int i = 1; i < columnCount ; i++) { 
                System.out.println(); 
                System.out.println("列名称: "+ rsme.getColumnName(i)); 
                System.out.println("列类型(DB): " + rsme.getColumnTypeName(i)); 
                System.out.println("长度: "+ rsme.getPrecision(i) ); 
                System.out.println("是否自动编号: "+ rsme.isAutoIncrement(i)); 
                System.out.println("是否可以为空: "+ rsme.isNullable(i)); 
                System.out.println("是否可以写入: "+ rsme.isReadOnly(i)); 
            }   

        } catch (Exception e) {   
            e.printStackTrace(); 
        }   

    }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150965.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月19日 上午8:00
下一篇 2022年6月19日 上午8:00


相关推荐

  • 清博舆情系统_什么是舆情

    清博舆情系统_什么是舆情一、引言1.1 编写目的  编写此文档的目的是通过系统的详细设计指导系统的编码等工作。1.2 背景A. 待开发系统的名称:舆情分析系统B. 系统架构类型:BS架构类型,即浏览器、服务器架构类型C.开发项目组名称:东北大学软件学院大数据班T09实训项目组(lzf、lcx)1.3 参考资料系统详细设计说明书模板:https://wenku.baidu.com/view/1ad0617ddd88d0d232d46a21.html《舆情分析系统-软件需求分析说明书.docx》《舆情分

    2026年2月5日
    3
  • sql的日期格式化「建议收藏」

    sql的日期格式化「建议收藏」sql的日期格式化转化1.DATE_FORMAT()函数用于以不同的格式显示日期/时间数据。DATE_FORMAT(date,format)%a 缩写星期名%b 缩写月名%c 月,数值%D 带有英文前缀的月中的天%d 月的天,数值(00-31)%e 月的天,数值(0-31)%f 微秒%H 小时(00-23)%h 小时(01-12)%I 小时(01-12)%i 分钟,数值(00-59)%j 年的天(001-366)%k 小时(0-23)%l 小时(1-12)

    2022年10月7日
    4
  • Tendermint P2P源码分析

    Tendermint P2P源码分析启用 P2P 在 node node go 的 NewNode 里 会发现这样一段代码 setupTranspo 创建 switch sw createSwitch config transport p2pMetrics mpReactorShi bcReactorFor stateSyncRea csReactorShi evReactorShi proxyApp nodeInfo nodeKey p

    2026年3月18日
    3
  • Epel镜像_镜像包

    Epel镜像_镜像包简介EPEL(ExtraPackagesforEnterpriseLinux),是由FedoraSpecialInterestGroup维护的EnterpriseLinux(RHEL、CentOS)中经常用到的包。一.安装清华大学开源软件镜像站的epel镜像,即yum源yuminstallepel-release二.安装阿里的epel镜像,即yum源1.备份(如有配置其他epel源)mv/etc/yum.repos.d/epel.rep..

    2025年7月2日
    5
  • 【SC随笔】Java测试mutator方法的注意点

    【SC随笔】Java测试mutator方法的注意点对于mutator方法,仅仅测试返回值是否符合预期是不完备的,mutator改变了对象,就需要用observor方法观察是否发生了预期改变

    2025年11月4日
    7
  • java sdk 开发,Java SDK使用说明

    java sdk 开发,Java SDK使用说明发起调用物联网平台云端 SDK 为每个 API 封装了一个类 命名为 API 名称 Request 用于 API 的调用请求 物联网平台云端 API 请参见本文以调用 Pub 接口发布消息到 Topic 为例 有关如何设置 request 中请求参数 请参见对应 API 文档 以下示例 请参见注意以下代码中 iotInstanceI 为实例 ID 企业版实例填写实例 ID 公共实例要删除代码 request setIotIns

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号