【源码学习】JAVA使用JDBC获取元数据的过程

本文详细介绍了如何使用JDBC连接MySQL获取数据库的元数据,包括获取表结构(如用户表和地址表)、字段信息,并展示了示例代码。重点在于JDBC获取元数据的原理和实际操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

JAVA在平时连接关系型数据库的时候,一般都是使用JDBC的方式连接的,但是怎么获取到库表结构你真的懂了吗?
在这里插入图片描述


JDBC是什么?

JDBC全称叫Java DataBase Connectivity),可以理解为是一种执行SQL语句的JAVA API。主要用来对常用的数据库系统连接交互。

API主要由以下组成

  • Drive——驱动程序(用来连接什么数据库)
  • Connection——数据库连接对象
  • Statement——陈述(SQL做什么)
  • ResultSet——结果集(执行SQL的结果)

在这里插入图片描述


获取数据库元数据:

数据库元数据DatabaseMetaData是数据库的基础组成数据:例如:mysql一个数据库是由catalog(schema)=> table(表) => column(字段)组成,所以可以从元数据获取到这些信息;

数据库结构:

在这里插入图片描述

数据库表结构:

user表结构如下:

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` bigint NOT NULL COMMENT '租户ID',
  `name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `operator_id` bigint NOT NULL COMMENT '操作人ID',
  `create_time` timestamp NOT NULL COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_flag` int NOT NULL DEFAULT '0' COMMENT '是否删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

USER_ADDR地址表结构如下

CREATE TABLE `USER_ADDR` (
  `id` bigint NOT NULL COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT 'user.id',
  `name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

示例代码:

public class MysqlTestMain {
    private final static String url = "jdbc:mysql://localhost:3306/liang";
    private final static String userName = "root";
    private final static String password = "123456";

    public static void main(String[] args) {
        try (Connection con = DriverManager.getConnection(url, userName, password)) {
            DatabaseMetaData databaseMetaData = con.getMetaData();

            String catalog = con.getCatalog();
            System.out.println("数据库catalog" + catalog);

            System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
            ResultSet metaDataTables = databaseMetaData.getTables(catalog, null, null, null);
            while (metaDataTables.next()) {
                String tableName = metaDataTables.getString(3);
                System.out.println(" + 表名: " + tableName);
                System.out.println(" + 表备注: " + metaDataTables.getString(5));

                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
                ResultSet columns = databaseMetaData.getColumns(catalog, null, tableName, null);
                while (columns.next()) {
                    String columnName = columns.getString(4);
                    System.out.println(" ++ 字段名" + columnName);
                    System.out.println(" ++ 数据类型" + StringUtils.toLowerCase(columns.getString(6)));
                    System.out.println(" ++ 字段备注 " + columns.getString(12));
                    System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

数据库catalogliang
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 + 表名: USER_ADDR
 + 表备注: 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名id
 ++ 数据类型bigint
 ++ 字段备注 主键ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名user_id
 ++ 数据类型bigint
 ++ 字段备注 user.id
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名name
 ++ 数据类型varchar
 ++ 字段备注 地址名称
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 + 表名: user
 + 表备注: 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名id
 ++ 数据类型bigint
 ++ 字段备注 主键ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名tenant_id
 ++ 数据类型bigint
 ++ 字段备注 租户ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名name
 ++ 数据类型varchar
 ++ 字段备注 姓名
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名operator_id
 ++ 数据类型bigint
 ++ 字段备注 操作人ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名create_time
 ++ 数据类型timestamp
 ++ 字段备注 创建时间
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名update_time
 ++ 数据类型timestamp
 ++ 字段备注 更新时间
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ++ 字段名delete_flag
 ++ 数据类型int
 ++ 字段备注 是否删除
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

获取元数据成功


分析源码:

提示:JDBC获取元数据只是JDBC实现针对不同数据库厂商实现的不同方法:其实就是执行SQL获取元数据

在上文示例中,JDBC连接MYSQL通过information_schema数据库下的schema、table、column表存储了所有的库表字段信息。MYSQL特别的是认为catalog和schema是等价的

获取数据库目录

SHOW schemas;

在这里插入图片描述

获取表分析

SHOW tables;

在这里插入图片描述
在这里插入图片描述

获取字段信息

SHOW columns;

在这里插入图片描述
在这里插入图片描述

总结

不同数据库对应的JDBC实现也不一样,获取元数据的实现也不一样,最好是分析一下执行的SQL是否能满足自己需求再决定使用。如有不对。欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿福

看明白的同学,别忘请阿福喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值