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

1 篇文章 0 订阅

一、相关说明

最近在写一个分布式查询的框架,其中涉及读数据库集群配置文件部分,在这里单独列出来。
平时写代码访问数据库都是直接把数据库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 stub
		try {
			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 block
			e.printStackTrace();
		}
		
	}

}
这个类里面获取了xml数据库集群配置文件的地址,请结合工程一览图中dbcp.xml文件的位置来看这行代码。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值