java读取xml数据库配置文件--利用dom4j.jar

来源:互联网 发布:铭心科技SEO 编辑:程序博客网 时间:2024/05/16 00:28

一、相关说明

最近在写一个分布式查询的框架,其中涉及读数据库集群配置文件部分,在这里单独列出来。
平时写代码访问数据库都是直接把数据库ip、端口号、数据库名称还有用户名等写进代码里面,这样做的坏处就是每当数据库ip、端口号等信息变化,都要找到相对应的代码处进行修改。这是很不方便的,现在都是采用配置文件的方式记录数据库的信息。那么记录在配置文件中的数据库配置信息该怎么读取呢?这就是此博文所要讲的。

二、准备工作

1.dom4j.jar

dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。关于dom4j的介绍和下载,请点击这里。 这个链接里面对其有很详细的介绍,同时还有对xml操作的介绍。

2.获取xml数据库集群配置文件路径

获取xml的路径,通常我们是直接把文件的绝对路径写入代码中,这样做的劣势很明显:每当工程文件夹移动了,要想成功运行该工程就要在代码中修改下xml文件的路径。
有一个获取文件路径的好方法:Class.gerResource()和ClassLoader.getResource().我的程序中只使用了后者。关于这两者的使用方法,请点击这里。

三、读取xml配置文件

1.工程一览图

整个工程在这里下载,点击下载。

2.common/commonFunc.java

package common;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.TimeZone;public class CommonFunc {public static long StringToLong(String time){SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd H:m:s");format.setTimeZone(TimeZone.getTimeZone("UTC"));long result=0;try{Date date = format.parse(time);Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));            cal.setTime(date);            result = cal.getTimeInMillis();}catch(Exception e){System.out.println("StringToLong error");}return result;}}

3.config/dbcp.xml

<?xml version="1.0" encoding="UTF-8"?><!--连接数据库集群的配置文件--><ConnectionPool><!-- 各节点存储数据的时间范围,顺序一定不能乱--><TimeRange><node1><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node1><node2><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node2><node3><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node3><node4><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node4><node5><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node5><node6><startTime>2013-1-1  00:00:14</startTime><endTime>2013-1-10  03:28:25</endTime></node6></TimeRange><!-- 各个节点的连接信息 --><ConnectionInfo><node1><nodeName>node1</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node1><node2><nodeName>node2</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node2><node3><nodeName>node3</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node3><node4><nodeName>node4</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node4><node5><nodeName>node5</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node5><node6><nodeName>node6</nodeName><url>192.168.0.202:5000</url><dbName>xiamen</dbName><tableName>st_objectstates_xiamengps1</tableName></node6></ConnectionInfo></ConnectionPool>
设计视图:

4.connectDB/NodeInfo.java

package connectDB;public class NodeInfo {public NodeInfo() {// TODO Auto-generated constructor stub}public String nodeName=null;public String url=null;public String dbName=null;public String tableName=null;public long startTime=0;public long endTime=0;}

5.connectDB/ReadConfig.java

ReadConfig.java是读取配置文件的类,这个要结合配置文件的格式来看这个代码。

package connectDB;import java.io.File;import java.util.ArrayList;import java.util.Iterator;  import org.dom4j.Document;  import org.dom4j.DocumentException;import org.dom4j.Element;  import org.dom4j.io.SAXReader; import common.CommonFunc;public class ReadConfig {// xml文件所在路径private String xmlFilePath;public ReadConfig(String xmlFilePath) {this.xmlFilePath=xmlFilePath;}//读取xml文件,返回一个dom对象private Document getDoc(){Document result =null;File configFile=new File(xmlFilePath);if(configFile.exists()){SAXReader reader=new SAXReader();try {result=reader.read(configFile);} catch (DocumentException e) {e.printStackTrace();}}return result;}public ArrayList<NodeInfo> readConfig(){Document doc=getDoc();if(doc==null)return null;ArrayList<NodeInfo>result=new ArrayList<NodeInfo>();Element root = doc.getRootElement();Element timeRange=root.element("TimeRange");Element connectionInfo=root.element("ConnectionInfo");Iterator<?> timeRItr = timeRange.elementIterator();Iterator<?> connInfoItr = connectionInfo.elementIterator();while(timeRItr.hasNext()){Element timeInfoNode=(Element)timeRItr.next();Element connInfoNode=(Element)connInfoItr.next();NodeInfo nodeInfo=new NodeInfo();nodeInfo.startTime=CommonFunc.StringToLong(timeInfoNode.elementText("startTime"));nodeInfo.endTime=CommonFunc.StringToLong(timeInfoNode.elementText("endTime"));// 默认“TimeRange”以下节点顺序与“ConnectionInfo”以下节点信息是一致的,所以,dbcp.xml文件的顺序要注意这一点nodeInfo.nodeName=connInfoNode.elementText("nodeName");nodeInfo.dbName=connInfoNode.elementText("dbName");nodeInfo.url=connInfoNode.elementText("url");nodeInfo.tableName=connInfoNode.elementText("tableName");result.add(nodeInfo);}return result;}}

6.main/testFunc.java

package main;import java.net.URISyntaxException;import java.util.ArrayList;import java.util.ListIterator;import connectDB.NodeInfo;import connectDB.ReadConfig;public class testFunc {public static void main(String[] args) {// TODO Auto-generated method stubtry {String xmlFilePath=testFunc.class.getClassLoader().getResource("config/dbcp.xml").toURI().getPath();ReadConfig readXml=new ReadConfig(xmlFilePath);ArrayList<NodeInfo> nodesInfo=readXml.readConfig();ListIterator<NodeInfo> list=nodesInfo.listIterator();while(list.hasNext()){System.out.println(list.next().nodeName);}} catch (URISyntaxException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
这个类里面获取了xml数据库集群配置文件的地址,请结合工程一览图中dbcp.xml文件的位置来看这行代码。



0 0
原创粉丝点击