文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/

在某项目中用到了 hibernate ,大家都知道 hibernate 是 ORM 框架,他是有能力根据实体生成数据库表的。我们在单元测试的时候用到了 dbUnit ,dbUnit 可以帮助我们在测试前把数据库的测试数据准备好,然后我们就利用现成的数据库环境测试,测试完成后需将数据库中的所有数据清除(为了不影响其他的单元测试),然后接着下一个测试。虽然已经有快一年多没更新了,dbUnit 整体使用还是不错的,但在清除数据的时候dbUnit 就似乎有些力不从心了。当表有自关联(表中有外键引用自己)的时候就有问题了,因为外键约束,数据总是不能清除。

dbUnit 不给力,那咱们自己可就要给力啊。学过 java 的人,应该也都学过 jdbc,jdbc 不仅可以操作数据库,还可以获取数据库中的 元(meta)信息,比如数据库中有哪些表,表中有哪些列等等。

我们要使用的核心类是 java.sql.DatabaseMetaData ,可以通过 java.sql.Connection#getMetaData() 来获得。

Java代码  

Connection conn = ...;

DatabaseMetaData dbMetaData = conn.getMetaData();

获取所有表

Java代码  

String catalog = conn.getCatalog(); //catalog 其实也就是数据库名

ResultSet tablesResultSet = dbMetaData.getTables(catalog,null,null,new String[]{"TABLE"});

while(tablesResultSet.next()){

String tableName = tablesResultSet.getString("TABLE_NAME");

}

tablesResultSet 中有以下列:

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)

获取某个表的主键

Java代码  

String tableName = ...;

ResultSet primaryKeyResultSet = dbMetaData.getPrimaryKeys(catalog,null,tableName);

while(primaryKeyResultSet.next()){

String primaryKeyColumnName = primaryKeyResultSet.getString("COLUMN_NAME");

}

primayKeyResultSet 有以下几列:

TABLE_CAT String => 表类别(可为 null)

TABLE_SCHEM String => 表模式(可为 null)

TABLE_NAME String => 表名称

COLUMN_NAME String => 列名称

KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。

PK_NAME String => 主键的名称(可为 null)

获取某个表的外键

Java代码  

ResultSet foreignKeyResultSet = dbMetaData.getImportedKeys(catalog,null,tableName);

while(foreignKeyResultSet.next()){

String fkColumnName = foreignKeyResultSet.getString("FKCOLUMN_NAM");

String pkTablenName = foreignKeyResultSet.getString("PKTABLE_NAME");

String pkColumnName = foreignKeyResultSet.getString("PKCOLUMN_NAME");

}

foreignKeyResultSet 有以下几列:

PKTABLE_CAT String => 被导入的主键表类别(可为 null)

PKTABLE_SCHEM String => 被导入的主键表模式(可为 null)

PKTABLE_NAME String => 被导入的主键表名称

PKCOLUMN_NAME String => 被导入的主键列名称

FKTABLE_CAT String => 外键表类别(可为 null)

FKTABLE_SCHEM String => 外键表模式(可为 null)

FKTABLE_NAME String => 外键表名称

FKCOLUMN_NAME String => 外键列名称

KEY_SEQ short => 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)

UPDATE_RULE short => 更新主键时外键发生的变化

DELETE_RULE short => 删除主键时外键发生的变化

PK_NAME String => 主键的名称(可为 null)

FK_NAME String => 外键的名称(可为 null)

DEFERRABILITY short => 是否可以将对外键约束的评估延迟到提交时间

关键的技术问题已经解决,接下来就该具体实施了。删除数据库中没有所以表中的数据,我想了一个简单粗暴的方法,就是0.先把所有表中的外键删除 1.删除表中的所有数据 2.把外键再加回去。

java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键相关推荐

  1. mysql数据库特征_如何掌握MySQL数据库中动态表的特征

    以下的文章主要介绍的是如何正确掌握MySQL数据库中动态表的特征,可以说动态表在MySQL数据库中使用频率还是很大的,所以MySQL数据库中动态表的掌握也是一件很重要的事情,以下就是文章的具体内容. ...

  2. access导出MySQL表格_将ACCESS 的数据库中的表的文件 导出了EXCEL格式

    '''' '将ACCESS数据库中的某个表的信息 导出为EXCEL 文件格式 'srcfName ACCESS 数据库文件路径 'desfName excel 文件路径 Public Function ...

  3. 查看mysql单个表大小限制_查看单个mysql数据库中各个表的大小

    SQL命令为: SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS,concat(round((DATA_LENGTH+INDEX_LENGTH ...

  4. wordPress数据结构 数据库中的表、字段、类型及说明

    wordPress数据结构 数据库中的表.字段.类型及说明 WordPress数据库中的表.字段.类型及说明 wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: wp_c ...

  5. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  6. server sql 数据总行数_SqlServer中获取数据库中每个表的行数

    CREATE TABLE #RowCounts(NumberOfRows BIGINT,TableName VARCHAR(128)) EXEC sp_MSForEachTable 'INSERT I ...

  7. 如何使用TSQL获取数据库中所有表的列表?

    在SQL Server上的特定数据库中获取所有表名的最佳方法是什么? #1楼 select * from sys.tables; 要么 SELECT * FROM INFORMATION_SCHEMA ...

  8. 广州大学数据库实验报告_广州大学学生Access数据库实验1_表的创建和操作

    学院 工商管理 年级.专 业.班 人力 152 姓名 学号 实验课程名称 数据库技术及应用 II 成绩 优 实验项目名称 表的创建和操作 指导 老师 一.实验目的 1. 掌握 Access 2007 ...

  9. jdbc获取数据库元数据,获取数据库列表,获取数据库基本信息,获取指定数据库中的表信息,获取指定表中的字段信息

    jdbc获取数据库元数据 package cn.itcast.metadata.test;import org.junit.Before; import org.junit.Test;import j ...

最新文章

  1. pandas数据清洗(缺失值、异常值和重复值处理)
  2. 天津发票版本文件服务器端口,天津市增值税发票综合服务平台网址
  3. key to ribbon chart in powerbi: time, category, value
  4. CentOs简单分区方案
  5. DevToys - 开发人员的瑞士军刀
  6. 操作word打印网址
  7. wpsoffice 安装包_WPS office (安卓、ios) 企业版 软件介绍(附安装包)
  8. 读书APP的不二备胎,我选了网易蜗牛读书
  9. linux V4L2子系统——v4l2架构(1)之整体架构
  10. Hadoop_day01_大数据的概念及磁盘存储
  11. Burp suite - Burp Clickbandit
  12. 机械设备租赁平台如何快速进行商户号分账?
  13. 计算机网络的雏形,计算机网络的发展雏形是什么(图文)
  14. 软件设计师考试重点知识点梳理
  15. SpringBoot--SpringBoot 读取Properties文件(结合JDBC)
  16. 人工智能换脸python_Python实现AI换脸功能
  17. HFSS学习记录(1)
  18. X61t安装Ubuntu后平板导航键失效解决方法
  19. 方波信号发生器电路仿真,小波神经网络算法原理
  20. 学平面设计能做什么?平面设计都有哪些内容

热门文章

  1. 算法 --- 希尔排序、归并排序、快速排序的js实现
  2. es6 --- Reflect的静态方法
  3. 浅析 NodeJs 的几种文件路径
  4. 我与Linux系统的交集
  5. ssh服务端口转发详解
  6. shell 脚本编程之for语句、if语句(2 )
  7. [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据
  8. 淘宝跨域获取Cookie分析
  9. Commit Monitor–svn监控工具
  10. DNS 错误事件4000 4013