`
CoderDream
  • 浏览: 478394 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

DBUnit最佳实践之数据备份与恢复

 
阅读更多

在做测试之前,我们需要对数据进行备份,用DBUnit可以很方便的对数据库中的数据进行备份和恢复。

 

目录结构

  • 项目结构图
  • 源代码
    1. 数据库工具类
    2. 导入导出类
    3. Maven工程文件
    4. 数据库配置属性文件
    5. 数据库脚本
    6. 日志配置文件
  • 参考文档
  • 完整项目源代码

项目结构图

源代码

数据库工具类

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>&#32705;&#20180;</value>
      <value>m</value>
      <value>1979-12-31</value>
    </row>
    <row>
      <value>0002</value>
      <value>&#29579;&#32736;&#33457;</value>
      <value>f</value>
      <value>1982-08-09</value>
    </row>
  </table>
</dataset>

参考文档

  1. 使用DBUnit进行数据库备份与恢复
  2. 用DBUnit做数据备份恢复工具

完整源代码

 

 

  • 大小: 28.3 KB
3
0
分享到:
评论

相关推荐

    DBUnit最佳实践之增删改查

    在本文中,我们将深入探讨 DBUnit 的最佳实践,聚焦于数据库的增删改查操作,帮助您优化测试流程,提升软件质量。 1. **数据初始化**: 在开始任何数据库操作之前,DBUnit 提供了 `IDatabaseConnection` 接口来...

    DBUnit最佳实践之使用ant命令

    DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试过程中管理和填充数据库,确保数据的一致性和准确性。本文将深入探讨如何结合Ant构建自动化测试流程,利用DBUnit...

    如何使用DBUnit做数据备份恢复

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它提供了一种方式来管理和操作数据库的数据,包括数据的导入导出、备份和恢复。在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们...

    dbunit帮助文档(HTML版)

    1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的数据导入到数据库,这在数据迁移或备份时非常有用。 2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态...

    dbunit-2.4.9 源码

    3. 数据清理:测试结束后,DBUnit 可以清理数据库,恢复到初始状态,避免测试数据污染生产环境。 在 `dbunit-2.4.9` 压缩包中,可能包含以下组件和资源: 1. `lib/` 目录:包含了 DBUnit 运行所需的依赖库,如...

    通过DBUNIT做批量对比测试

    DBUNIT 提供了一种高效的方式来进行这种比较,它允许测试人员定义数据集(通常以 CSV 或 XML 格式),并将这些数据加载到数据库中,然后在测试完成后进行验证,确认数据库的实际状态与预期相符。 以下是使用 DBUNIT...

    DBUnit 进行单元测试

    DBUnit 提供了一种结构化的方式来导入和导出数据库数据,使得测试环境可以被精确地设置和还原,避免了因为测试数据污染而引起的错误。 在进行单元测试时,DBUnit 允许我们将数据库的状态定义为“预期状态”(通常在...

    dbunit-2.4.7所有jar以及dbunit入门教程

    DBUnit 的核心概念包括数据集、操作模式和数据类型映射。数据集是 DBUnit 的基础,它通常是一个 XML 文件或者 CSV 文件,描述了测试用例中的预期数据库状态。这些文件包含了表的行和列,模拟了数据库中的数据。操作...

    dbunit2.2

    2. **操作模式**:DBUnit 提供了三种操作模式:CLEAN_INSERT(清空表后再插入新的数据)、UPDATE(更新已有数据)和OVERWRITE(覆盖原有数据)。这些模式可以根据不同的测试需求来选择。 3. **数据集**:在DBUnit中...

    dbunit测试demo

    通常,`@Before` 会使用 `IDatabaseConnection` 和 `IDataSet` 清理和填充数据,`@After` 用于恢复初始状态或清理数据。 6. **执行测试**:在测试方法中,使用 `DatabaseTester` 或 `DBUnitHelper` 类来运行 DBUnit...

    dbunit开发文档

    1. JUnit 集成:DBUnit 可以很容易地与 JUnit 结合使用,通过 `@Before` 和 `@After` 注解来设置和清理数据库。 2. Spring 集成:如果你的项目使用 Spring,可以利用 Spring's `DbUnitTestExecutionListener` 来...

    Dbunit数据库连接下载

    Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。它被广泛应用于软件开发过程中,特别是对于那些依赖于数据库的应用程序,因为Dbunit能够帮助开发者有效地管理和控制数据库的状态,确保测试的一致性...

    spring与dbunit集成测试

    本文将深入探讨如何将Spring与DBUnit整合,以实现高效、可靠的数据库集成测试。 首先,理解Spring的核心功能是至关重要的。Spring是一个开源的Java平台,它为构建应用程序提供了全面的支持,包括依赖注入...

    介绍dbunit的使用和原理,核心组件介绍

    DbUnit还允许你验证数据库中的数据是否与预期的一组值匹配,这在进行单元测试时特别有用。 **IDatabaseConnection** 是DbUnit的核心接口之一,它代表了一个到数据库的连接。DbUnit提供了两种实现方式:`Database...

    DBUNIT使用

    DbUnit 还可以与 JUnit 集成,使用 DbUnit 的 TestCase 子类来编写测试用例。DbUnit 的使用可以使数据库测试变得更方便快捷。 DbUnit 还提供了多种方式来访问数据库,例如使用 IDatabaseConnection 接口来访问实际...

    dbunit-2.0-src.zip_dbunit src_dbunit-2.1-src

    例如,测试前,你可以用数据集填充数据库,测试后,再恢复到初始状态。 2. 数据操作:DBUnit提供了多种方法来处理数据,包括INSERT、UPDATE、DELETE和CLEAN_INSERT等操作。这些操作可以确保每次测试开始时,数据库...

    DBUnit导数据报表名超长和MBCS字段被截断日志

    在IT行业中,数据库管理和数据导入导出是至关重要的任务,特别是在使用DBUnit这样的工具时。DBUnit是一款用于数据库测试的Java库,它允许开发者在测试前后对比数据库状态,确保数据处理的正确性。然而,当遇到...

Global site tag (gtag.js) - Google Analytics