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

原创 2013年12月04日 09:57:18

由于最近工作要对数据库反复的操作,数据扭转完毕之后要将数据还原,因此这是一个很痛苦的过程,自己使用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();
		}
		if(document == null){
			System.out.println("读取文件失败");
		}
		
		StringBuffer sb = new StringBuffer();
		sb.append("insert into "+tableName+" (");
		Element root = document.getRootElement();
		Iterator it = root.elementIterator();
		Element el = (Element)it.next();
		int number = 0;
		Iterator i = el.elementIterator();
		while(i.hasNext()){
			Element sub = (Element)i.next();
//			System.out.println(sub.getName());
			sb.append(sub.getName()+",");
			number++;
		}
//		打印显示的内容——insert into t_user (SSID,NAME,
//		System.out.println(sb.toString());
//		删除最后一个逗号
		String temp = sb.substring(0, sb.length()-1);
		System.out.println(temp);
		StringBuffer result = new StringBuffer(temp);
		result.append(")").append("values(");
		for(int p=0;p<number;p++){
			result.append("?");
			if(p<number-1){
				result.append(",");
			}
		}
		result.append(")");
		System.out.println(result);
	}
	
	/**
	 * 抽象出来的静态方法,解析XML文件,得到插入的SQL语句
	 * @return
	 */
	public static String getSql(){
		// 以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("读取文件失败");
		}
		
		StringBuffer sb = new StringBuffer();
		sb.append("insert into "+tableName+" (");
		Element root = document.getRootElement();
		Iterator it = root.elementIterator();
		Element el = (Element)it.next();
		int number = 0;
		Iterator i = el.elementIterator();
		while(i.hasNext()){
			Element sub = (Element)i.next();
//			System.out.println(sub.getName());
			sb.append(sub.getName()+",");
			number++;
		}
//		打印显示的内容——insert into t_user (SSID,NAME,
//		System.out.println(sb.toString());
//		删除最后一个逗号
		String temp = sb.substring(0, sb.length()-1);
		System.out.println(temp);
		StringBuffer result = new StringBuffer(temp);
		result.append(")").append("values(");
		for(int p=0;p<number;p++){
			result.append("?");
			if(p<number-1){
				result.append(",");
			}
		}
		result.append(")");
		System.out.println(result);
		return result.toString();
	}
	
	/**
	 * 将XML文件的数据插入到数据库中,通过这个类就能够看到效果
	 */
	@Test
	public void xmlDataIntoDB(){
		
		Connection conn = null;
		PreparedStatement pre = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@"+serverIP+":"+serverPort+":"+dbName, username, password);
			System.out.println("连接成功!");
			
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
//		String sql="insert into t_user (SSID,name)values(?,?)";
		String sql=getSql();
		System.out.println("sql----"+sql);
		
		// 以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为根节点孩子节点的迭代器
		int count = 1;
		for (Iterator i = root.elementIterator(); i.hasNext();) {
			Element element = (Element) i.next();
//			根节点的名称
			System.out.println(element.getName());
			String elementName="";
			String elementText="";
			try {
				pre = conn.prepareStatement(sql);
				int num=1;
				for(Iterator it = element.elementIterator(); it.hasNext();){
					Element subElement = (Element)it.next();
					elementName = subElement.getName();
					elementText = subElement.getText();
					System.out.println(elementName +":"+elementText);
//					如果是日期类型的字符串需要转换为日期类型
					if(MAP_DATE.get(elementName)!=null){
						//使用当前系统的时间
//						java.util.Date utilDate = new java.util.Date();
//						java.sql.Date date = new java.sql.Date( utilDate .getTime());
//						System.out.println("date----"+date);
//						pre.setDate(num, date);
						String temp[] = elementText.split("-");
						//使用下面的格式有点过时了,用Calendar对象代替了Date对象
//						int year = Integer.parseInt(temp[0])-1900;
//						int month  = Integer.parseInt(temp[1])-1;
//						int day = Integer.parseInt(temp[2]);
//						Date date = new Date(year,month,day);
						int year = Integer.parseInt(temp[0]);
						int month  = Integer.parseInt(temp[1])-1;
						int day = Integer.parseInt(temp[2]);
						Calendar c = Calendar.getInstance();
						c.set(year, month, day);
						Date date = c.getTime();
						java.sql.Date time = (java.sql.Date) new java.sql.Date(date.getTime());
						pre.setDate(num, time);
					}
					else if(MAP_INTEGER.get(elementName)!=null){
						pre.setInt(num, 4);
					}else{
						pre.setString(num, elementText);
					}
					
					num++;
				}
				pre.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			count++;
//			这个过程是为了解决一次性读取的数据量比较大,超出打开游标的最大数而抛出异常的解决办法
			if(count > maxCoursor){
				try {
					pre.close();
					pre = conn.prepareStatement(sql);
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
			}
		}
		try {
			pre.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

 

 备注:当插入一定数量之后要关闭preparedStatement,这样是为了解决“oracle超出打开最大游标数

 

工具导出xml文件的格式

<?xml version="1.0" ?>
<ROWDATA>

<ROW>
  <SSID>654971292BD54071A18D8DC3124A9CD0</SSID>
  <NAME>huangbiao</NAME>
</ROW>

<ROW>
  <SSID>0FF29DCB5EEC4C97A1D4EF91D04B9CC3</SSID>
  <NAME>biaobiao</NAME>
</ROW>

</ROWDATA>

 

 

 

 

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

在oracle中通过字段信息生成xml文件

       一般地,在开发xmlp的时候,我们要先用report builder制作rdf模板,然后上传rdf到客户化应用下的reports文件夹下,通过并发请求,输出xml数据,然后保存成xml文...

oracle数据库的xml文件数据查询

  • 2010年12月23日 20:17
  • 1007B
  • 下载

dom4j+xpath读取xml文件配置Oracle数据库连接

今天借助配置Oracle数据库连接的实例,跟大家一起来学习读取xml文件的一种方法(其他读取方法后续介绍)——使用dom4j+xpath。 dom4j是dom4j.org出品的一个开源的XML解析包。...

【java项目实战】dom4j解析xml文件,连接Oracle数据库

dom4j是由dom4j.org出品的一个开源XML解析包。这句话太官方,我们还是看一下官方给出的解释。如下图:                dom4j是一个易于使用的、开源...

【java项目实战】dom4j解析xml文件,连接Oracle数据库

简介        dom4j是由dom4j.org出品的一个开源XML解析包。这句话太官方,我们还是看一下官方给出的解释。如下图:        dom4j是一个易于使用的、开源的,用于解析XML,...

Java读取Oracle数据库并解析成XML文件

package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExc...

Dom4j+PLSQL XML文件导入数据库

之前了解过一篇,是通过Dom4j读取XML文件http://blog.csdn.net/huo065000/article/details/47866461,由于一些原因,我们会遇到一些这样的情况 ,...

用(java或plsql的存储过程)将文件以二进制的形式写入到oracle数据库(适用dwg格式文件)

java  将文件以二进制的形式导入到oracle数据库的blob或long raw格式的字段中。   package com.dsit.zsdw.test; import java.io.Fi...
  • angugu
  • angugu
  • 2012年06月13日 17:19
  • 2045

如何使用PLSQL Developer从oracle数据库 导入导出数据

如何使用PLSQL Developer从oracle数据库 导入导出数据   用pl/sql developer导出表的数据时有三种方式:Oracle Export,Sql Insert,pl/sql...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将plsql导出的XML文件再次还原到oracle数据库
举报原因:
原因补充:

(最多只允许输入30个字)