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