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