Java能够操作数据库,当然能够获取到数据库的表结构。
虽然各个DB厂商查询数据库表结构的语句不同,但是Java中通过封装,可以使用共同的API来获取。
各个具体的DB厂商有各自的实现,只需导入相应的包即可。

代码

废话不多说,直接看代码。

public static void main(String[] args) throws Exception {String driver = "com.mysql.cj.jdbc.Driver";String url = "jdbc:mysql://localhost:3306/book_sc?serverTimezone=GMT";String user = "root";String password = "root";printTableStructure(driver, url, user, password);
}/*** 打印所有表结构** @param driver   driver* @param url      url* @param user     user* @param password password* @throws Exception exception*/
private static void printTableStructure(String driver, String url, String user, String password) throws Exception {Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);DatabaseMetaData metaData = connection.getMetaData();// 获取所有表ResultSet tableResultSet = metaData.getTables(null, null, "order%", new String[]{"TABLE"});while (tableResultSet.next()) {String tableName = tableResultSet.getString("TABLE_NAME");System.out.println("table:" + tableName);// 获取表字段结构ResultSet columnResultSet = metaData.getColumns(null, "%", tableName, "%");while (columnResultSet.next()) {// 字段名称String columnName = columnResultSet.getString("COLUMN_NAME");// 数据类型String columnType = columnResultSet.getString("TYPE_NAME");// 字段长度int datasize = columnResultSet.getInt("COLUMN_SIZE");// 小数部分位数int digits = columnResultSet.getInt("DECIMAL_DIGITS");// 是否可为空 1代表可空 0代表不可为空int nullable = columnResultSet.getInt("NULLABLE");// 描述String remarks = columnResultSet.getString("REMARKS");System.out.println(columnName + " " + columnType + " " + datasize + " " + digits + " " + nullable + " " + remarks);}System.out.println("=================================");}
}

说明

DatabaseMetaData的getTable方法可以获取表信息,代码中获取的是 order开头的所有表,打印表名。
其中关于表,可以获得如下信息:

  • 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)

DatabaseMetaData的getColumns方法可以获取表字段信息,代码中分别获取其名称、类型、长度等信息。
其中关于字段,可以获得如下信息:

  • 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 => 列的大小。
  • BUFFER_LENGTH 未被使用。
  • DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
  • 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 => ISO 规则用于确定列是否包括 null。
  • YES — 如果参数可以包括 NULL
  • NO — 如果参数不可以包括 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)
  • IS_AUTOINCREMENT String => 指示此列是否自动增加
  • YES — 如果该列自动增加
  • NO — 如果该列不自动增加
  • 空字符串 — 如果不能确定该列是否是自动增加参数
  • COLUMN_SIZE 列表示给定列的指定列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是 String 表示形式的字符长度(假定允许的最大小数秒组件的精度)。对于二进制数据,这是字节长度。对于 ROWID 数据类型,这是字节长度。对于列大小不适用的数据类型,则返回 Null。

关于上述两个方法的入参,参考如下说明:

  • catalog - 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 “” 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
  • schemaPattern - 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 “” 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
  • tableNamePattern - 表名称模式;它必须与存储在数据库中的表名称匹配
  • columnNamePattern - 列名称模式;它必须与存储在数据库中的列名称匹配

Java获取数据库表结构相关推荐

  1. Java获取数据库表的字段信息,及如何将ResultSet转为json

    为什么80%的码农都做不了架构师?>>>    一.Java获取数据库表的各个字段的相关信息 在某些开发情景中,需要获取数据库中表的各个字段的相关信息,如字段名,字段类型,字段大小等 ...

  2. mysql 一键获取数据库表结构

    作用: 1.获取当前数据库所有的表信息 2.获取当前表结构信息 查询数据库中的表: -- 查询数据库中的表 SELECT * FROM information_schema.`TABLES` wher ...

  3. Java获取数据库表名、字段名、字段类型及注释等信息

    以前有小伙伴在公众号留言问过如何通过java获取数据库的所有表.及表里字段的信息,只是私信回复过. 在最近的项目中架构部提出了一个数据源的配置需求,就是需要配置公司所有系统的数据库.表等信息,便于大数 ...

  4. Java实现数据库表结构导出到Excel

    2019独角兽企业重金招聘Python工程师标准>>> 本人自己写的一个工具,界面化,稍微配置即可数据库中的表的结构导出到Excel. 源码地址数据库表结构导出到Excel一键式工具 ...

  5. java 获取oracle表结构_Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解 发布于 2020-7-20| 复制链接 摘记:  Java导出oracle表结构实例详解最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个. ...

  6. java修改数据库表结构_数据库设计(一):设计传统系统表结构(Java开发)

    以下文章来源于微信公众号 程序编程之旅 ,作者陈浩翔 此处仅供本人学习记录之用,侵删 本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. ...

  7. java获取mysql表结构

    获取表结构与字段信息: package com.mysql; import java.sql.Connection; import java.sql.DatabaseMetaData; import ...

  8. java 获取oracle表结构_获取Oracle中所有表的列表?

    回答(19) 2 years ago 我们可以从以下查询获取所有表格,包括列详细信息: SELECT * FROM user_tab_columns; 2 years ago 使用sqlplus更好地 ...

  9. 通过java查询数据库表结构

    public static void getConnAndTableStruct() {Connection connection = null;PreparedStatement pstmt = n ...

最新文章

  1. linux debian ntp,Debian下面的ntp服务(ntpdate)的安装
  2. 敲诈英伟达的竟然是一群未成年???
  3. docker部署nginx并且挂载文件夹和文件
  4. navicat premium 链接postgresql 无法加载表_POSTGRESQL 数据库结构体系 ||| 东来西去 三个角度看...
  5. Excel 2007 的重大bug
  6. Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
  7. NAR | 陈加余/陈亮合作建立R-loop全基因组分布与调控的专家数据库
  8. xshell连接kali时vim无法粘贴解决方法
  9. Eclipse的Ctrl+Shift+R中过滤文件类型
  10. vlan绑定_【实操】多VLAN间通信
  11. java面试题:数组的常用算法实现
  12. mysql局域网搭建_局域网中搭建共享MySQL数据库
  13. 软考软件设计师下午真题-面向对象的程序设计与实现-享元设计模式(2021年下半年试题六))Java代码讲解
  14. FlashFXP v4.4.2.2019 绿色版
  15. swagger ui 怎么输入对象_java swagger ui 添加header请求头参数的方法
  16. python+pyecharts画地图
  17. VBA基础函数:取数组最大下标——UBound函数
  18. 2016年中考计算机考试模拟试题,2016年计算机三级考试模拟试题(含答案)
  19. 可以计算亲戚关系的超级计算器!
  20. 调用librosa.load() 显示audioread.NoBackendError

热门文章

  1. 【暴料】医学院校的搞笑标语~~
  2. 区分曼彻斯特和差分曼彻斯特编码
  3. 【总结】关于js变量提升
  4. PaddleServing图像语义分割部署实践
  5. 学习总结:springboot 的启动类Starters的理解
  6. iPhone、iPad 应用中潜藏的功能强大的 SFTP 工具(nplayer plus)
  7. Android OpenCV 3D图片智能识别
  8. Dropzone和vue2+Dropzone
  9. Multicoin Capital合伙人:Loot与元宇宙无关,它可能是更好的DAO
  10. unity工程统一管理Pico和oculus项目