利用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值