文章转自: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. 计算两个YUV420P像素数据的PSNR---高等算法

    PSNR是最基本的视频质量评价方法.本程序中的函数可以对比两张YUV图片中亮度分量Y的PSNR.函数的代码如下所示. /** * Calculate PSNR between 2 YUV420P fi ...

  2. Android开发之旅:环境搭建

    1.JDK安装 2.Eclipse安装 3.Android SDK安装 4.ADT安装 5.创建AVD

  3. web从入门开始(4)--------链接

    l  图片标记 l  语法格式<img> l  常用属性 l  width:图片宽度 单位:像素 l  height:图片高度 单位:像素 l  border:边框的粗细 l  src:图 ...

  4. Java开发过程中开发工具Eclipse中导入jar包的过程

    欢迎欣赏我的第二篇随笔.我们在创建好一个动态网站项目之后,如果没有部署maven的情况下,你可以按照以下的方法,直接把要用的jar包导入你的工程中,而不用再部署maven. 例如在使用JDBC编程时需 ...

  5. 关于 Python generator(生成器)的类比

    Python 的生成器运用仿佛是最完美的 xing爱,生成器本身和循环代表男女,结束代表同时达到高潮,不是很精准,但很有趣啊!哈哈哈,一下记住了

  6. Linux之例行(任务调度)

    一. 例行命令之at 1.1 at 仅执行一次就从Linux任务中取消  1.2 at 指令可以将工作命令写入工作记录文件,工作记录文件默认存放在/var/spool/at目录内  1.3 at 工作 ...

  7. 数据库dbutils

    common-dbutils.jarQueryRunnerupdate方法:* int update(String sql, Object... params) -->  可执行增.删.改语句* ...

  8. vue-router2.0简单路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【VB超简单入门】六、基本数据类型

    接下来要介绍VB的基本数据类型,为接下来学习变量和常量准备. 计算机只能处理二进制的数据,所以无论什么数据,在CPU里面处理都是一样的,类似101010这样的机器代码,但是让我们直接去写机器代码程序, ...

  10. 20155237 2016-2017-2 《Java程序设计》第5周学习总结

    20155237 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 语法与继承架构 使用try...catch 与C语言中程序流程和错误处理混在一起不同,Jav ...