【DRP】採用dom4j完毕XML文件导入数据库

版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/lantingxv_jing/article/details/37762523


    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() 的差别。希望能为您带来一些帮助。



【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/ldxsuanfa/p/10861052.html