现在的位置: 首页 > 综合 > 正文

java读取xml文件到数据库

2013年11月04日 ⁄ 综合 ⁄ 共 5041字 ⁄ 字号 评论关闭

  XML(Extensible Markup Language)可扩展标记语言,具有灵活、跨平台的特点,当前处理结构话文档信息的有利工具。

  一、关系型数据库的弊端:

  具有严格的数据及关系定义,缺乏数据模型上的灵活性,难以应对具有复杂、多变结构的数据,只能适合固定的结构化数据。优点是查询速度快,缺点是模型固定,不够灵活,数据交流受限。

  XML数据库:

  XML数据库是XML文档的集合或者说是专门管理XML文档的数据库。XML数据库弥补了关系型数据库的若干不足,但是xml数据库又有它的一些弊端,比如查询速度等。这类数据库主要用于文件系统类型的管理。提供一些参考资料,http://www.etc.edu.cn/articledigest38/chun%20XML.htm这里不做详解。

  二、XML文件的应用场景:

  1、解析配置文件,程序的灵活性:

  对并发处理的性能的要求不是很高,借助jdom或者dom4j来解析这些文件,通常我们把关于数据库的配置放到这里。

<config>
	<db-info>
		<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
		<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
		<user-name>drp1</user-name>
		<password>drp1</password>
	</db-info>
	<dao-factory>
		<item-dao-facotry>com.bjpowernode.drp.basedata.dao.ItemDaoFactory4Oracle</item-dao-facotry>
	
		<user-dao-facotry>com.bjpowernode.drp.basedata.dao.UserDaoFactory4Oracle</user-dao-facotry>
	</dao-factory> 
</config>

  2、数据交流转换:

  是关于javaBean文件的相互映射。因为在系统中的并发量大,访问频率比较高,对性能的要求较高。因此往往需要在某些Servlet初始化的时候,就将一些对象预加载。

  

<beans>
	<bean id="itemDao" name="com.bjpowernode.drp.basedata.dao.ItemDao4OracleImpl"></bean>
	<bean id="itemManager" name="com.bjpowernode.drp.basedata.manager.ItemManagerImpl"></bean>
</beans>


	
  <servlet>
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.bjpowernode.drp.basedata.web.FileUploadServlet</servlet-class>
    <load-on-startup>10</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/servlet/item/FileUploadServlet</url-pattern>
  </servlet-mapping>


  load-on-startup标签就是在初始化的时候的预加载,这里的10表示是Servlet初始化顺序的级别,数值越小越优先,但要是正整数。

  值得注意的是,如果其他的servlet在初始化函数中需要用到其他servlet,往往需要显示调用super方法,否则可能会出现空指针。


  3、跨平台数据交流格式:以上是java程序中常用到xml的地方,在多个语言中,xml还是数据交流的一种数据格式,当然完全可以是跨平台的。

  4、可以作为小数据量的存储。


三、不得不说的XMLHttpRequest对象:

  如果单说这个对象可能会觉得陌生,但是如果提到异步交互,大家就不会觉得陌生了,因为异步交互主要就是靠这个对象来完成的。应该说当前所有的浏览器都已经支持这个对象引擎了。  他的强大在于:

  • 不重新加载页面的情况下更新页面
  • 在页面已加载后,从服务器请求、发送、接收数据

  Ajax使用最多的异步和数据库交互,除了这个最常见的应用,还可以使用XMLHttpRequest对象从xml数据源中读取数据,然后动态的填充到网页上,当然少不了js的支持。http://www.w3school.com.cn/tiy/t.asp?f=xdom_httprequest_js_4


四、使用dom4j解析xml实现数据库访问:  

  1.首先添加dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar的引用。将这两个jar包复制到WEB-INF的子目录lib下。

  2.sys-config.xml中配置:

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<db-info>
		<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
		<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
		<user-name>XXX</user-name>
		<password>XXX</password>
	</db-info>
	
</config>


3.XmlConfigReader类中封装访问数据库的方法:(JdbcConfig是一个封装了数据库连接信息的自定义类)。

public class XmlConfigReader {
	
	//懒汉式(延迟加载lazy)
	private static XmlConfigReader instance = null;


	
	//保存jdbc相关配置信息
	private JdbcConfig jdbcConfig = new JdbcConfig();
	
	private XmlConfigReader() {
		
		SAXReader reader = new SAXReader();
		
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
		try {
			
			Document doc = reader.read(in);
			
			//取得jdbc相关配置信息
			Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
			Element urlElt = (Element)doc.selectObject("/config/db-info/url");
			Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
			Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
			
			//设置jdbc相关的配置
			jdbcConfig.setDriverName(driverNameElt.getStringValue());
			jdbcConfig.setUrl(urlElt.getStringValue());
			jdbcConfig.setUserName(userNameElt.getStringValue());
			jdbcConfig.setPassword(passwordElt.getStringValue());
			
			System.out.println("读取jdbcConfig-->>" + jdbcConfig);
			
				
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}			
	}
	
	
	public static synchronized XmlConfigReader getInstance() {
		if (instance == null) {
			instance = new XmlConfigReader();
		}
		return instance;
	}
	
	/**
	 * 返回jdbc相关配置
	 * @return
	 */
	public JdbcConfig getJdbcConfig() {
		return jdbcConfig;
	}			
}


将来在使用的时候,可以使用下面的语句调用:

JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();


五、dom4j解析xml重点技术解析:

  dom4j用于解析xml,xPath的作用是访问xml节点。SAXReader 对象用于读取数据,InputStream是输入流对象,首先将指定的xml文件读取到流中:

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");


再使用SAXReader 对象的read方法包装成Document对象,这样就可以使用xPath读取xml中的节点了。

读取单个节点是一个Element元素:

Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");


当然可以遍历某些节点的子节点:

假如有这样一个xml结构:

	<dao-factory>
		<item-dao-facotry>com.bjpowernode.drp.basedata.dao.ItemDaoFactory4Oracle</item-dao-facotry>
	
		<user-dao-facotry>com.bjpowernode.drp.basedata.dao.UserDaoFactory4Oracle</user-dao-facotry>
	</dao-factory>


通过xPath读取xml文件到document中后,可以使用document的selectNodes方法来遍历:

private Map<String, String> daoFactoryMap = new HashMap<String, String>();

			//取得DaoFactory信息
			List daoFactorylist = doc.selectNodes("/config/dao-factory/*");
		
			
			for (int i=0; i<daoFactorylist.size(); i++) {
				Element daoFactoryElt = (Element)daoFactorylist.get(i);
				String tagName = daoFactoryElt.getName();
				String tagText = daoFactoryElt.getText();
				System.out.println("读取DaoFactory-->>" + tagText);
				
				//放入到Map中
				daoFactoryMap.put(tagName, tagText);
				
				
			}

daoFactoryMap的定义:

private Map<String, String> daoFactoryMap = new HashMap<String, String>();

这里值得注意的是selectNodes("/config/dao-factory/*")和selectNodes("/config/dao-factory")的区别。如果使用/config/dao-factory路径,得不到item-dao-facotry节点对象,而是dao-factory节点。


总结:

  关于xPath解析xml还有很多语法,这里只是泛泛的介绍一下xml和它在java中的应用并以封装对Oracle数据库的访问为例,熟悉了一下dom4j配合xPath解析xml的方法。

比较详细的xPath解析xml的语法参见:http://zhangjunhd.blog.51cto.com/113473/126310/

抱歉!评论已关闭.