DatabaseMetaData:描述数据库的元数据对象

获取所有数据库

  1. import org.junit.jupiter.api.AfterEach;
  2. import org.junit.jupiter.api.BeforeEach;
  3. import org.junit.jupiter.api.Test;
  4.  
  5. import java.io.InputStream;
  6. import java.sql.*;
  7. import java.util.Properties;
  8.  
  9. public class MetaDataTest {
  10.  
  11. private Connection conn;
  12.  
  13. @BeforeEach
  14. public void start() throws Exception {
  15. Properties properties = new Properties();
  16. InputStream in = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
  17. properties.load(in);
  18.  
  19. String driver = properties.getProperty("driver");
  20. String jdbcUrl = properties.getProperty("jdbcUrl");
  21. String user = properties.getProperty("user");
  22. String password = properties.getProperty("password");
  23.  
  24. Class.forName(driver);
  25.  
  26. conn = DriverManager.getConnection(jdbcUrl, user, password);
  27. }
  28.  
  29. @AfterEach
  30. public void end() throws Exception {
  31. if (conn != null) {
  32. conn.close();
  33. }
  34. }
  35.  
  36. @Test
  37. public void testGetDatabases(){
  38. try {
  39. DatabaseMetaData metaData = conn.getMetaData();
  40. ResultSet resultSet = metaData.getCatalogs();
  41. while (resultSet.next()) {
  42. System.out.println(resultSet.getString("TABLE_CAT"));
  43. }
  44. } catch (SQLException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }

获取指定数据库的所有表

  1. @Test
  2. public void testGetTables() {
  3. try {
  4. DatabaseMetaData metaData = conn.getMetaData();
  5. /**
  6. * "%" 表示任意
  7. * catalog - 数据库名称;为 null 表示所有
  8. * schemaPattern - 模式名称;为 null 表示所有
  9. * tableNamePattern - 表名称
  10. * types - 表类型,"TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"; null 表示返回所有类型
  11. */
  12. ResultSet tablesRS = metaData.getTables("hibernate", "%", "%", new String[]{"TABLE", "VIEW"});
  13. while (tablesRS.next()) {
  14. /**
  15. * TABLE_CAT String => 表类别(可为 null)
  16. * TABLE_SCHEM String => 表模式(可为 null)
  17. * TABLE_NAME String => 表名称
  18. * TABLE_TYPE String => 表类型。典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。
  19. * REMARKS String => 表的解释性注释
  20. * TYPE_CAT String => 类型的类别(可为 null)
  21. * TYPE_SCHEM String => 类型模式(可为 null)
  22. * TYPE_NAME String => 类型名称(可为 null)
  23. * SELF_REFERENCING_COL_NAME String => 有类型表的指定 "identifier" 列的名称(可为 null)
  24. * REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 "SYSTEM"、"USER" 和 "DERIVED"。(可能为 null)
  25. */
  26. System.out.println(tablesRS.getString("TABLE_NAME") + "," + tablesRS.getString("TABLE_TYPE"));
  27. }
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }

获取指定表的所有字段

  1. @Test
  2. public void testGetColumns() {
  3. try {
  4. DatabaseMetaData metaData = conn.getMetaData();
  5. /**
  6. * "%" 表示任意
  7. * catalog - 数据库名称;为 null 则表示该类别名称不应该用于缩小搜索范围
  8. * schemaPattern - 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 "" 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
  9. * tableNamePattern - 表名称
  10. * columnNamePattern - 列名称
  11. */
  12. ResultSet columnsRS = metaData.getColumns("hibernate", null, "%", null);
  13. while (columnsRS.next()) {
  14. /**
  15. * TABLE_CAT String => 表类别(可为 null)
  16. * TABLE_SCHEM String => 表模式(可为 null)
  17. * TABLE_NAME String => 表名称
  18. * COLUMN_NAME String => 列名称
  19. * DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
  20. * TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
  21. *
  22. * COLUMN_SIZE int => 列的大小。
  23. * * COLUMN_SIZE 列表示给定列的指定列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是 String 表示形式的字符长度(假定允许的最大小数秒组件的精度)。
  24. * * 对于二进制数据,这是字节长度。对于 ROWID 数据类型,这是字节长度。对于列大小不适用的数据类型,则返回 Null。
  25. *
  26. * BUFFER_LENGTH 未被使用。
  27. * DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
  28. * NUM_PREC_RADIX int => 基数(通常为 10 或 2)
  29. *
  30. * NULLABLE int => 是否允许使用 NULL。
  31. * * columnNoNulls - 可能不允许使用 NULL 值
  32. * * columnNullable - 明确允许使用 NULL 值
  33. * * columnNullableUnknown - 不知道是否可使用 null
  34. *
  35. * REMARKS String => 描述列的注释(可为 null)
  36. * COLUMN_DEF String => 该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null)
  37. * SQL_DATA_TYPE int => 未使用
  38. * SQL_DATETIME_SUB int => 未使用
  39. * CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数
  40. * ORDINAL_POSITION int => 表中的列的索引(从 1 开始)
  41. *
  42. * IS_NULLABLE String => ISO 规则用于确定列是否包括 null。
  43. * * YES --- 如果参数可以包括 NULL
  44. * * NO --- 如果参数不可以包括 NULL
  45. * * 空字符串 --- 如果不知道参数是否可以包括 null
  46. *
  47. * SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  48. * SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  49. * SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  50. * SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
  51. *
  52. * IS_AUTOINCREMENT String => 指示此列是否自动增加
  53. * * YES --- 如果该列自动增加
  54. * * NO --- 如果该列不自动增加
  55. * * 空字符串 --- 如果不能确定该列是否是自动增加参数
  56. */
  57. System.out.println(columnsRS.getString("COLUMN_NAME") + "," + columnsRS.getString("TYPE_NAME")
  58. + "," + columnsRS.getString("COLUMN_SIZE")
  59. );
  60. }
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. }

获取指定表的主键

  1. @Test
  2. public void testGetPrimaryKeys() {
  3. try {
  4. DatabaseMetaData metaData = conn.getMetaData();
  5. /**
  6. * "%" 表示任意
  7. * catalog - 数据库名称;为 null 则表示该类别名称不应该用于缩小搜索范围
  8. * schema - 模式名称;它必须与存储在数据库中的模式名称匹配;该参数为 "" 表示获取没有模式的那 些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
  9. * table - 表名称
  10. */
  11. ResultSet primaryKeysRS = metaData.getPrimaryKeys("hibernate", "%", "NEWS");
  12. while (primaryKeysRS.next()) {
  13. /**
  14. * TABLE_CAT String => 表类别(可为 null)
  15. * TABLE_SCHEM String => 表模式(可为 null)
  16. * TABLE_NAME String => 表名称
  17. * COLUMN_NAME String => 列名称
  18. * KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)
  19. * PK_NAME String => 主键的名称(可为 null)
  20. */
  21. System.out.println(primaryKeysRS.getString("COLUMN_NAME") + "," + primaryKeysRS.getString("PK_NAME"));
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }

获取指定表的外键

  1. @Test
  2. public void testGetExportedKeys() {
  3. try {
  4. DatabaseMetaData metaData = conn.getMetaData();
  5. /**
  6. * "%" 表示任意
  7. * catalog - 数据库名称;为 null 则表示该类别名称不应该用于缩小搜索范围
  8. * schema - 模式名称;它必须与存储在数据库中的模式名称匹配;该参数为 "" 表示获取没有模式的那 些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
  9. * table - 表名称
  10. */
  11. ResultSet exportedKeysRS = metaData.getExportedKeys("hibernate", "%", "NEWS");
  12. while (exportedKeysRS.next()) {
  13. /**
  14. * PKTABLE_CAT String => 主键表类别(可为 null)
  15. * PKTABLE_SCHEM String => 主键表模式(可为 null)
  16. * PKTABLE_NAME String => 主键表名称
  17. * PKCOLUMN_NAME String => 主键列名称
  18. * FKTABLE_CAT String => 被导入的外键表类别(可能为 null),该字符串可能为 null
  19. * FKTABLE_SCHEM String => 被导入的外键表模式(可能为 null),该字符串可能为 null
  20. * FKTABLE_NAME String => 被导入的外键表名称
  21. * FKCOLUMN_NAME String => 被导入的外键列名称
  22. * KEY_SEQ short => 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)。
  23. *
  24. * UPDATE_RULE short => 更新主键时外键发生的变化:
  25. * * importedNoAction - 如果已经导入,则不允许更新主键
  26. * * importedKeyCascade - 将导入的键更改为与主键更新一致
  27. * * importedKeySetNull - 如果已更新导入键的主键,则将导入键更改为 NULL
  28. * * importedKeySetDefault - 如果已更新导入键的主键,则将导入键更改为默认值
  29. * * importedKeyRestrict - 与 importedKeyNoAction 相同(为了与 ODBC 2.x 兼容)
  30. *
  31. * DELETE_RULE short => 删除主键时外键发生的变化。
  32. * * importedKeyNoAction - 如果已经导入,则不允许删除主键
  33. * * importedKeyCascade - 删除导入删除键的行
  34. * * importedKeySetNull - 如果已删除导入键的主键,则将导入键更改为 NULL
  35. * * importedKeyRestrict - 与 importedKeyNoAction 相同(为了与 ODBC 2.x 兼容)
  36. * * importedKeySetDefault - 如果已删除导入键的主键,则将导入键更改为默认值
  37. *
  38. * FK_NAME String => 外键的名称(可为 null)
  39. * PK_NAME String => 主键的名称(可为 null)
  40. *
  41. * DEFERRABILITY short => 是否可以将对外键约束的评估延迟到提交时间
  42. * * importedKeyInitiallyDeferred - 有关定义,请参见 SQL92
  43. * * importedKeyInitiallyImmediate - 有关定义,请参见 SQL92
  44. * * importedKeyNotDeferrable - 有关定义,请参见 SQL92
  45. */
  46. System.out.println(exportedKeysRS.getString("FKTABLE_NAME") + "," + exportedKeysRS.getString("FKCOLUMN_NAME"));
  47. }
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }

获取数据库信息

  1. @Test
  2. public void testDatabaseMetaData() {
  3. ResultSet resultSet = null;
  4. try {
  5. DatabaseMetaData data = conn.getMetaData();
  6. // 数据库版本号
  7. System.out.println(data.getDatabaseProductVersion());
  8. // 数据库驱动版本号
  9. System.out.println(data.getDriverVersion());
  10. // 数据库驱动名称
  11. System.out.println(data.getDriverName());
  12. // 连接到数据库的用户名
  13. System.out.println(data.getUserName());
  14. // 是否支持事务
  15. System.out.println(data.supportsTransactions());
  16. // 连接地址
  17. System.out.println(data.getURL());
  18. // 是否处于只读模式
  19. System.out.println(data.isReadOnly());
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }

ResultSetMetaData:描述结果集的元数据

  1. @Test
  2. public void testResultSetMetaData() {
  3. PreparedStatement preparedStatement = null;
  4. ResultSet resultSet = null;
  5. try {
  6. String sql = "SELECT * FROM user";
  7. preparedStatement = conn.prepareStatement(sql);
  8. resultSet = preparedStatement.executeQuery();
  9. ResultSetMetaData rsmd = resultSet.getMetaData();
  10. // 得到列的个数
  11. int columnCount = rsmd.getColumnCount();
  12. System.out.println(columnCount);
  13. for (int i = 0; i < columnCount; i++) {
  14. // 得到列名
  15. String columnName = rsmd.getColumnName(i + 1);
  16. // 列的别名
  17. String columnLabel = rsmd.getColumnLabel(i + 1);
  18. // 列的类型
  19. String columnType = rsmd.getColumnTypeName(i + 1);
  20. System.out.println(columnName + ", " + columnLabel + ", " + columnType);
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }

5、JDBC-元信息的更多相关文章

  1. 在脚本中刷新impala元信息

    刷新impala元信息 impala-shell -q 'invalidate metadata' -i hslave1 impala-shell -q 'select count(*) from p ...

  2. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  3. 【SVN】手动删除svn元信息

    工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...

  4. 六、Html头部和元信息

    前面整理的都是html常用到的标签,这里整理一下html的的头部和元信息标签. 定义html都的头部要写在<head>标签里面,一般他还包含如下一些标签: 1,<script> ...

  5. VueJs(12)---vue-router(导航守卫,路由元信息)

    vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...

  6. vue 路由元信息

    官方文档:路由meta元信息 前言: 在设置面包屑导航还有菜单栏的时候,路由的meta字段可以自定义我们需要的信息,然后路由跳转的时候,提供我们判断条件 文档: 定义路由的时候可以配置 meta 字段 ...

  7. 30)django-ORM(元信息,级联删除,正反向操作,连表查询优化)

    一:元信息 class User(models.Model): name=models.CharField(max_length,index=True) email=model.CharField(m ...

  8. 1. 元信息:Meta类 2. 基于对象查询的sql优化 3. 自定义:Group_Concat() 4. ajax前后台交互

    一.元信息 ''' 1. 元信息 1. Model类可以通过元信息类设置索引和排序信息 2. 元信息是在Model类中定义一个Meta子类 class Meta: # 自定义表名 db_table = ...

  9. vue-router路由元信息详解

    一.官方文档 路由元信息:定义路由的时候可以配置 meta 字段 const router = new VueRouter({ routes: [ { path: '/foo', component: ...

  10. HTML学习日记之元信息meta标记

    所谓meta标记就是用来描述一个HTML网页文档的属性,也称为元信息,这些信息并不会显示在浏览器的页面中,例如作者.日期和时间.网页描述.页面刷新等. 基本语法: <meta name = &q ...

随机推荐

  1. tensorflow win10 系统下安装

    安装tensorflow gpu版本 Step1 安装CUDA8.0 进入这个云盘地址下载,密码5aoc 进行CUDA8.0下载.下载完成后解压,打开exe文件直接按照默认进行安装,安装步骤比较繁琐, ...

  2. java mail session使用Properties的clone方法

    /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreem ...

  3. Activiti的BPMN演示工具

    场景是这样的:产品经理不懂技术,又不想安装Java以及Eclipse(需要安装Activiti BPMN Designer的插件). 这两天解决.bpmn的解析(BPMNParser)时顺带找到一个顺 ...

  4. [转帖]GitHub上整理的一些工具

    GitHub上整理的一些工具   技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 inf ...

  5. PDB自动启动以及Oracle Pfile的参数修改示范

    1. Oracle12c 可以使用PDB的模式进行创建, 但是他一般不会自动启动,所以可以穿件一个触发器进行处理 创建语句 CREATE TRIGGER open_all_pdbs AFTER STA ...

  6. js screen

    windows.screen對象包含包含對象屏幕的信息: screen.availheight;屏幕高度 screen.availwidth;屏幕寬度

  7. selenium之下载

    # 测试下载功能,保存文件到指定的目录 # 不同的浏览器配置是不同的,本例使用chrome浏览器 # author:gongxr # date:2017-07-25 import time from ...

  8. codeforces624A

    Save Luke CodeForces - 624A Luke Skywalker got locked up in a rubbish shredder between two presses. ...

  9. Spring的编程式事务和声明式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务管理的两种方式 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务使用Transa ...

  10. MT【10】和三次有关的一个因式分解

    解答: 评:1此处因式分解也可以看成关于$a$的函数$f(a)$利用多项式有理根的有关知识得到 2.此处我们可以得到关于$\Delta ABC$的余弦的一个不等式$cosA+cosB+cosC> ...