`

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

 
阅读更多

用DBUnit 做数据备份恢复工具

DBunit(http://dbunit.sourceforge.net/ )是一个非常好的数据库unit系列工具,一般都是用它在测试的时候管理数据库。我们可以发挥一下,用它做一个备份和恢复的数据库管理工具。

以mysql为例,正好现在还没有找到一个好用的mysql备份和恢复工具。这个是在代码中管理不是用ant的方式。

主要是用到核心组件:IDatabaseConnection、IDataSet、DatabaseOperation 。

先看代码:

   /**
     * 导出数据到指定文件
     * @param file 一个标准的java.io.File
     * @param connection  一个标准的java.sql.Connection
     * @throws org.dbunit.DatabaseUnitException
     */
    public static void exportRoom(File file, Connection connection) throws DatabaseUnitException, IOException {
        IDatabaseConnection databaseConnection = new DatabaseConnection(connection);
        QueryDataSet dataSet = new QueryDataSet(databaseConnection);
        dataSet.addTable("room");
        Writer writer = new FileWriter(file);
        XmlDataSetWriter w = new XmlDataSetWriter(writer);
        w.write(dataSet);
        writer.flush();
        writer.close();
    }

 在这个方法中指定了一个表名"room",如果有多个表可以通过参数或其他的方式按照这种方式继续增加。这个文件是XML格式的。具体格式说明或其他格式参见

http://dbunit.sourceforge.net/components.html#databaseconnection

/**
     * 导入数据到ROOM表
     * @param file  一个标准的java.io.File
     * @param connection 一个标准的java.sql.Connection
     */
    public static void importRoom(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);
    }

 这个方法可以把上面生成的XML文件导入到数据库中,如果是其他格式的文件只需要更换IDataSetProducer的实现类就可以了。具体格式请参见APIDOC

在这个方法里使用了事务控制,保证数据的一致性。

有了这两个方法我们就可以再发挥一下,然后为客户提供一个备份恢复数据的工具了。如果再加入压缩文件的支持就更加完美了。

 

package com.chenjo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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.stream.IDataSetProducer;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.dataset.xml.XmlDataSet;
import org.dbunit.dataset.xml.XmlDataSetWriter;
import org.dbunit.dataset.xml.XmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.dbunit.util.FileHelper;
import org.xml.sax.InputSource;

public class DbUnitTestA {

	Connection getConnection() {
		// 驱动程序名
		String driver = "com.mysql.jdbc.Driver";

		// URL指向要访问的数据库名test
		String url = "jdbc:mysql://127.0.0.1:3306/tt";

		// MySQL配置时的用户名
		String user = "root";

		// MySQL配置时的密码
		String password = "root";

		Connection conn = null;
		// 加载驱动程序
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return conn;

	}

	/**
	 * 导出数据到指定文件
	 * 
	 * @param file
	 *            一个标准的java.io.File
	 * @param connection
	 *            一个标准的java.sql.Connection
	 * @throws org.dbunit.DatabaseUnitException
	 */
	public static void exportStudent(File file, Connection connection,
			boolean flat) throws DatabaseUnitException, IOException {
		IDatabaseConnection databaseConnection = new DatabaseConnection(
				connection);
		QueryDataSet dataSet = new QueryDataSet(databaseConnection);
		dataSet.addTable("student");
		if (flat) {
			FlatXmlDataSet.write(dataSet, new FileOutputStream(file));
		} else {
			XmlDataSet.write(dataSet, new FileOutputStream(file));
		}
	}

	/**
	 * 导入数据到student表
	 * 
	 * @param file
	 *            一个标准的java.io.File
	 * @param connection
	 *            一个标准的java.sql.Connection
	 */
	public static void importStudent(File file, Connection connection,
			boolean flat) throws DatabaseUnitException, IOException,
			SQLException {
		IDataSetProducer dataSetProducer = null;
		if (flat) {
			dataSetProducer = new FlatXmlProducer(
					FileHelper.createInputSource(file));
		} else {
			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);
	}

	/**
	 * 导入数据到ROOM表
	 * 
	 * @param file
	 *            一个标准的java.io.File
	 * @param connection
	 *            一个标准的java.sql.Connection
	 */
	public static void importRoomFlat(File file, Connection connection)
			throws DatabaseUnitException, IOException, SQLException {
		IDataSetProducer dataSetProducer = new FlatXmlProducer(
				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);
	}

	public static void main(String[] args) {
		DbUnitTestA op = new DbUnitTestA();
		Connection conn = op.getConnection();
		// op.findStudent("0001");
		// /C:\Users\chenjo\workspace_luna\TT\.
		// System.out.println((new File(".")).getAbsolutePath());
		try {
			importStudent(new File("student_nonflat.xml"), conn, false);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 扁平XML:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <student Id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
  <student Id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
</dataset>

 非扁平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>

 库依赖:

//.classpath
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
	<classpathentry kind="lib" path="lib/mysql-connector-java-5.5.0.jar"/>
	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
	<classpathentry kind="lib" path="H:/Users/chenjo/Downloads/slf4j-1.7.7/slf4j-1.7.7/slf4j-api-1.7.7.jar"/>
	<classpathentry kind="lib" path="H:/Users/chenjo/Downloads/slf4j-1.7.7/slf4j-1.7.7/slf4j-simple-1.7.7.jar"/>
	<classpathentry kind="output" path="bin"/>
</classpath>

 MySQL数据库建立脚本:

# SQL-Front 5.1  (Build 4.16)

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS */;
/*!40014 SET FOREIGN_KEY_CHECKS=0 */;


# Host: localhost    Database: tt
# ------------------------------------------------------
# Server version 5.5.40

#
# Source for table student
#

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `Id` char(4) NOT NULL DEFAULT '',
  `name` char(50) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

#
# Dumping data for table student
#

LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES ('0001','翁仔','m','1979-12-31');
INSERT INTO `student` VALUES ('0002','王翠花','f','1982-08-09');
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

 

  • TT.zip (23.3 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

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

    在“DBUnit最佳实践”中,作者可能还会讨论如何结合使用DBUnit与其他工具,如Ant或Maven构建工具,以及持续集成服务器如Jenkins,来自动化数据备份和恢复的过程。这样可以节省手动操作的时间,并减少人为错误的可能...

    通过DBUNIT做批量对比测试

    在软件开发中,测试是保证代码质量和功能正确性的重要环节,而 DBUNIT 尤其适用于对数据库操作进行测试,特别是在进行批量数据处理时。 批量对比测试在数据库测试中扮演着关键角色,因为往往需要确保大量的数据导入...

    DBUNIT使用

    DBUNIT 使用 DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库...

    使用dbunit测试数据库

    测试结束后,DbUnit 会自动清理这些测试数据,将数据库恢复到原始状态,避免了测试之间的影响。 在实际操作中,测试数据通常存储在一个 XML 文件中,被称为 Seed File。这个文件描述了数据库中表的结构和测试数据。...

    dbunit使用必需Jar包

    1. **准备数据**:使用 DBUnit 导入 XML 文件或 Excel 表格中的测试数据到数据库。 2. **执行测试**:在测试方法中,调用 DBUnit 的 API 运行测试,比如使用 `IDatabaseConnection` 和 `IDataSet` 接口。 3. **验证...

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

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

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

    然后,可以使用 `DatabaseConfig` 来配置 DBUnit 的行为,比如设置失败策略、数据类型处理等。 加载数据集通常是通过 `IDataOperation` 接口的实现,例如 `FlatXMLDataSet` 或 `CSVDataSet`。数据集会被加载到 `...

    dbunit-2.4.9 源码

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

    dbunit使用实例

    DBUnit 是一个开源的 Java 库,专门...通过深入理解和熟练使用 DBUnit,你可以更高效地管理测试数据,确保数据库相关的测试更加稳定和可靠。结合 JUnit 或其他测试框架,DBUnit 能帮助你构建强大的数据库测试解决方案。

    使用DbUnit测试数据库.pdf

    你可以为这个方法编写一个测试,使用DbUnit来控制测试数据。在测试开始前,DbUnit会清空指定表(在这个例子中可能是`student`表)的数据,并根据预先定义的XML数据集填充测试数据。测试结束后,DbUnit会将数据库状态...

    Dbunit数据库连接下载

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

    dbunit帮助文档(HTML版)

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

    DBUnit 进行单元测试

    使用DBUnit,我们可以创建一个数据集(通常为XML或CSV格式),该数据集包含用于初始化数据库的记录。在测试开始前,这些数据会被加载到数据库中,形成一个已知的起点。测试执行完毕后,还可以选择将数据库恢复到初始...

    DBUnit最佳实践之使用ant命令

    以下是一个简单的Ant构建文件(build.xml)片段,展示了如何使用DBUnit进行数据初始化: ```xml &lt;project name="DBUnit-Ant-Example" default="run-dbunit"&gt; &lt;taskdef name="dbunit" classname="org.dbunit.ant....

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

    DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。

    dbunit测试demo

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

    dbunit2.2

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

    DBUnit使用文档

    DBUnit 的核心思想是在执行测试之前清空并填充测试数据,然后在测试完成后恢复原始状态,以确保测试的隔离性和准确性。 在提供的 build.xml 文件中,可以看到 DBUnit 的集成过程。这个 Ant 构建脚本包含了两个主要...

Global site tag (gtag.js) - Google Analytics