Oracle数据库信息通过XML报文传输(oracle XML报文)
Oracle数据库信息通过XML报文传输
随着信息技术的飞速发展,在传统数据库应用中,XML作为一种新型的数据交换和数据描述方式得到了广泛的应用。XML作为一种自然语言的标记方式,简单易懂,符合人类的使用习惯。而且作为一种开放的标准,已被业界广泛接受。在数据库中,Oracle数据库是目前应用最广泛的数据库之一,本文将介绍如何通过XML报文传输Oracle数据库信息。
Oracle数据库支持对XML的原生支持,可以实现将XML数据直接存储到数据库中。同时,Oracle还提供了许多XML API工具,方便我们操作XML数据,例如使用XMLType类型、DOM、SAX等API来读写XML数据。
下面我们将以Java程序为例,演示如何通过XML报文进行Oracle数据库信息的传输。
在Oracle数据库中创建一张名为“employees”的表,表结构如下:
CREATE TABLE employees (
id NUMBER,
name VARCHAR2(100),
salary NUMBER,
hire_date DATE
);
接下来,我们编写一个Java程序来将一条员工记录转换成XML格式的报文。程序如下:
import java.io.StringWriter;
import java.math.BigDecimal;import java.sql.*;
import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;import org.w3c.dom.Element;
public class EmployeeXmlGenerator {
public static void mn(String[] args) {
Connection conn = null; PreparedStatement pstmt = null;
ResultSet rs = null;
try { Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","username","password");
pstmt = conn.prepareStatement("SELECT id, name, salary, hire_date FROM employees WHERE id = ?"); pstmt.setInt(1, 100);
rs = pstmt.executeQuery();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
Element root = doc.createElement("employee"); doc.appendChild(root);
while (rs.next()) { Element id = doc.createElement("id");
id.appendChild(doc.createTextNode(rs.getString("id"))); root.appendChild(id);
Element name = doc.createElement("name"); name.appendChild(doc.createTextNode(rs.getString("name")));
root.appendChild(name);
Element salary = doc.createElement("salary"); salary.appendChild(doc.createTextNode(rs.getBigDecimal("salary").toString()));
root.appendChild(salary);
Element hireDate = doc.createElement("hire_date"); hireDate.appendChild(doc.createTextNode(rs.getDate("hire_date").toString()));
root.appendChild(hireDate); }
StringWriter sw = new StringWriter(); TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(sw));
System.out.println(sw.toString());
} catch (Exception e) { e.printStackTrace();
} finally { try { rs.close(); } catch (Exception e) { }
try { pstmt.close(); } catch (Exception e) { } try { conn.close(); } catch (Exception e) { }
} }
}
在以上代码中,我们首先在Oracle数据库中查询员工信息,然后使用DocumentBuilderFactory和DocumentBuilder创建一个空的XML文档。创建XML文档的结构如下:
100 John Smith
50000.00 2021-01-01
我们通过Transformer工具,将XML报文输出到控制台。
经过上面的步骤,我们已经成功将一条员工信息转换成了XML格式的报文。接下来,我们将演示如何将这条员工信息传输到远程服务器上。在服务器端,我们可以使用类似于以下的代码来实现信息的接受和存储。
import java.io.*;
import java.net.*;import java.sql.*;
import javax.xml.parsers.*;import org.w3c.dom.*;
public class EmployeeXmlReceiver implements Runnable {
private Socket clientSocket = null;
public EmployeeXmlReceiver(Socket clientSocket) { this.clientSocket = clientSocket;
}
public void run() {
Connection conn = null; PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","username","password");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(clientSocket.getInputStream());
Element root = doc.getDocumentElement();
int id = Integer.parseInt(root.getElementsByTagName("id").item(0).getTextContent()); String name = root.getElementsByTagName("name").item(0).getTextContent();
BigDecimal salary = new BigDecimal(root.getElementsByTagName("salary").item(0).getTextContent()); Date hire_date = Date.valueOf(root.getElementsByTagName("hire_date").item(0).getTextContent());
pstmt = conn.prepareStatement("INSERT INTO employees (id, name, salary, hire_date) VALUES (?, ?, ?, ?)"); pstmt.setInt(1, id);
pstmt.setString(2, name); pstmt.setBigDecimal(3, salary);
pstmt.setDate(4, hire_date);
pstmt.executeUpdate();
} catch (Exception e) { e.printStackTrace();
} finally { try { rs.close(); } catch (Exception e) { }
try { pstmt.close(); } catch (Exception e) { } try { conn.close(); } catch (Exception e) { }
try { clientSocket.close(); } catch (Exception e) { } }
}
public static void mn(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9000);
while (true) { Socket clientSocket = serverSocket.accept();
new Thread(new EmployeeXmlReceiver(clientSocket)).start(); }
}}
在以上代码中,我们创建了一个ServerSocket,并在其中开启了一个循环等待客户端信息的线程。当有客户端连接到该服务器时,线程会启动,将客户端发送的XML报文解析,并将员工信息存储到Oracle数据库中。
综上所述,通过XML报文传输Oracle数据库信息是一种非常便捷和通用的方式,可以在不同系统之间进行信息交换。本文介绍的示例代码只是一个示例,在实际应用中,需要根据具体的需求进行相应的修改和定制化。