文章转自: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代码  
  1. Connection conn = ...;
  2. DatabaseMetaData dbMetaData = conn.getMetaData();

获取所有表

Java代码  
  1. String catalog = conn.getCatalog(); //catalog 其实也就是数据库名
  2. ResultSet tablesResultSet = dbMetaData.getTables(catalog,null,null,new String[]{"TABLE"});
  3. while(tablesResultSet.next()){
  4. String tableName = tablesResultSet.getString("TABLE_NAME");
  5. }

tablesResultSet 中有以下列:

  1. TABLE_CAT String => 表类别(可为 null)
  2. TABLE_SCHEM String => 表模式(可为 null)
  3. TABLE_NAME String => 表名称
  4. TABLE_TYPE String => 表类型。典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。
  5. REMARKS String => 表的解释性注释
  6. TYPE_CAT String => 类型的类别(可为 null)
  7. TYPE_SCHEM String => 类型模式(可为 null)
  8. TYPE_NAME String => 类型名称(可为 null)
  9. SELF_REFERENCING_COL_NAME String => 有类型表的指定 "identifier" 列的名称(可为 null)
  10. REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 "SYSTEM"、"USER" 和 "DERIVED"。(可能为 null)

获取某个表的主键

Java代码  
  1. String tableName = ...;
  2. ResultSet primaryKeyResultSet = dbMetaData.getPrimaryKeys(catalog,null,tableName);
  3. while(primaryKeyResultSet.next()){
  4. String primaryKeyColumnName = primaryKeyResultSet.getString("COLUMN_NAME");
  5. }

primayKeyResultSet 有以下几列:

  1. TABLE_CAT String => 表类别(可为 null)
  2. TABLE_SCHEM String => 表模式(可为 null)
  3. TABLE_NAME String => 表名称
  4. COLUMN_NAME String => 列名称
  5. KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。
  6. PK_NAME String => 主键的名称(可为 null)

获取某个表的外键

Java代码  
  1. ResultSet foreignKeyResultSet = dbMetaData.getImportedKeys(catalog,null,tableName);
  2. while(foreignKeyResultSet.next()){
  3. String fkColumnName = foreignKeyResultSet.getString("FKCOLUMN_NAM");
  4. String pkTablenName = foreignKeyResultSet.getString("PKTABLE_NAME");
  5. String pkColumnName = foreignKeyResultSet.getString("PKCOLUMN_NAME");
  6. }

foreignKeyResultSet 有以下几列:

  1. PKTABLE_CAT String => 被导入的主键表类别(可为 null)
  2. PKTABLE_SCHEM String => 被导入的主键表模式(可为 null)
  3. PKTABLE_NAME String => 被导入的主键表名称
  4. PKCOLUMN_NAME String => 被导入的主键列名称
  5. FKTABLE_CAT String => 外键表类别(可为 null)
  6. FKTABLE_SCHEM String => 外键表模式(可为 null)
  7. FKTABLE_NAME String => 外键表名称
  8. FKCOLUMN_NAME String => 外键列名称
  9. KEY_SEQ short => 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
  10. UPDATE_RULE short => 更新主键时外键发生的变化
  11. DELETE_RULE short => 删除主键时外键发生的变化
  12. PK_NAME String => 主键的名称(可为 null)
  13. FK_NAME String => 外键的名称(可为 null)
  14. DEFERRABILITY short => 是否可以将对外键约束的评估延迟到提交时间

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

通过 jdbc 分析数据库中的表结构和主键外键的更多相关文章

  1. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  2. 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类

    http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...

  3. 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

    查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅     ( ...

  4. java中访问mysql数据库中的表结构信息

    package cn.hncu.meta; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Re ...

  5. 如何导出远程oracle数据库中的表结构

    从远程oracle数据库上导出指定表的表结构语句有两种方法: 方法一:通过sql语句获得 1,make sure that you can connect the remote database. 2 ...

  6. sql语句查询数据库中的表名/列名/主键/自动增长值

    原文地址:http://blog.csdn.net/pukuimin1226/article/details/7687538 ----查询数据库中用户创建的表 ----jsj01 为数据库名 sele ...

  7. 使用sql developer 导出Oracle数据库中的表结构

    MS SQLServer的客户端工具做的的确比较好,直接右键,导出数据库就OK了,而且MS的客户端导出的是xxx.dbf文件,直接附加到别的数据库上就OK了 Oracle的sql developer就 ...

  8. JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

    黑马程序员 我们知道,在设计一个Javabean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对多的关系,学生与老师直接又多对 ...

  9. VSTO学习笔记(八)向 Word 2010 中写入表结构

    原文:VSTO学习笔记(八)向 Word 2010 中写入表结构 前几天公司在做CMMI 3级认证,需要提交一系列的Word文档,其中有一种文档要求添加公司几个系统的数据库中的表结构.我临时接到了这项 ...

随机推荐

  1. 10分钟精通SharePoint - SharePoint定位

    平台 – "一栋楼房的框架结构" 扩展 – "用户可以根据自己需要随意装修房间"集成 – "插拔式的系统集成能力"业务– "既是全 ...

  2. web从入门开始(6)-----框架

    普通框架 框架概念:就是将一个页面分割成小窗口,每个窗口都是一个网页 框架集和框架页 框架集:<frameset>:主要用来划分窗口的 框架页:<frame>:主要用来指定窗口 ...

  3. linux CentOS6.5 安装SVN & 可视化管理工具iF.SVNAdmin

    转:http://tanghenxin.lofter.com/post/1cc667b3_5ac50dc 实际系统环境: CentOS 6.5 x64 一.安装Apache 通常系统都已经装好了,但我 ...

  4. 【学习笔记】TCP通信的细节及TCP连接对HTTP事务处理性能影响

    从三次握手的细节说起 刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的"三次握手",socket作 ...

  5. django出现__init__() got an unexpected keyword argument 'mimetype‘ 问题解决

    这种问题好多新手按照djangobook学习的时候应该都遇到过,是因为这是老的django的写法,新的django已经升级改变了很多东西. 处理方法如下: I think you are not us ...

  6. 爱回收jd图标

    http://jd.aihuishou.com/images/icons.png http://misc.360buyimg.com/201007/skin/df/i/bg_hotsale.gif 来 ...

  7. git工具使用方法及常用命令

    git下载地址:https://git-for-windows.github.io/git环境变量配置:增加:GIT_HOME = C:\Git (文件夹为git软件的安装文件夹)Path添加: %G ...

  8. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  9. [SinGuLaRiTy] 树形存储结构阶段性测试

    [SinGuLaRiTy-1011] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. G2019级信息奥赛专项训练 题目 程序名 时间 内存 ...

  10. 提高 webpack 构建 Vue 项目的速度

    前言 最近有人给我的 Vue2 后台管理系统解决方案 提了 issue ,说执行 npm run build 构建项目的时候极其慢,然后就引起我的注意了.在项目中,引入了比较多的第三方库,导致项目大, ...