加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:38:12 所属栏目:百科 来源:网络整理
导读:XML 在不同语言,不同数据源中交换数据已经成为主流。在这些的 DRP 项目中,王勇也提到了使用 XML 在不同数据库中交换数据,达到安全,灵活的目的。不过他只是提到有这么一种方法,做了其中的一部分工作。因为感觉这种技术非常实用,这里我把这个过程补充完

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

开发环境:

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


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

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

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

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

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

利用sql查询语句

[sql] view plain copy
  1. select*fromclassInfoforxmlpath('my'),root('myRoot')

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


数据库中的记录为:


生成的xml文件为:

[html] copy
    <myRoot>
  1. my>
  2. 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>
  3. >


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

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

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

[java] copy
    packagecom.lsh.testXML;
  1. importjava.sql.Connection;
  2. importjava.sql.DriverManager;
  3. importjava.sql.PreparedStatement;
  4. importjava.sql.SQLException;
  5. /**
  6. *数据库工具类
  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. StringdbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
  19. Stringusername="drp";
  20. Stringpassword="drp";
  21. conn=DriverManager.getConnection(dbUrl,username,password);
  22. }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. xmlTODB(doc.selectNodes("/myRoot/my"));
  18. catch(DocumentExceptione){
  19. //TODOAuto-generatedcatchblock
  20. e.printStackTrace();
  21. privatevoidxmlTODB(ListitemList){
  22. Stringsql="insertintoclassInfo(Classno,Classes,Grade,Classsize,Collegeno,Specialtyno,Assistant,Remark,Iseffective)"+
  23. "values(?,?,?)";
  24. PreparedStatementpstmt=null;
  25. conn=DBUtil.getConnection();
  26. pstmt=conn.prepareStatement(sql);
  27. //迭代获取xml每个节点的值,将xml读出的数据看成一个list
  28. for(Iteratoriter=itemList.iterator();iter.hasNext();){
  29. Elementelt=(Element)iter.next();
  30. StringclassNo=elt.elementText("classNo");
  31. Stringclasses=elt.elementText("classes");
  32. Stringgrade=elt.elementText("grade");
  33. StringclassSize=elt.elementText("classSize");
  34. StringspecialtyNo=elt.elementText("specialtyNo");
  35. StringcollegeNo=elt.elementText("collegeNo");
  36. Stringassistant=elt.elementText("assistant");
  37. Stringremark=elt.elementText("remark");
  38. 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. DBUtil.close(pstmt);
  55. }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读