日期:2014-05-16  浏览次数:20473 次

将SQLPLUS导出的XML文件再次还原到oracle数据库

由于最近工作要对数据库反复的操作,数据扭转完毕之后要将数据还原,因此这是一个很痛苦的过程,自己使用SQLPLUS工具,导出的数据没有SQL文件,(只导出查询的结果而不是整个数据表,导出表是有SQL文件的,因为数据很多的时候导出表很花费时间,实际工作中只关注自己需要的数据,因此没有必要导出整个表,我这里只是导出查询的结果)只有XML等其他四种文件格式,因此自己写了一个小程序,将导出的XML数据再次插入到数据库中,目的是将原来的数据删除掉,然后再插入,这样数据就还原了(貌似很麻烦,但数据量大了也没有办法)

?

对于上面的问题,个人能力有限,希望看官能给出你们的意见,下面是我代码实现XML导入数据库的过程

?

package hb.dom4j;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
 * 该测试类是将SQLPLUS导出的XML文件插入到数据库中
 * @author huangbiao
 *
 */
public class readXMLIntoDb {
	
	private static String path = "C:\\hb\\hb.xml";
	private static String  tableName="person";
	
	private static String dbName="orcl";
	private static String username="huangbiao";//连接数据库的用户名
	private static String password="huangbiao";//
	private static String serverIP = "127.0.0.1";//数据库的IP地址
	private static String serverPort = "1521";
	
	private static int maxCoursor = 299;
	
	//模拟数据字典的方式,下面字段的格式为日期类型
	public static class DATE{
		public static String BIRTHDAY = "BIRTHDAY";
	}
	
	public static class INTEGER{
		public static String AGE = "AGE";
	}
	//使用Map方式提高运行的效率
	public static Map<String,String> MAP_DATE = null;
	public static Map<String,String> MAP_INTEGER = null;
	
	public void init(){
		if(MAP_DATE == null){
			MAP_DATE = new HashMap<String,String>();
			MAP_DATE.put("BIRTHDAY", DATE.BIRTHDAY);
		}
		if(MAP_INTEGER == null){
			MAP_INTEGER = new HashMap<String,String>();
			MAP_INTEGER.put("AGE", INTEGER.AGE);
		}
	}
	
	public static void main(String[]args){
		readXMLIntoDb x = new readXMLIntoDb();
		x.init();//用来初始化数据
		x.xmlDataIntoDB();
	}
	
	/**
	 * 测试能够正常读取文件
	 */
	@Test
	public void readXML(){
		// 以DOM4J默认的SAX解析器解析
		SAXReader reader = new SAXReader();
		// read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
		Document document=null;
		try {
			document = reader.read(path);
		} catch (DocumentException e) {
			System.out.println("读取文件异常");
			e.printStackTrace();
		}
		if(document == null){
			System.out.println("读取文件失败");
		}
	}
	
	/**
	 * 测试解析XML文件的内容,读取里面的内容
	 */
	@Test
	public void readXMLContent(){
		// 以DOM4J默认的SAX解析器解析
		SAXReader reader = new SAXReader();
		// read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
		Document document=null;
		try {
			document = reader.read(path);
		} catch (DocumentException e) {
			System.out.println("读取文件异常");
			e.printStackTrace();
		}
		if(document == null){
			System.out.println("读取文件失败");
		}
		// 获得根节点
		Element root = document.getRootElement();
		// i为根节点孩子节点的迭代器
		for (Iterator i = root.elementIterator(); i.hasNext();) {
			Element element = (Element) i.next();
//			根节点的名称
			System.out.println(element.getName());
			for(Iterator it = element.elementIterator(); it.hasNext();){
				Element subElement = (Element)it.next();
				System.out.println(subElement.getName()+":"+subElement.getText());
			}
		}
	}
	
	/**
	 * 连接数据库测试
	 */
	@Test
	public void connDB(){
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@"+serverIP+":"+serverPort+":"+dbName, username, password);
			System.out.println("连接成功!");
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试通过DOM4J解析文件拼装的插入SQL语句
	 */
	@Test
	public void getSqlString(){
		// 以DOM4J默认的SAX解析器解析
		SAXReader reader = new SAXReader();
		// read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
		Document document=null;
		try {
			document = reader.read(path);
		} catch (DocumentException e) {
			System.out.println("读取文件异常");
			e.printStackTrace()