文章转自: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() 来获得。
- Connection conn = ...;
- DatabaseMetaData dbMetaData = conn.getMetaData();
获取所有表
- 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)
获取某个表的主键
- 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)
获取某个表的外键
- 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.把外键再加回去。
通过 jdbc 分析数据库中的表结构和主键外键的更多相关文章
-
通过jdbc获取数据库中的表结构
通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...
-
通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...
-
查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数
查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06| 分类: SQL SERVER|举报|字号 订阅 ( ...
-
java中访问mysql数据库中的表结构信息
package cn.hncu.meta; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Re ...
-
如何导出远程oracle数据库中的表结构
从远程oracle数据库上导出指定表的表结构语句有两种方法: 方法一:通过sql语句获得 1,make sure that you can connect the remote database. 2 ...
-
sql语句查询数据库中的表名/列名/主键/自动增长值
原文地址:http://blog.csdn.net/pukuimin1226/article/details/7687538 ----查询数据库中用户创建的表 ----jsj01 为数据库名 sele ...
-
使用sql developer 导出Oracle数据库中的表结构
MS SQLServer的客户端工具做的的确比较好,直接右键,导出数据库就OK了,而且MS的客户端导出的是xxx.dbf文件,直接附加到别的数据库上就OK了 Oracle的sql developer就 ...
-
JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法
黑马程序员 我们知道,在设计一个Javabean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对多的关系,学生与老师直接又多对 ...
-
VSTO学习笔记(八)向 Word 2010 中写入表结构
原文:VSTO学习笔记(八)向 Word 2010 中写入表结构 前几天公司在做CMMI 3级认证,需要提交一系列的Word文档,其中有一种文档要求添加公司几个系统的数据库中的表结构.我临时接到了这项 ...
随机推荐
-
HDU 4504 威威猫系列故事——篮球梦(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 中文都看得懂.不过我是看hint才正确理解什么意思的.开始的时候理解错了. 解题思路: 给定时 ...
-
Java特性-Collection和Map
创建博客的目的主要帮助自己记忆和复习日常学到和用到的知识:或有纰漏请大家斧正,非常感谢! 之前面试,被问过一个问题:List和Set的区别. 主要区别很明显了,两者都是数组形式存在的,继承了Colle ...
-
jquery可见性选择器(匹配匹配所有显示的元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
POJ1838
poj 1838 这道题主要是对并查集的考察,在这道题的解题过程中主要用到的算法就是并查集中的最基本的makeSet,findSet,unionSet 即前篇文章中所提到的: makeSet(Elem ...
-
SPI协议总结
四种工作模式: Mode 0 CPOL=0, CPHA=0 Mode 1 CPOL=0, CPHA=1Mode 2 CPOL=1, CPHA=0 Mode 3 CPOL=1, CPHA=1 常使用Mo ...
-
python开发与实战content
课时10_字典和集合 课时11 练习:列表运算.doc 课时12_讨论答疑:日志.引用.单例模式等 课时13_函数式编程 课时14 练习:编程实现若干函数.doc 课时15_练习讲解:编写函数 课时1 ...
-
CSS的插入和选择器介绍
一.认识CSS样式 1.定义 CSS全称:层叠样式表(Cascading Style Sheets) 主要作用:定义HTML内容在浏览器内的显示样式,比如文字大小.颜色.字体加粗等 优点:通过定义某个 ...
-
HPU第三次积分赛-D:Longest Increasing Subsequence(DP)
Longest Increasing Subsequence 描述 给出一组长度为n的序列,a1,a2,a3,a4...an, 求出这个序列长度为k的严格递增子序列的个数 输入 第一行输入T ...
-
hadoop运维问题记录
hadoop综合问题记录 1.hdfs无法启动 错误: 2018-04-25 14:36:09,293 - Retrying after 10 seconds. Reason: Execution o ...
-
webpack2 热加载js 文件
如果只要普通的热加载 只要如下配置就好了 package.json { "devDependencies": { "webpack": "^2.6.1 ...