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