在某项目中用到了 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-util
分享到:
相关推荐
本文将详细介绍如何使用Eclipse和JDBC API来获取MySQL数据库中的表结构以及主外键信息。 #### 一、准备工作 在开始之前,请确保你的开发环境已经安装了Eclipse IDE,并且项目中已经配置好了MySQL的JDBC驱动。此外...
在IT行业中,数据库是存储和管理数据的核心工具,而数据库表结构则是数据组织的基础。有时候,我们可能需要对比两个数据库的表结构差异,比如在升级系统、迁移数据或进行数据库同步时。本篇将深入探讨如何自动对比两...
例如,学生表中的"系号"是外键,它链接到系表,通过外键和主键的关联,可以方便地查询学生所属的系或系下的所有学生。 JDBC是Java访问数据库的关键,它提供了一套标准的API,允许Java开发者执行SQL语句,处理结果集...
数据库表结构文档自动生成工具是一种高效实用的软件开发辅助工具,尤其在大型项目中,能够极大地提高数据库管理和维护的效率。这款工具采用Java语言编写,具备广泛的数据库兼容性,能够支持包括但不限于MySQL、...
如果一个表A中有外键引用另一个表B的主键,那么在删除表B之前,我们必须先删除或解除表A中的外键约束,否则会触发数据库的约束错误,阻止表的删除。 为了自动删除所有表,首先要识别出有外键约束的表,并按逆序依赖...
同时,确保在迁移过程中正确处理主键和外键约束,避免数据不一致。 在实际操作中,可能还会遇到如字符集转换、数据类型不匹配等问题。例如,MySQL的字符集设置可能在源数据库和目标数据库中不同,这需要在迁移前...
数据库表结构转换为Word文档是IT行业中常见的需求,特别是在数据文档化、数据库设计报告或数据库维护过程中。这个Java项目,名为"dbToDoc-master",提供了这样一个解决方案,支持MySQL、Oracle和SQL Server这三种...
例如,Python的`psycopg2`库可以用于PostgreSQL,`pyodbc`或`pymysql`可以用于连接SQL Server或MySQL,并通过执行SQL查询来获取表结构。在Java中,我们可以使用JDBC(Java Database Connectivity)API来连接数据库并...
1. 进行标准的数据库设计,正确地定义关系数据表的结构及表间联系,包括字段的数据类型、宽度、精度、主键、外键、缺省值。 2. 要求界面布局紧凑、流畅、美观,实现的功能较为完善。 3. 本实验分两次完成,第一次...
为了实现上述功能,需要在数据库层面进行相应的设计,包括表结构设计和约束设置。 - **学院表** (`school`): 主键为 `id`。 - **学生表** (`student`): 主键为 `id`,外键为 `schid`,关联到 `school` 表的 `id` ...
这要求开发者进行规范的数据库设计,包括定义表结构、字段数据类型、宽度、精度、主键、外键和缺省值。同时,界面设计需要美观且功能完善。 实验步骤包括: 1. 使用Access或SQL Server建立数据库和表,配置ODBC数据...
实验报告的主题是“JAVA实验报告四数据库编程”,主要目的是让学生掌握基本的数据库管理系统(DBMS)使用、理解Java数据库连接(JDBC)的概念,并通过JDBC-ODBC桥接技术来开发实际的数据库系统。实验内容包括设计和...
数据库基础与JDBC编程技术是IT领域中至关重要的部分,主要涉及如何管理和操作数据以及如何通过Java语言与数据库进行交互。下面将详细讲解这两个主题。 首先,我们来探讨数据库基础。数据库是一个组织和存储数据的...
【标题】"基于SpringBoot的开源数据库表结构导出word文档工具" 提供了一种方便的方式来将数据库中的表结构转化为可编辑的Word文档,这对于数据库设计、文档编写以及团队协作非常有帮助。SpringBoot作为现代化的Java...
1. **表结构比对**:包括表名、字段名、字段类型、主键、外键、索引等信息的对比。这一步骤确保了两个数据库的数据模型是相同的。 2. **数据内容比对**:在结构相同的基础上,进一步对比每个表中的具体记录,查找...
在关系型数据库中,表结构是指数据库中的各个表的定义,包括表名、字段名、字段类型、字段长度、主键、外键等信息。在EAS6.0中,这些信息对于开发者和管理员来说是极其关键的,因为他们需要根据表结构设计业务逻辑、...
2. **表结构获取**:工具能够列出数据库中的所有表,包括表名、字段名、字段类型、主键信息、外键约束等。这一步骤涉及解析数据库的系统表或信息模式视图。 3. **索引和视图的处理**:除了表,数据库还可能包含索引...
在导入过程中,Access会尝试将SQL Server的表结构映射到Access的表,但可能需要手动调整某些特性,如主键、外键和索引,因为Access的数据库模型与SQL有所不同。 互导过程中需要注意以下几点: 1. 数据类型兼容性:...
开发者首先设计数据库模式,创建所需的表结构。然后,编写Java类来连接MySQL数据库,并实现各模块的业务逻辑。JSP页面则负责展示用户界面,通过HTTP请求与服务器通信。最后,通过集成测试确保所有模块正常工作,...