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

前端之家收集整理的这篇文章主要介绍了利用XML在不同数据库中交换数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发环境:

sql server2008数据库Oracle数据库PL/sqlMyEclipse开发环境。


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

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

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

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

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

利用sql查询语句

  1. select*fromclassInfoforxmlpath('my'),root('myRoot')

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


数据库中的记录为:


生成xml文件:

[html] copy
@H_403_245@ <myRoot>
  • my>
  • classNo>07</classesgrade>2008classSize>90collegeNo>01specialtyNo>01001assistant>remark>IsEffective>>09>音乐>如:2008>06>123>faf>22>234r>234>af>323>33>20093>>333>999>信息2班>80>03>
  • >

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

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

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

    [java] copy
      packagecom.lsh.testXML; @H_404_463@
    1. importjava.sql.Connection;
    2. @H_404_463@ importjava.sql.DriverManager;
    3. importjava.sql.PreparedStatement;
    4. importjava.sql.sqlException;
    5. /**
    6. @H_404_463@ *数据库工具类
    7. *@author李守宏
    8. *
    9. */
    10. publicclassDBUtil{
    11. /**
    12. *取得数据库连接
    13. *@return
    14. staticConnectiongetConnection(){
    15. Connectionconn=null;
    16. try{
    17. Class.forName("oracle.jdbc.driver.OracleDriver");
    18. @H_404_463@ StringdbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    19. Stringusername="drp";
    20. @H_404_463@ Stringpassword="drp";
    21. conn=DriverManager.getConnection(dbUrl,username,password);
    22. @H_404_463@ }catch(ClassNotFoundExceptione){
    23. e.printStackTrace();
    24. catch(sqlExceptione){
    25. }
    26. returnconn;
    27. //关闭preparedStatement
    28. staticvoidclose(PreparedStatementpstmt){
    29. if(pstmt!=null){
    30. pstmt.close();
    31. }
    32. //关闭connection
    33. voidclose(Connectionconn){
    34. if(conn!= conn.close();
    35. }



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

    copy
      importjava.sql.PreparedStatement;
    1. importjava.util.Iterator;
    2. importjava.util.List;
    3. importorg.dom4j.Document;
    4. importorg.dom4j.DocumentException;
    5. importorg.dom4j.Element;
    6. importorg.dom4j.io.SAXReader;
    7. *利用dom4j读取xml,再写入到oracel数据库
    8. *@作者李守宏——七期信息技术提高班
    9. *@创建日期2012-2-18
    10. */
    11. classtest{
    12. *@paramargs
    13. voidmain(String[]args){
    14. try{
    15. //my.xml位于classpath路径下,也可以放到其他路径,这里只要指明路径就行
    16. Documentdoc=newSAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("my.XML"));
    17. @H_404_463@ xmlTODB(doc.selectNodes("/myRoot/my"));
    18. catch(DocumentExceptione){
    19. //TODOAuto-generatedcatchblock
    20. @H_404_463@ e.printStackTrace();
    21. privatevoidxmlTODB(ListitemList){
    22. Stringsql="insertintoclassInfo(Classno,Classes,Grade,Classsize,Collegeno,Specialtyno,Assistant,Remark,Iseffective)"+
    23. @H_404_463@ "values(?,?,?)";
    24. PreparedStatementpstmt=null;
    25. conn=DBUtil.getConnection();
    26. @H_404_463@ pstmt=conn.prepareStatement(sql);
    27. //迭代获取xml每个节点的值,将xml读出的数据看成一个list
    28. for(Iteratoriter=itemList.iterator();iter.hasNext();){
    29. Elementelt=(Element)iter.next();
    30. @H_404_463@ StringclassNo=elt.elementText("classNo");
    31. Stringclasses=elt.elementText("classes");
    32. @H_404_463@ Stringgrade=elt.elementText("grade");
    33. StringclassSize=elt.elementText("classSize");
    34. @H_404_463@ StringspecialtyNo=elt.elementText("specialtyNo");
    35. StringcollegeNo=elt.elementText("collegeNo");
    36. @H_404_463@ Stringassistant=elt.elementText("assistant");
    37. Stringremark=elt.elementText("remark");
    38. @H_404_463@ StringisEffective=elt.elementText("IsEffective");
    39. pstmt.setString(1,classNo);
    40. pstmt.setString(2,classes);
    41. 3,grade);
    42. 4,classSize);
    43. 5,specialtyNo);
    44. 6,collegeNo);
    45. 7,assistant);
    46. 8,remark);
    47. 9,isEffective);
    48. pstmt.addBatch();
    49. pstmt.executeBatch();
    50. System.out.println("ok");
    51. catch(Exceptione){
    52. finally{
    53. DBUtil.close(conn);
    54. @H_404_463@ DBUtil.close(pstmt);
    55. }

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

    猜你在找的XML相关文章