xml文件在现在的web开发中扮演着重要的角色,从数据库连接配置到其他各种参数的设置,xml文件在反射技术的应用中举足轻重,也正因为xml文件中保存着如此重要的参数,所以对xml文件的读写操作就显得更加重要。下面我们重点讲解一下dom4j完成XML文件导入数据库。
0、带读取的xml文件如下:
1、利用PL/SQL导入SQL脚本,建立Oracle数据库表(表T_XML)结构,用于接收xml导入的数据
2、按照下图,建立目录并导入相应文件
通过引入的相关jar包,实现dom4j技术解析xml文件(dom4j-1.6.1.jar,jaxen-1.1-Beta-6.jar等jar包)。
2.1、把lib中的文件引入到classpath中
test_xmlImport右键properties-- Java Build Path--Libraries--Add External JARs
2.2、DbUtil.java中包含:
xml配置文件。在该配置文件中设置了驱动名称,提供服务的url,用户名以及用户密码等内容
数据库连接、关闭
事务提交、回滚、重置
package com.bjpowernode.xml;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 封装数据常用操作
* @author Administrator
*
*/
public class DbUtil {
/**
* 取得Connection
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
连接字符串(协议名:jdbc,子协议名: oracle:thin 子名称:@localhost:1521:oracleDB)
String url = "jdbc:oracle:thin:@localhost:1521:bjpowern";
String username = "drp1";
String password = "drp1";
获得链接
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库连接
public static void close(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//关闭PreparedStatement
public static void close(Statement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//关闭数据库连接
public static void close(ResultSet rs ) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//事务开始前的准备工作,设置为手动提交
public static void beginTransaction(Connection conn) {
try {
if (conn != null) {
if (conn.getAutoCommit()) {
conn.setAutoCommit(false); //手动提交
}
}
}catch(SQLException e) {}
}
//提交事务
public static void commitTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.commit();
}
}
}catch(SQLException e) {}
}
//回滚事务
public static void rollbackTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.rollback();
}
}
}catch(SQLException e) {}
}
//重置数据库连接,恢复到原来状态
public static void resetConnection(Connection conn) {
try {
if (conn != null) {
if (conn.getAutoCommit()) {
conn.setAutoCommit(false);
}else {
conn.setAutoCommit(true);
}
}
}catch(SQLException e) {}
}
public static void main(String[] args) {
System.out.println(DbUtil.getConnection());
}
}
2.3、TestXMLImport类用于读取XML文件中的信息,并写入数据库表中
package com.bjpowernode.xml;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestXMLImport {
/**
* @param args
*/
public static void main(String[] args) {
//想数据库表T_XML中导入数据的sql语句
String sql = "insert into T_XML(NUMERO, REPOSICION, NOMBRE, TURNOS) values (?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DbUtil.getConnection();
pstmt = conn.prepareStatement(sql);
//找到需要读取的XML文件的位置
Document doc = new SAXReader().read(new File("D:/share/JavaProjects/drp/test_xmlImport/xml/test01.XML"));
//提取XML文件中指定节点的内容
List itemList = doc.selectNodes("/ACCESOS/item/SOCIO");
for (Iterator iter=itemList.iterator(); iter.hasNext();) {
Element el = (Element)iter.next();
String numero = el.elementText("NUMERO");
String reposicion = el.elementText("REPOSICION");
String nombre = el.elementText("NOMBRE");
List turnosList = el.elements("TURNOS");
StringBuffer sbString = new StringBuffer();
for (Iterator iter1=turnosList.iterator(); iter1.hasNext();) {
Element turnosElt = (Element)iter1.next();
String lu = turnosElt.elementText("LU");
String ma = turnosElt.elementText("MA");
String mi = turnosElt.elementText("MI");
String ju = turnosElt.elementText("JU");
String vi = turnosElt.elementText("VI");
String sa = turnosElt.elementText("SA");
String doo = turnosElt.elementText("DO");
sbString.append(lu + "," + ma + "," + mi + "," + ju + "," + vi + "," + sa + "," + doo);
}
pstmt.setString(1, numero);
pstmt.setString(2, reposicion);
pstmt.setString(3, nombre);
pstmt.setString(4, sbString.toString());
//把这条执行语句加到PreparedStatement对象的批处理命令中
pstmt.addBatch();
}
//把以上添加到批处理命令中的所有命令一次过提交给数据库来执行
pstmt.executeBatch();
System.out.println("将XML导入数据库成功!");
} catch (Exception e) {
e.printStackTrace();
} finally {
DbUtil.close(pstmt);
DbUtil.close(conn);
}
}
}
讨论区:
(1)XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
XPath的作用与我们所常用的sql语句的作用是十分相似的,只不过sql针对的是数据库操作,而XPath主要是针对xml文件的查询定位用的。
(2)dom4j是用于读写XML的API.
(3)之前在写入数据库的时候采用executeUpdate(),而本文中我们采用addBatch(),它们之间有什么区别吗?
pstmt.addBatch()把若干sql语句装载到一起,然后一次送到数据库执行。执行需要很短的时间。
pstmt.executeUpdate() 是一条一条发往数据库执行的。时间都消耗在数据库连接的传输上面。
因为数据库的处理速度是非常惊人的。单次吞吐量很大,执行效率极高。在数据量越大的时候,越能体现前者的优势 。
本文介绍了一个常用的知识点:dom4j完成XML文件导入数据库。文章末尾简要介绍了一些XPath、dom4j的作用。并对比了addBatch()与executeUpdate()
的区别。希望能为您带来一些帮助。
原文:http://blog.csdn.net/zhaolijing2012/article/details/37762523