package com.util;
import com.config.GetTestProperties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
// 数据库备份、恢复服务
public class DBUnit extends DBTestCase {
private final Logger log = Logger.getLogger( DBUnit.class.getClass().getName() );
private String dir_name;
private DBUnit() {
dir_name = GetTestProperties.getDbBackup();
String dbType = GetTestProperties.getDatabasesType();
String dbUsername = GetTestProperties.getDatabasesUsername();
String dbPassword = GetTestProperties.getDatabasesPassword();
String dbUrl = GetTestProperties.getDatabasesUrl();
try {
PropertyConfigurator.configure( CommonMethord.getRealath()
+ "log4j.properties" );
} catch (Exception e) {
e.printStackTrace();
}
CommonMethord.createDir( dir_name );
if (dbType.equals( "mysql" )) {
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
"com.mysql.jdbc.Driverc" );
} else if (dbType.equals( "oracle" )) {
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
"oracle.jdbc.driver.OracleDriver" );
} else {
log.error( "未定义的数据库类型 !" );
}
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, dbUrl );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
dbUsername );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
dbPassword );
}
/**
* 给定数据集
*
* @return
* @throws Exception
*/
@SuppressWarnings("deprecation")
@Override
protected IDataSet getDataSet() throws Exception {
log.info( "init..." );
return new FlatXmlDataSet( new FileInputStream( "" ) );
}
/**
* getSetUpOperation
*
* @return
* @throws Exception
*/
@Override
protected DatabaseOperation getSetUpOperation() throws Exception {
return DatabaseOperation.REFRESH;
}
/**
* getTearDownOperation
*
* @return
* @throws Exception
*/
@Override
protected DatabaseOperation getTearDownOperation() throws Exception {
return DatabaseOperation.NONE;
}
/**
* 给定数据集
*
* @param fileName
* @return
* @throws Exception
*/
@SuppressWarnings("deprecation")
protected IDataSet getDataSet(String fileName) throws Exception {
log.info( "init..." );
return new FlatXmlDataSet( new FileInputStream( fileName ) );
}
/**
* 单表备份,传入表名和备份文件名
*
* @param tbname
* @param xmlFileName
* @throws Exception
*/
public void backupTable(String tbname, String xmlFileName) throws Exception {
IDatabaseConnection connection = getConnection();
try {
QueryDataSet dataSet = new QueryDataSet( connection );
// 将表里的数据导出到 xml文件里
dataSet.addTable( tbname );
// 将表里符合条件的数据导出到xml文件里
// dataSet.addTable("users", "select * from users where id < 4");
// 导出到dbunit.xml文件里
File file = new File( dir_name + File.separator + xmlFileName );
FlatXmlDataSet.write( dataSet, new FileOutputStream( file ) );
log.info( "单表备份完成!" );
} catch (Exception e) {
log.error( "无法连接到数据库服务器" );
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 备份多个数据表 ,英文逗号分隔多个表名
*
* @param tabname
* @param xmlFileName
* @throws Exception
*/
public void backupTables(String tabname, String xmlFileName) throws Exception {
IDatabaseConnection connection = getConnection();
try {
String tbname;
List<String> tbs = CommonMethord.getList( tabname );
QueryDataSet dataSet = new QueryDataSet( connection );
// 添加多个table
for (int i = 0; i < tbs.size(); i++) {
tbname = tbs.get( i );
dataSet.addTable( tbname );
}
// 导出到dbunit.xml文件里
File f_file = new File( dir_name + File.separator + xmlFileName );
FlatXmlDataSet.write( dataSet, new FileOutputStream( f_file ) );
log.info( "多表备份完成!" );
} catch (Exception e) {
log.error( "无法连接到数据库服务器" );
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 备份全部数据表
*
* @param xmlFileName
* @throws Exception
*/
public void backupAllTables(String xmlFileName) throws Exception {
IDatabaseConnection connection = getConnection();
try {
// 如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。
// 则必须通过IDatabaseConnection的createDataSet()来创建IDataSet
IDataSet dataSet = connection.createDataSet();
// 导出到dbunit.xml文件里
File f_file = new File( dir_name + File.separator + xmlFileName );
FlatXmlDataSet.write( dataSet, new FileOutputStream( f_file ) );
// 也可以用FlatDtdDataSet导出一个对应的dtd文件
// FlatDtdDataSet.write(dataSet, new FileOutputStream(
// "dbunit_alltb.dtd"));
} catch (Exception e) {
log.error( "无法连接到数据库服务器" );
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* restoreDb 恢复DB, 在Maven恢复较慢
*
* @param xmlFileName
* @throws Exception
*/
public void restoreDb(String xmlFileName) throws Exception {
IDatabaseConnection connection = getConnection();
log.info( "连接成功!" );
try {
//IDataSet xmlDataSet = new FlatXmlDataSet( new FileInputStream( xmlFileName ) );
File file = new File( dir_name + File.separator + xmlFileName );
IDataSet xmlDataSet = getDataSet( file.getAbsolutePath() );
DatabaseOperation.CLEAN_INSERT.execute( connection, xmlDataSet );
log.info( "数据恢复完成!" );
} catch (Exception e) {
log.error( "无法连接到数据库服务器" );
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 测试
public static void main(String[] args) throws Exception {
DBUnit db = new DBUnit();
// 单表
db.backupTable( "LOG_DATA_01", "LOG_DATA_01" );
// 多表
// db.backupTables( "MENU,P_EAST_LOG,RESMODIFYLOG,ROLE_RIGHT,RULE_TABLE","all" );
// 全表
// db.backupAllTables( "all_table" );
// 恢复数据
// db.restoreDb( "UMG_USER" );
}
}