在做测试之前,我们需要对数据进行备份,用DBUnit可以很方便的对数据库中的数据进行备份和恢复。
目录结构
- 项目结构图
- 源代码
- 数据库工具类
- 导入导出类
- Maven工程文件
- 数据库配置属性文件
- 数据库脚本
- 日志配置文件
- 参考文档
- 完整项目源代码
项目结构图
源代码
数据库工具类
DBUtil.java
package com.coderdream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ResourceBundle; public class DBUtil { public static Connection getConnection() { Connection conn = null; try { ResourceBundle rs = ResourceBundle.getBundle("dbutil"); Class.forName(rs.getString("db.classname")); conn = DriverManager.getConnection(rs.getString("db.url"), rs.getString("db.username"), rs.getString("db.password")); } catch (ClassNotFoundException e) { System.out.println("数据库驱动加载失败,堆栈轨迹如下"); e.printStackTrace(); } catch (SQLException e) { System.out.println("数据库连接创建失败,堆栈轨迹如下"); e.printStackTrace(); } return conn; } public static void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) { if (null != rs) { try { rs.close(); } catch (SQLException e) { System.out.println("数据库操作的ResultSet关闭失败,堆栈轨迹如下"); e.printStackTrace(); } } if (null != pstmt) { try { pstmt.close(); } catch (SQLException e) { System.out.println("数据库操作的PreparedStatement关闭失败,堆栈轨迹如下"); e.printStackTrace(); } } close(conn); } public static void close(Connection conn) { if (null != conn) { try { conn.close(); if (conn.isClosed()) { System.out.println("此数据库连接已关闭-->" + conn); } else { System.out.println("此数据库连接关闭失败-->" + conn); } } catch (SQLException e) { System.out.println("数据库连接关闭失败,堆栈轨迹如下"); e.printStackTrace(); } } } }
导入导出类
DBExportImport.java
package com.coderdream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.sql.Connection; import java.sql.SQLException; import org.dbunit.DatabaseUnitException; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.QueryDataSet; import org.dbunit.dataset.CachedDataSet; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.csv.CsvDataSetWriter; import org.dbunit.dataset.stream.IDataSetProducer; import org.dbunit.dataset.xml.XmlDataSetWriter; import org.dbunit.dataset.xml.XmlProducer; import org.dbunit.operation.DatabaseOperation; import org.dbunit.util.FileHelper; public class DBExportImport { private static String TEST_DIR = DBExportImport.class.getResource("/").getPath(); public static void main(String[] args) throws Exception { File file = new File(TEST_DIR + "backup.xml"); Connection connection = DBUtil.getConnection(); String[] tableNames = new String[] { "student" }; // 导出指定的表的数据到xml文件 exportTables(connection, tableNames, file); // 导出所有表的数据到xml文件 // exportAllTables(file, connection); // 将xml数据文件中的数据导入到数据库中 importData(file, connection); } /** * <pre> * 导出数据到指定文件 * * 在这个方法中指定了一个表名"room",如果有多个表可以通过参数或其他的方式按照这种方式继续增加。 * 这个文件是XML格式的。 * 具体格式说明或其他格式参见http://www.dbunit.org/components.html * * * </pre> * * @param connection * 一个标准的java.sql.Connection * @param tableNames * 需要导出数据的表名数组 * @param file * 一个标准的java.io.File * @throws Exception */ public static void exportTables(Connection connection, String[] tableNames, File file) throws Exception { IDatabaseConnection databaseConnection = new DatabaseConnection(connection); QueryDataSet dataSet = new QueryDataSet(databaseConnection); if (null != tableNames && 0 < tableNames.length) { int tableNamesLength = tableNames.length; for (int i = 0; i < tableNamesLength; i++) { dataSet.addTable(tableNames[i]); } } Writer writer = new FileWriter(file); XmlDataSetWriter w = new XmlDataSetWriter(writer); w.write(dataSet); writer.flush(); writer.close(); } /** * <pre> * 导出数据库中的所有数据到指定文件 * 这个文件是XML格式的。 * 具体格式说明或其他格式参见http://www.dbunit.org/components.html * * 这个方法可以把上面生成的XML文件导入到数据库中, * 如果是其他格式的文件只需要更换IDataSetProducer的实现类就可以了。 * 具体格式请参见APIDOC在这个方法里使用了事务控制,保证数据的一致性。 * * </pre> * * @param file * 一个标准的java.io.File * @param connection * 一个标准的java.sql.Connection * @throws Exception */ public static void exportAllTables(File file, Connection connection) throws Exception { IDatabaseConnection databaseConnection = new DatabaseConnection(connection); IDataSet dataSet = databaseConnection.createDataSet(); Writer writer = new FileWriter(file); XmlDataSetWriter w = new XmlDataSetWriter(writer); w.write(dataSet); writer.flush(); writer.close(); } /** * CsvDataSetWriter * * <pre> * 导出数据库中的所有数据到指定文件 * 这个文件是XML格式的。 * 具体格式说明或其他格式参见http://www.dbunit.org/components.html * * 这个方法可以把上面生成的XML文件导入到数据库中, * 如果是其他格式的文件只需要更换IDataSetProducer的实现类就可以了。 * 具体格式请参见APIDOC在这个方法里使用了事务控制,保证数据的一致性。 * * </pre> * * @param file * 一个标准的java.io.File * @param connection * 一个标准的java.sql.Connection * @throws Exception */ public static void exportAllTablesToCsv(Connection connection, File file) throws Exception { IDatabaseConnection databaseConnection = new DatabaseConnection(connection); IDataSet dataSet = databaseConnection.createDataSet(); CsvDataSetWriter w = new CsvDataSetWriter(file); w.write(dataSet); } /** * 导入数据到数据库 * * @param file * 一个标准的java.io.File * @param connection * 一个标准的java.sql.Connection */ public static void importData(File file, Connection connection) throws DatabaseUnitException, IOException, SQLException { IDataSetProducer dataSetProducer = new XmlProducer(FileHelper.createInputSource(file)); IDataSet dataSet = new CachedDataSet(dataSetProducer); IDatabaseConnection databaseConnection = new DatabaseConnection(connection); DatabaseOperation operation = DatabaseOperation.CLEAN_INSERT; DatabaseOperation.TRANSACTION(operation); operation.execute(databaseConnection, dataSet); DatabaseOperation.CLOSE_CONNECTION(operation); } }
Maven工程文件
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.coderdream</groupId> <artifactId>dbunit-export-import</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>DBUnitSample</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.24</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.4.8</version> </dependency> </dependencies> </project>
数据库配置属性文件
dbutil.properties
db.classname=com.mysql.jdbc.Driver db.url=jdbc:mysql://127.0.0.1:3306/dbup?characterEncoding=UTF-8 db.username=root db.password=1234
数据库脚本
dbup.sql
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50525 Source Host : localhost:3306 Source Database : dbup Target Server Type : MYSQL Target Server Version : 50525 File Encoding : 65001 Date: 2014-10-11 14:27:06 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `role` -- ---------------------------- DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` varchar(20) NOT NULL DEFAULT '', `roleName` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of role -- ---------------------------- INSERT INTO `role` VALUES ('1', '管理员'); INSERT INTO `role` VALUES ('2', '普通用户'); -- ---------------------------- -- Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` varchar(20) NOT NULL DEFAULT '', `name` varchar(20) DEFAULT NULL, `sex` varchar(10) DEFAULT NULL, `birthday` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', '2', '3', '4'); -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` varchar(20) NOT NULL DEFAULT '', `name` varchar(20) DEFAULT NULL, `role_id` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `ref_id` (`role_id`), CONSTRAINT `ref_id` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', '张三', '1'); INSERT INTO `user` VALUES ('2', '李四', '2');
日志配置文件
log4j.properties
# Set root logger level to DEBUG and its only appender to A1. log4j.rootLogger=DEBUG, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 uses PatternLayout. log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
运行结果
导出的xml文件backup.xml
<?xml version='1.0' encoding='UTF-8'?> <dataset> <table name="student"> <column>id</column> <column>name</column> <column>sex</column> <column>birthday</column> <row> <value>0001</value> <value>翁仔</value> <value>m</value> <value>1979-12-31</value> </row> <row> <value>0002</value> <value>王翠花</value> <value>f</value> <value>1982-08-09</value> </row> </table> </dataset>
参考文档
完整源代码
相关推荐
在本文中,我们将深入探讨 DBUnit 的最佳实践,聚焦于数据库的增删改查操作,帮助您优化测试流程,提升软件质量。 1. **数据初始化**: 在开始任何数据库操作之前,DBUnit 提供了 `IDatabaseConnection` 接口来...
DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试过程中管理和填充数据库,确保数据的一致性和准确性。本文将深入探讨如何结合Ant构建自动化测试流程,利用DBUnit...
DBUnit 是一个开源的 Java 库,专门用于数据库测试,它提供了一种方式来管理和操作数据库的数据,包括数据的导入导出、备份和恢复。在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们...
1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的数据导入到数据库,这在数据迁移或备份时非常有用。 2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态...
3. 数据清理:测试结束后,DBUnit 可以清理数据库,恢复到初始状态,避免测试数据污染生产环境。 在 `dbunit-2.4.9` 压缩包中,可能包含以下组件和资源: 1. `lib/` 目录:包含了 DBUnit 运行所需的依赖库,如...
DBUNIT 提供了一种高效的方式来进行这种比较,它允许测试人员定义数据集(通常以 CSV 或 XML 格式),并将这些数据加载到数据库中,然后在测试完成后进行验证,确认数据库的实际状态与预期相符。 以下是使用 DBUNIT...
DBUnit 提供了一种结构化的方式来导入和导出数据库数据,使得测试环境可以被精确地设置和还原,避免了因为测试数据污染而引起的错误。 在进行单元测试时,DBUnit 允许我们将数据库的状态定义为“预期状态”(通常在...
DBUnit 的核心概念包括数据集、操作模式和数据类型映射。数据集是 DBUnit 的基础,它通常是一个 XML 文件或者 CSV 文件,描述了测试用例中的预期数据库状态。这些文件包含了表的行和列,模拟了数据库中的数据。操作...
2. **操作模式**:DBUnit 提供了三种操作模式:CLEAN_INSERT(清空表后再插入新的数据)、UPDATE(更新已有数据)和OVERWRITE(覆盖原有数据)。这些模式可以根据不同的测试需求来选择。 3. **数据集**:在DBUnit中...
通常,`@Before` 会使用 `IDatabaseConnection` 和 `IDataSet` 清理和填充数据,`@After` 用于恢复初始状态或清理数据。 6. **执行测试**:在测试方法中,使用 `DatabaseTester` 或 `DBUnitHelper` 类来运行 DBUnit...
1. JUnit 集成:DBUnit 可以很容易地与 JUnit 结合使用,通过 `@Before` 和 `@After` 注解来设置和清理数据库。 2. Spring 集成:如果你的项目使用 Spring,可以利用 Spring's `DbUnitTestExecutionListener` 来...
Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。它被广泛应用于软件开发过程中,特别是对于那些依赖于数据库的应用程序,因为Dbunit能够帮助开发者有效地管理和控制数据库的状态,确保测试的一致性...
本文将深入探讨如何将Spring与DBUnit整合,以实现高效、可靠的数据库集成测试。 首先,理解Spring的核心功能是至关重要的。Spring是一个开源的Java平台,它为构建应用程序提供了全面的支持,包括依赖注入...
DbUnit还允许你验证数据库中的数据是否与预期的一组值匹配,这在进行单元测试时特别有用。 **IDatabaseConnection** 是DbUnit的核心接口之一,它代表了一个到数据库的连接。DbUnit提供了两种实现方式:`Database...
DbUnit 还可以与 JUnit 集成,使用 DbUnit 的 TestCase 子类来编写测试用例。DbUnit 的使用可以使数据库测试变得更方便快捷。 DbUnit 还提供了多种方式来访问数据库,例如使用 IDatabaseConnection 接口来访问实际...
例如,测试前,你可以用数据集填充数据库,测试后,再恢复到初始状态。 2. 数据操作:DBUnit提供了多种方法来处理数据,包括INSERT、UPDATE、DELETE和CLEAN_INSERT等操作。这些操作可以确保每次测试开始时,数据库...
在IT行业中,数据库管理和数据导入导出是至关重要的任务,特别是在使用DBUnit这样的工具时。DBUnit是一款用于数据库测试的Java库,它允许开发者在测试前后对比数据库状态,确保数据处理的正确性。然而,当遇到...