用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
在这个方法里使用了事务控制,保证数据的一致性。
有了这两个方法我们可以再发挥一下,然后为客户提供一个备份恢复数据的工具了。如果再加入压缩文件的支持更加完美了。