Spring boot项目中DatabaseMetaData方式获取表字段信息

article/2025/11/10 20:17:59

日常工作中我们可能会遇到一些配置化的功能,比如我们需要根据元数据项动态生成一些模板,比如表格,excel等,这些都需要我获取到数据库表中字段长度、类型、格式等信息。下面就以一个小白的身份和大家分享下自己的实现过程。

背景

​ 项目为spring boot 微服务项目,数据库信息在yml文件中配置,实现方式采用JDBC中的DatabaseMetaData的方式。

介绍

​ 在我们一开始学习JAVA的时候,第一次连接数据库的时候都是JDBC的方式进行连接,具体代码我就不写了,现在也同样采用Connection的方式,代码如下:

@RestController
public class DataMetaController {@Autowiredprivate DataSourceProperties dataSourceProperties;@GetMapping("test")public  void  getColumns() throws SQLException, ClassNotFoundException {Connection conn = DriverManager.getConnection(dataSourceProperties.getUrl(),dataSourceProperties.getUsername(),dataSourceProperties.getPassword());DatabaseMetaData metaData = conn.getMetaData();ResultSet rs = metaData.getColumns(conn.getCatalog(), dataSourceProperties.getUsername(), "表名","%");while(rs.next()) {System.out.println("COLUMN_NAME :"+rs.getString("COLUMN_NAME"));}}
}

在使用的时候建议都用大写,屏蔽mysql和Oracle直接的差异

对于以上代码,我解释一下我在写下代码之前不太了解的几个点:

1.关于DriverManager为何不用执行Class.forName了,百度学习了下 https://www.cnblogs.com/w-wfy/p/6180865.html,总结就是在jdbc4中,调用getConnection的时候DriverManager会自动去加载合适的驱动。

2.一般网上的参考样例告诉我们调用getConnection时直接在程序中写驱动连接的信息,但有些时候我们的配置文件都是加密的,那我要是明文写在了程序里,就失去了价值,所以我用到了DataSourceProperties这个类读取我们的配置信息,

在这里插入图片描述

3.当我们使用 Connection 中getMetaData获取元数据信息时,在调用getColumns方法时,为什么有人写的是%,我跟踪了下代码发现如下代码,
在这里插入图片描述

也就是说,我们没有具体指定具体查询某一个字段时,默认全量查询,有兴趣的可以看下具体实现的逻辑,(oracle.jdbc.driver包下的getColumns方法,本人就大概从头到尾瞟了下),核心sql语句如下:

SELECT a.*
FROMall_tab_columns a
WHEREOWNER = '用户名' and TABLE_NAME = '表名'

最后详细说下getColumns方法

方法参数:

参数说明
catalog(数据库名称)直接使用Connection的实例对象中的getCatalog()方法返回值填充就好
schemaPattern(模式)Oracle中登陆名必须是大写,不然的话是无法获取到相应的数据,也可以使用DataSourceProperties中getUsername()直接填充
tableNamePattern(表名)要查找的表名
columnNamePattern(列名)填写要查找的列名,填写具体名称,获取填写 null 或 % ,默认全查

返回值(只看了几个常用的,其他可以参考网上资料):

名称类型说明
TABLE_NAMEString表名
COLUMN_NAMEString列名
DATA_TYPEint类型码值,对应 java.sql.Types 的 SQL 类型
TYPE_NAMEString类型名称,例如Oracle:VARCHAR2,NUMBER等
COLUMN_SIZEString列的大小
DECIMAL_DIGITSint小数部分位数,不适用的类型会返回null
NULLABLEint是否允许使用null
REMARKSString建表时的注释信息,Oracle中comment的信息
COLUMN_DEFString默认值
IS_AUTOINCREMENTString是否自增
ORDINAL_POSITIONint表中的列的索引(从 1 开始)

备注:

​ 此次自己只在Oracle11 进行了测试,MySQL是在之前项目中使用过,目前未发现什么问题,如有些的错误的地方还请大佬们指出


http://chatgpt.dhexx.cn/article/wj83NDOY.shtml

相关文章

Java中DataBaseMetaData与ResultMetaData基本使用

java中的DataBaseMetaData与ResultMetaData使用: DataBaseMetaData 类对象通过Connection类对象获取 1, 获取数据库的url 2, 获取用户名 3, 获取有哪些数据库 package com.xzq.jdbc;import com.xzq.dbutils.DbUitl;import java.s…

DatabaseMetaData.getIndexInfo

示例 通过 DatabaseMetaData.getIndexInfo() 获取索引信息。 public static void getIndexInfo() throws Exception {Connection conn getConnection();ResultSet rs null;try {DatabaseMetaData dbmd conn.getMetaData();rs dbmd.getIndexInfo(&q…

数据库元数据 DatabaseMetaData

一、元数据介绍 (数据库元数据 DatabaseMetaData) 数据库元数据指的是"数据库的定义信息。 DataBaseMetaData元数据获取方式 通过Connection.getDatabaseMetaData()方法获得代表DatabaseMetaData元数据的DatabaseMetaData对象。DataBaseMetaData…

DatabaseMetaData类的getTable()、getColumns()方法使用,以及参数的传递问题,针对oracle、mysql、postgres三种数据库进行举例

DatabaseMetaData类 DatabaseMetaData实例的获取获取数据库属性的方法getTable()方法getColumns()方法关于参数一参数二传参问题 DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等很多信息。如: 1、数据库与用户&a…

数据库之元数据——DatabaseMetaData的getMetaData()方法的简单使用

DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文讲解DatabaseMetaData和ResultSetMetaData接口获取元数据的方法。 package com;import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverMa…

DatabaseMetaData的简单使用

在看大佬写的一个导出数据库建标脚本的接口的时候,发现频频用到DataBaseMetaData这个类,之前也没有 用过这个类下的API,记录一下心得用法。 DatabaseMetaData是java.sql包中的接口,利用它可以获取我们连接到的数据库的结构、存储等…

DatabaseMetaData类

DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等很多信息。如: 1、数据库与用户,数据库标识符以及函数与存储过程。 2、数据库限制。 3、数据库支持不支持的功能。 4、架构、…

数据库之-元数据 DatabaseMetaData 初学

DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文讲解DatabaseMetaData和ResultSetMetaData接口获取元数据的方法。 获取数据库的所有表:(以MySQL和Oracle为例,其他类型的数据库接触不过,…

php备忘录模式

CleverCode最近在看备忘录模式。 1 模式介绍 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 2 模式中的角色 1.Originator(发起人):负责创建一个备忘录Memento&…

设计模式 — 行为型模式 — 备忘录模式

目录 文章目录 目录备忘录模式应用场景代码示例 备忘录模式 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 简单来说,就是在运行过程中我们…

“备忘录模式”就这么简单

备忘录模式的官方定义: 在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之外保存这些状态。这样以后就可以通过该对象恢复到原先保存的状态。 大白话说: 一个对象中一般都封装了很多属性,这些属性的值会随…

(18)备忘录模式

 (18)备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态 类型:行为类 类图: 我们…

Java设计模式-备忘录模式、备忘录模式应用场景是什么、又怎么使用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 6.11 备忘录模式 6.11.1 定义 又称快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存此状态&am…

C++设计模式(17)——备忘录模式

亦称: 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外, 编辑器中还要有设置文本格…

Java备忘录模式(Memento)

本文我们来介绍下java23种设计模式中的备忘录模式。 备忘录模式Memento 使用场景 录入大批人员资料。正在录入当前人资料时,发现上一个人录错了, 此时需要恢复上一个人的资料,再进行修改。Word文档编辑时,忽然电脑死机或断电&a…

Java设计模式之备忘录模式

Java设计模式之备忘录模式 1. 备忘录模式概述1.1 备忘录模式简介1.2 备忘录模式类图1.3 备忘录模式的注意事项和细节 2. 备忘录模式实现2.1 项目说明2.2 项目实现 1. 备忘录模式概述 1.1 备忘录模式简介 1.备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的…

【设计模式】备忘录模式

设计模式总结链接 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。   备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住&#xff…

23种设计模式——备忘录模式

目录 备忘录模式(Memento) UML图 示例代码 适用场景 优缺点 备忘录模式和原型模式 例子——游戏进度存档 例子——象棋中的悔棋 备忘录模式(Memento) 本质:保存和恢复内部状态 备忘录模式:在不破坏…

23种设计模式之---备忘录模式

前言 网上搜索备忘录设计模式,基本上均是在一个GoF,基础上衍生下来的。为了避免重复造轮子,这里会结合网上demo,和自己理解进行总结 定义:备忘录(Memento)模式又称标记(Token&…

备忘录模式介绍

备忘录模式介绍 一、基本介绍二、代码实现三、UML类图四、备忘录模式小结其他设计模式 一、基本介绍 备忘录模式(Memento Pattern)属于行为型模式,是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外…