今天借助配置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类,来进行数据库访问了。