此篇博文转于守宏师哥。
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查询语句
select * from classInfo for xml path('my'),root('myRoot')
这里的classInfo是表名称,for xml path是关键语句,表示查询结果以xml的形式输出。其中括号和其中的my可以省略。它代表xml文件的一个行目录,每一个my代表数据库的一条记录,my是自己命名的节点名称,可以是任意名称。root('myRoot')代表xml文件的根目录是myRoot,也可以自己命名。
数据库中的记录为:
生成的xml文件为:
<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中的数据读取出来。
数据库助手类,负责连接,关闭数据库
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数据库的程序:
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中区分大小写。