关闭

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

847人阅读 评论(0) 收藏 举报

由于最近工作要对数据库反复的操作,数据扭转完毕之后要将数据还原,因此这是一个很痛苦的过程,自己使用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>

 

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:326190次
    • 积分:8916
    • 等级:
    • 排名:第2245名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:5条
    最新评论