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

XML在不同语言,不同数据源中交换数据已经成为主流。在这些的DRP项目中,王勇也提到了使用XML在不同数据库中交换数据,达到安全,灵活的目的。不过他只是提到有这么一种方法,做了其中的一部分工作。因为感觉这种技术非常实用,这里我把这个过程补充完整。



开发环境:

sql server  2008数据库,Oracle数据库,PL/SQL,MyEclipse开发环境。


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

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

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



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

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

利用sql查询语句

[sql] view plaincopy

    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

    <myRoot> 
      <my> 
        <classNo>07</classNo> 
        <classes>07</classes> 
        <grade>2008</grade> 
        <classSize>90</classSize> 
        <collegeNo>01</collegeNo> 
        <specialtyNo>01001</specialtyNo> 
        <assistant></assistant> 
        <remark>无</remark> 
        <IsEffective>是</IsEffective> 
      </my> 
      <my> 
        <classNo>09</classNo> 
        <classes>音乐</classes> 
        <grade>如:2008</grade> 
        <classSize>90</classSize> 
        <collegeNo>06</collegeNo> 
        <specialtyNo>09</specialtyNo> 
        <assistant></assistant> 
        <remark>无</remark> 
        <IsEffective>是</IsEffective> 
      </my> 
      <my> 
        <classNo>123</classNo> 
        <classes>faf</classes> 
        <grade>如:2008</grade> 
        <classSize>22</classSize> 
        <collegeNo>01</collegeNo> 
        <specialtyNo>234r</specialtyNo> 
        <assistant>234</assistant> 
        <remark>af</remark> 
        <IsEffective>是</IsEffective> 
      </my> 
      <my> 
        <classNo>323</classNo> 
        <classes>33</classes> 
        <grade>20093</grade> 
        <classSize>33</classSize> 
        <collegeNo>01</collegeNo> 
        <specialtyNo>就</specialtyNo> 
        <assistant>234</assistant> 
        <remark>333</remark> 
        <IsEffective>是</IsEffective> 
      </my> 
      <my> 
        <classNo>999</classNo> 
        <classes>信息2班</classes> 
        <grade>2008</grade> 
        <classSize>80</classSize> 
        <collegeNo>01</collegeNo> 
        <specialtyNo>03</specialtyNo> 
        <assistant>234</assistant> 
        <remark>好</remark> 
        <IsEffective>是</IsEffective> 
      </my> 
     
    </myRoot> 


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

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

数据库助手类,负责连接,关闭数据库
[java] view plaincopy

    package com.lsh.testXML; 
     
    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.PreparedStatement; 
    import java.sql.SQLException; 
    /**
     * 数据库工具类
     * @author 李守宏
     *
     */ 
    public class DBUtil { 
     
        /**
         * 取得数据库连接
         * @return
         */  
        public static Connection getConnection() { 
            Connection conn = null; 
            try { 
                Class.forName("oracle.jdbc.driver.OracleDriver"); 
                String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; 
                String username = "drp"; 
                String password = "drp"; 
                conn = DriverManager.getConnection(dbUrl, username, password); 
            } catch (ClassNotFoundException e) { 
                e.printStackTrace(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            } 
            return conn; 
        } 
        //关闭preparedStatement 
        public static void close(PreparedStatement pstmt) { 
            if (pstmt != null) { 
                try { 
                    pstmt.close(); 
                } catch (SQLException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
        //关闭connection 
        public static void close(Connection conn) { 
            if (conn != null) { 
                try { 
                    conn.close(); 
                } catch (SQLException e) { 
                    e.printStackTrace(); 
                }    
            } 
        } 
    } 




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

[java] view plaincopy

    package com.lsh.testXML; 
     
    import java.sql.Connection; 
    import java.sql.PreparedStatement; 
    import java.util.Iterator; 
    import java.util.List; 
     
    import org.dom4j.Document; 
    import org.dom4j.DocumentException; 
    import org.dom4j.Element; 
    import org.dom4j.io.SAXReader; 
    /**
     * 利用dom4j读取xml,再写入到oracel数据库中
     * @作者 李守宏——七期信息技术提高班
     * @创建日期 2012-2-18
     */ 
    public class test { 
     
        /**
         * @param args
         */ 
        public static void main(String[] args) { 
            try { 
                //my.xml位于classpath路径下,也可以放到其他路径,这里只要指明路径就行 
                Document doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("my.XML")); 
                xmlTODB(doc.selectNodes("/myRoot/my")); 
     
            } catch (DocumentException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
         
        private static void xmlTODB(List itemList){ 
            String sql = "insert into classInfo(Classno,Classes,Grade,Classsize,Collegeno,Specialtyno,Assistant,Remark,Iseffective)" + 
                    " values(?,?,?,?,?,?,?,?,?)"; 
            Connection conn = null; 
            PreparedStatement pstmt = null; 
             
            try{ 
                conn = DBUtil.getConnection(); 
                pstmt = conn.prepareStatement(sql); 
            //迭代获取xml每个节点的值,将xml读出的数据看成一个list 
            for(Iterator iter=itemList.iterator();iter.hasNext();){ 
                Element elt = (Element)iter.next(); 
                String classNo = elt.elementText("classNo"); 
                String classes =elt.elementText("classes"); 
                String grade =  elt.elementText("grade"); 
                String classSize = elt.elementText("classSize"); 
                String specialtyNo = elt.elementText("specialtyNo"); 
                String collegeNo = elt.elementText("collegeNo"); 
                String assistant = elt.elementText("assistant"); 
                String remark = elt.elementText("remark"); 
                String isEffective = elt.elementText("IsEffective"); 
                 
                pstmt.setString(1, classNo); 
                pstmt.setString(2, classes); 
                pstmt.setString(3, grade); 
                pstmt.setString(4, classSize); 
                pstmt.setString(5, specialtyNo); 
                pstmt.setString(6, collegeNo); 
                pstmt.setString(7, assistant); 
                pstmt.setString(8, remark); 
                pstmt.setString(9, isEffective); 
     
                pstmt.addBatch(); 
            } 
                pstmt.executeBatch(); 
                System.out.println("ok"); 
            }catch(Exception e){ 
                e.printStackTrace(); 
            }finally{ 
                DBUtil.close(conn); 
                DBUtil.close(pstmt); 
            } 
        } 
    } 


PS:注意在sql中不区分大小写,在xml中区分大小写。

原文地址:http://blog.csdn.net/lsh6688/article/details/7272088

猜你喜欢

转载自ywwan2.iteye.com/blog/1413340