通过 jdbc 分析数据库中的表结构和主键外键
文章转自: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文档,其中有一种文档要求添加公司几个系统的数据库中的表结构.我临时接到了这项 ...
随机推荐
- ABP入门系列(14)——应用BootstrapTable表格插件
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 之前的文章ABP入门系列(7)--分页实现讲解了如何进行分页展示,但其分页展示仅适用于 ...
- java properties 对list的支持
经测试,原生的properties 对 list 不支持. 参考样例如下: id=1 id=2 具体代码如下: java.util.Properties prop = new Properties() ...
- 解读Laravel,看PHP如何实现Facade?
刚刚开始学Laravel就会接触到路由 Route::get('/', function () { return view('welcome'); }); 后来笔者一本正经的去读过Route类的代码, ...
- 【CNMP系列】VIM编辑器详解
缘起 大学的时候做过Linux内核驱动程序研发,之前写C语言就是用的Vim编辑器,当年的Vim还不如今天之强大,当时的插件也没有现在这么多,只是觉得这个编辑器能满足我想要的所有,查看Linux内核代码 ...
- Spring-java代理技术总结
Spring 中采用JDk的动态代理和CGLib代理技术在运行期间织入增强,所以用户不需要装备特殊的编译器或者类装载器就可以使用AOP功能. 要使用jdk的动态代理,目标类必须实现接口,而CGLib代 ...
- Authorization user to use specifical database
DENY VIEW any DATABASE to PUBLIC;ALTER AUTHORIZATION ON DATABASE::Best TO Best
- Memcached十问十答
1.Memcached是什么,有什么作用? Memcached是一种纯内存的,key-value,CS架构的数据库服务软件,主要用于数据库,web服务器的缓存,以减小数据库,web服务器的访问压力,尤 ...
- java实现8种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
- wamp2.4.4 如何配置虚拟主机及反向代理(解决跨域问题)
一.找到安装目录下的httpd.conf文件 1. 删除Include conf/extra/httpd-vhosts.conf前面的#号(开启虚拟主机的配置) 2. 删除LoadModule pro ...
- Struts2的类型转换(下)
Struts2提供的类型转换: Struts2提供的是一个名叫StrutsTypeConverter的抽象类,这个类实际上是DefaultTypeConverter的子类.当我们继承自该抽象类 时,要 ...