dom4j+xpath读取xml文件配置Oracle数据库连接

今天借助配置Oracle数据库连接的实例,跟大家一起来学习读取xml文件的一种方法(其他读取方法后续介绍)——使用dom4j+xpath。

dom4j是dom4j.org出品的一个开源的XML解析包。故必须将包“dom4j-1.6.1.jar”拷贝到web-inf/lib下面。

我们采取xpath方式查找,所以必须将包“jaxen-1.1-beta-5.jar”也拷贝到web-inf/lib下面。否则,会报java.lang.NoClassDefFoundError:org/jaxen/JaxenException异常。

拷贝好上面两个包,就可以进行编码了:

1、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:bjpowernode</url>
		<username>lzq</username>
		<password>lzq</password>
	</db-info>
</config>

2、由于配置文件中包含驱动、url、用户名、密码多个信息,解析后需返回多个值。所以我们建立一个JdbcConfig实体类,并设置该的属性分别为上述字段,用于盛放解析xml文件后的信息。

package com.bjpowernode.drp.util;
/**
 * jbdc配置信息
 * @author liuzhengquan
 */
public class JdbcConfig {
	@Override
	//重写toString方法
	public String toString() {
		//这里直接返回的话,方法体内容跟父类一样
		//return super.toString();
		return this.getClass().getName()+ "{driverName:"+driverName+ 
			   ",url:" +url +
			   ",username:" +username+
			   ",password:"+password +"}";
	}
	private String driverName;
	private String url;
	private String username;
	private String password;
	
        //下面这些get和set方法,可以在myEclipse中自动生成。
	public String getDriverName() {
		return driverName;
	}
	public void setDriverName(String driverName) {
		this.driverName = driverName;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

3、万事俱备,下面就可以解析xml文件了。我们在XmlConfigReader类里面进行xml解析。这里我们还用到了一个单例模式。

这里不使用单例模式仍然可以进行解析,是不过是多用户同时解析的时候,会使访问速度降低。故我们在这里使用单例模式。我们这里采用恶汉式单例,也就是说在需要解析的时候,再多该类进行实例化调用。可是由于多个用户同时访问,可能会存在一个用户刚刚初始化一个实例,另一个实例再一次调用。所以这里需要对getInstance()方法进行加锁。

package com.bjpowernode.drp.util;

import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 解析sys-config.xml文件
 * @author liuzhengquan
 */
public class XmlConfigReader {
	
	//懒汉式单例设计模式(延迟加载lazy)
	private static XmlConfigReader instance=null;
	
	//保存jdbc相关配置信息
	private JdbcConfig jdbcConfig=new JdbcConfig();
	
	private XmlConfigReader(){
		//以sax方式读取
		SAXReader reader=new SAXReader();
		
		//拿到当前线程,装载xml文件
		InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-conf.xml");
		try {
			
			//用reader接收输入流,然后返回document,document对应着xml文件
			Document doc=reader.read(in);
			
			/**
			 * xml中数据都在Element中
			 */
			//Oracle驱动
			Element driverNamElt=(Element) doc.selectObject("/config/db-info/driver-name");
			//url
			Element urlElt=(Element) doc.selectObject("/config/db-info/url");
			//用户名
			Element usernameElt=(Element) doc.selectObject("/config/db-info/username");
			//密码
			Element passwordElt=(Element) doc.selectObject("/config/db-info/password");
			
			/**
			 * 取得节点的内容
			 */
			//取得驱动
			jdbcConfig.setDriverName(driverNamElt.getStringValue());
			//取得url
			jdbcConfig.setUrl(urlElt.getStringValue());
			//取得用户名
			jdbcConfig.setUsername(usernameElt.getStringValue());
			//取得密码
			jdbcConfig.setPassword(passwordElt.getStringValue());
		
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	//synchronized(同步关键字)是一个锁,有互斥的作用。一个进程调用的时候,其他的只能等着
	public static synchronized XmlConfigReader getInstance()
	{
		if(instance==null){
			instance=new XmlConfigReader();
		}
		return instance;
	}
	
	/**
	 * 返回jdbc相关配置
	 * @return
	 */
	public JdbcConfig getJdbcConfig(){
		return jdbcConfig;
	} 
	
	/**
	 * 这里测试解析xml配置文件是否成功
	 */
	public static void main(String[] args) {
		JdbcConfig aa=XmlConfigReader.getInstance().getJdbcConfig();
		System.out.println( aa.toString());
	}
}

4、上面类定义了解析xml的方法,下面就可以通过这些配置信息,进行数据库连接:

package com.bjpowernode.drp.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;

/**
 * 封装数据库常用操作
 * @author liuzhengquan
 */
public class Dbutil {
	/**
	 * 取得Connection
	 * @return
	 */
	public static Connection getConnection(){
		/**
		 * 参数不友好,是因为没有引入相关的源码
		 * Class.forName(arg0)
		 */
		Connection conn=null;
		JdbcConfig jdbcConfig=XmlConfigReader.getInstance().getJdbcConfig();
		try {
			Class.forName(jdbcConfig.getDriverName());
			/**
			 * localhost本机地址 或者可以使127.0.0.1 或者可以是IP
			 * master是实例
			 */
			//url
			String url=jdbcConfig.getUrl();
			//用户名
			String username=jdbcConfig.getUsername();
			//密码
			String password=jdbcConfig.getPassword();
			try {
				conn=DriverManager.getConnection(url, username, password);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
        //这里用于测试数据库是否连接成功
        public static void main(String[] args){
		System.out.println(Dbutil.getConnection());
		//DbUtil.getConnection
	}
}

5、至此,我们就可以通过Dbutil类,来进行数据库访问了。

你可能感兴趣的:(oracle,xml,dom4j,xpath)