在某项目中用到了 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
分享到:
相关推荐
第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...
基于JDBC数据库框架的设计(afsql框架),以此阐述数据库框架的设计原理* JDBC连接池,JDBC数据库开发的必备技术 *?数据库事务 Transaction 的支持? * SQL的转义,数据库注入攻击的预防 * 数据库的动态访问:获取...
第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...
第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...
第2部分 在两层客户/服务器结构中使用JDBC和SQL 第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 ...
使用PSQL(Procedure SQL),你可以创建强大的存储过程来处理服务上的所有数据,你可以使用select Stored Procedure的形式,使用存储过程,以得到一个虚拟的表结构的结果。这样的话,你就可以很容易的在报表中使用它。 ...
MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如主键、外键)在表之间建立关联。它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。...
4 3.1 定义数据库表 4 数据库表 4 第四章 软件功能设计 6 4.1 软件功能结构图 6 4.2软件划分模块 7 4.2.1 整体流程: 7 4.2.2 航班信息查询模块 8 4.2.3 顾客查询模块 10 4.2.4 订票、退票功能 12 4.2.5 财务查询 17...
(1) 进行规范的数据库设计,正确地定义关系数据表的结构及表间联系(包括:字段的数据类型、宽 度、精度、主键、外键、缺省值)。 (2)要求界面布局紧凑、流畅、美观,实现的功能较为完善 (3)本实验分两次完成,第一...
MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如主键、外键)在表之间建立关联。它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。...
5.1.3 每个类层次结构一张表 5.1.4 每个子类一张表 5.1.5 混合继承策略 5.1.6 选择策略 5.2 Hibernate类型系统 5.2.1 概述实体和值类型 5.2.2 内建的映射类型 5.2.3 使用映射类型 ...
使用通用 JDBC、建模表、列、主键、外键和唯一/非唯一索引在内存中加载数据库结构的 Java 库。 支持 Oracle、MySql、PostgreSQL、DB2、Hypersonic 和 Sybase 数据库。
4.1.2 定制数据库表 4.2 建立项目的目录结构 4.3 运行hbm2java工具 4.4 运行hbm2ddl工具 4.5 使用XML格式的配置文件 4.6 小结 4.7 思考题 第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 ...
4.1.2 定制数据库表 4.2 建立项目的目录结构 4.3 运行hbm2java工具 4.4 运行hbm2ddl工具 4.5 使用XML格式的配置文件 4.6 小结 4.7 思考题 第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 ...
4.1.2 定制数据库表 4.2 建立项目的目录结构 4.3 运行hbm2java工具 4.4 运行hbm2ddl工具 4.5 使用XML格式的配置文件 4.6 小结 4.7 思考题 第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 ...
4.1.2 定制数据库表 4.2 建立项目的目录结构 4.3 运行hbm2java工具 4.4 运行hbm2ddl工具 4.5 使用XML格式的配置文件 4.6 小结 4.7 思考题 第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 ...
39、oracle数据库表的备份及还原 54 40、谈谈你知道的数据库和中间件 54 41、oracle和MySQL的区别 54 42、简述Mysql的InnoDb 55 43、删除重复数据只保留一条。 55 44、一个几千万数据,发现数据查询很慢,怎么办? ...
PrimaryKey 通过主键来确定成员,该主键指的是成员表中的主键,该主键同时要与 Dimension 里设置的 foreignKey 属性对应的字段形成外键对应关系 primaryKeyTable 如果成员表不只一个,而是多个表通过 join 关系...