利用xml在不同数据库中交换数据

来源:互联网 发布:淘宝卖家怎么贷款 编辑:程序博客网 时间:2024/06/03 18:03

    XML在不同语言,不同数据源中交换数据已经成为主流。XML在不同数据库中交换数据,可以达到安全,灵活的目的。 

   将sql数据库一个表中的数据库导出到xml文件中,再通过dom4j读取xml文件,将xml中的数据写入到Oracle数据库中。

一:分析表结构,建立目标数据库表。

既然是不同的数据库,但是数据库表结果应该是一样的,在实际项目中,一般是首先分析表结构。利用已经存在的xml文件,或者数据库表,在目的数据库中建立对应的表。原数据库与目标数据库的表结构是一致的。

 

二:将sql server数据库中的数据导出成xml文件。

一般情况为了安全起见,不会开放数据库,只能将数据库中的数据导出到xmlSql server导出到xml的方法如下:

利用sql查询语句

[sql] view plaincopy
  1. select * from classInfo for xml path('my'),root('myRoot')  

 

这里的classInfo是表名称,for xml path是关键语句,表示查询结果以xml的形式输出。其中括号和其中的my可以省略。它代表xml文件的一个行目录,每一个my代表数据库的一条记录,my是自己命名的节点名称,可以是任意名称。root('myRoot')代表xml文件的根目录是myRoot,也可以自己命名。


数据库中的记录为:


生成的xml文件为:

[html] view plaincopy
  1. <myRoot>  
  2.   <my>  
  3.     <classNo>07</classNo>  
  4.     <classes>07</classes>  
  5.     <grade>2008</grade>  
  6.     <classSize>90</classSize>  
  7.     <collegeNo>01</collegeNo>  
  8.     <specialtyNo>01001</specialtyNo>  
  9.     <assistant></assistant>  
  10.     <remark></remark>  
  11.     <IsEffective></IsEffective>  
  12.   </my>  
  13.   <my>  
  14.     <classNo>09</classNo>  
  15.     <classes>音乐</classes>  
  16.     <grade>如:2008</grade>  
  17.     <classSize>90</classSize>  
  18.     <collegeNo>06</collegeNo>  
  19.     <specialtyNo>09</specialtyNo>  
  20.     <assistant></assistant>  
  21.     <remark></remark>  
  22.     <IsEffective></IsEffective>  
  23.   </my>  
  24.   <my>  
  25.     <classNo>123</classNo>  
  26.     <classes>faf</classes>  
  27.     <grade>如:2008</grade>  
  28.     <classSize>22</classSize>  
  29.     <collegeNo>01</collegeNo>  
  30.     <specialtyNo>234r</specialtyNo>  
  31.     <assistant>234</assistant>  
  32.     <remark>af</remark>  
  33.     <IsEffective></IsEffective>  
  34.   </my>  
  35.   <my>  
  36.     <classNo>323</classNo>  
  37.     <classes>33</classes>  
  38.     <grade>20093</grade>  
  39.     <classSize>33</classSize>  
  40.     <collegeNo>01</collegeNo>  
  41.     <specialtyNo></specialtyNo>  
  42.     <assistant>234</assistant>  
  43.     <remark>333</remark>  
  44.     <IsEffective></IsEffective>  
  45.   </my>  
  46.   <my>  
  47.     <classNo>999</classNo>  
  48.     <classes>信息2班</classes>  
  49.     <grade>2008</grade>  
  50.     <classSize>80</classSize>  
  51.     <collegeNo>01</collegeNo>  
  52.     <specialtyNo>03</specialtyNo>  
  53.     <assistant>234</assistant>  
  54.     <remark></remark>  
  55.     <IsEffective></IsEffective>  
  56.   </my>  
  57.   
  58. </myRoot>  


:配置开发环境,编写读取XML文件和写入数据库的语句。

上文中已经说到了如何读取xml文件。这里利用dom4j读取配置文件,将xml中的数据读取出来。

数据库助手类,负责连接,关闭数据库

[java] view plaincopy
  1. package com.lsh.testXML;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.SQLException;  
  7. /** 
  8.  * 数据库工具类 
  9.  * @author 李守宏 
  10.  * 
  11.  */  
  12. public class DBUtil {  
  13.   
  14.     /** 
  15.      * 取得数据库连接 
  16.      * @return 
  17.      */   
  18.     public static Connection getConnection() {  
  19.         Connection conn = null;  
  20.         try {  
  21.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  22.             String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
  23.             String username = "drp";  
  24.             String password = "drp";  
  25.             conn = DriverManager.getConnection(dbUrl, username, password);  
  26.         } catch (ClassNotFoundException e) {  
  27.             e.printStackTrace();  
  28.         } catch (SQLException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.         return conn;  
  32.     }  
  33.     //关闭preparedStatement  
  34.     public static void close(PreparedStatement pstmt) {  
  35.         if (pstmt != null) {  
  36.             try {  
  37.                 pstmt.close();  
  38.             } catch (SQLException e) {  
  39.                 e.printStackTrace();  
  40.             }  
  41.         }  
  42.     }  
  43.     //关闭connection  
  44.     public static void close(Connection conn) {  
  45.         if (conn != null) {  
  46.             try {  
  47.                 conn.close();  
  48.             } catch (SQLException e) {  
  49.                 e.printStackTrace();  
  50.             }     
  51.         }  
  52.     }  
  53. }  



执行读取xml和写入oracel数据库的程序:

[java] view plaincopy
  1. package com.lsh.testXML;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7.   
  8. import org.dom4j.Document;  
  9. import org.dom4j.DocumentException;  
  10. import org.dom4j.Element;  
  11. import org.dom4j.io.SAXReader;  
  12. /** 
  13.  * 利用dom4j读取xml,再写入到oracel数据库中 
  14.  * @作者 李守宏——七期信息技术提高班 
  15.  * @创建日期 2012-2-18 
  16.  */  
  17. public class test {  
  18.   
  19.     /** 
  20.      * @param args 
  21.      */  
  22.     public static void main(String[] args) {  
  23.         try {  
  24.             //my.xml位于classpath路径下,也可以放到其他路径,这里只要指明路径就行  
  25.             Document doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("my.XML"));  
  26.             xmlTODB(doc.selectNodes("/myRoot/my"));  
  27.   
  28.         } catch (DocumentException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33.       
  34.     private static void xmlTODB(List itemList){  
  35.         String sql = "insert into classInfo(Classno,Classes,Grade,Classsize,Collegeno,Specialtyno,Assistant,Remark,Iseffective)" +  
  36.                 " values(?,?,?,?,?,?,?,?,?)";  
  37.         Connection conn = null;  
  38.         PreparedStatement pstmt = null;  
  39.           
  40.         try{  
  41.             conn = DBUtil.getConnection();  
  42.             pstmt = conn.prepareStatement(sql);  
  43.         //迭代获取xml每个节点的值,将xml读出的数据看成一个list  
  44.         for(Iterator iter=itemList.iterator();iter.hasNext();){  
  45.             Element elt = (Element)iter.next();  
  46.             String classNo = elt.elementText("classNo");  
  47.             String classes =elt.elementText("classes");  
  48.             String grade =  elt.elementText("grade");  
  49.             String classSize = elt.elementText("classSize");  
  50.             String specialtyNo = elt.elementText("specialtyNo");  
  51.             String collegeNo = elt.elementText("collegeNo");  
  52.             String assistant = elt.elementText("assistant");  
  53.             String remark = elt.elementText("remark");  
  54.             String isEffective = elt.elementText("IsEffective");  
  55.               
  56.             pstmt.setString(1, classNo);  
  57.             pstmt.setString(2, classes);  
  58.             pstmt.setString(3, grade);  
  59.             pstmt.setString(4, classSize);  
  60.             pstmt.setString(5, specialtyNo);  
  61.             pstmt.setString(6, collegeNo);  
  62.             pstmt.setString(7, assistant);  
  63.             pstmt.setString(8, remark);  
  64.             pstmt.setString(9, isEffective);  
  65.   
  66.             pstmt.addBatch();  
  67.         }  
  68.             pstmt.executeBatch();  
  69.             System.out.println("ok");  
  70.         }catch(Exception e){  
  71.             e.printStackTrace();  
  72.         }finally{  
  73.             DBUtil.close(conn);  
  74.             DBUtil.close(pstmt);  
  75.         }  
  76.     }  
  77. }  

PS:注意在sql中不区分大小写,在xml中区分大小写。
原创粉丝点击