文章转自: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.把外键再加回去。

最新文章

  1. 配置管理服务diamond和disconf横向对比
  2. C/C++中的可变参函数
  3. NET Core 整合Autofac和Castle
  4. Linux下使用NMON监控、分析系统性能 -转载
  5. win7怎么安装消息队列 MSMQ
  6. 鼠标拖放div 实现
  7. 学习英语每日一 On the house. 赠品
  8. Django剖析
  9. JVM菜鸟进阶高手之路一(一次与笨神,阿飞近距离接触修改JVM)
  10. R语言数据集的技术
  11. vim-go 安装
  12. Centos 安装 mysql tar.gz
  13. Spring -- <mvc:annotation-driven />
  14. node cluster模块,仿多线程并发调用,
  15. Hive-1.2.1_05_案例操作
  16. JVM总结(四):JVM类加载机制
  17. am start的总结,-d参数的总结,以及python中传递内容包含中文及特殊字符&的解决方案
  18. Python--异常处理--12
  19. 虚幻4随笔6 Object和序列化
  20. 有趣:256个class选择器可以干掉1个id选择器——张鑫旭

热门文章

  1. ionic 添加新module
  2. TypeScript设计模式之解释器
  3. Java 8并发工具包漫游指南
  4. ps-图像的符合
  5. 对VC++6.0爱得深沉(二)个性工具的定制
  6. Storm(2015.08.12笔记)
  7. 极客君教你破解隔壁妹子的wifi密码,成功率高达90%
  8. iOS开发之计算文字尺寸
  9. vue学习笔记 样式 class style(五)
  10. JavaWeb之session