以前我在写数据库连接的时候,都是在文件里写死的,或者一个简单地配置文件,只有一个数据库连接嘛,但是最近写一个测试工具的时候,需要很多数据库,而且有些还有分库规则,于是查找资料,完善了两个类,和xml的定义规则,分享出来。仅供参考,有任何指教请回复。不胜感谢
首先xml的配置格式定义如下
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<id>oracle-test</id>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@127.0.0.1:1521:test</url>
<user-name>admin</user-name>
<password>admin</password>
</db-info>
<db-info>
<id>mysql-test</id>
<driver-name>com.mysql.jdbc.Driver</driver-name>
<url>jdbc:mysql://127.0.0.1:3306</url>
<user-name>root</user-name>
<password>root</password>
</db-info>
</config>
然后我们有XmlConfigReader类,用来读取这个配置文件,并且返回对应的jdbcConfig对象。
这个对象就是一个model类,对应xml的属性
然后我们的DBUtil类会调用XmlConfigReader,通用的一般是传个
<id>mysql-test</id>
值,然后XmlConfigReader来读取返回,对象,然后在DBUtil里用这个对象得知来构造连接,我添加了一个简单的方法
public static Connection getConnection(String dbId,String dbName) throws ClassNotFoundException
{
Connection conn = null;
try {
//新建jdbc配置类。
XmlConfigReader xcr=new XmlConfigReader();
JdbcConfig jdbcconfig = xcr.getConnection(dbId,dbName);
Class.forName(jdbcconfig.getDriverName());
//取得连接对象。
conn = DriverManager.getConnection(jdbcconfig.getUrl(), jdbcconfig.getUserName(), jdbcconfig.getPassword());
} catch (ClassNotFoundException e) {
// 抛出 exception
e.printStackTrace();
}catch(SQLException e)
{
e.printStackTrace();
}
return conn;
}
就是多传一个数据库名
然后XmlConfigReader哩对应有这个方法
//分库分表使用
public JdbcConfig getConnection(String dbId,String dbName) {
SAXReader reader = new SAXReader();
// 拿到当前线程。
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("sys-config.xml");
try {
Document doc = reader.read(in);
Element rootElt = doc.getRootElement(); // 获取根节点
Iterator<?> iter = rootElt.elementIterator("db-info");
while (iter.hasNext()) {
Element recordEle = (Element) iter.next();
String title: = recordEle.elementTextTrim("id");
if (title.equalsIgnoreCase(dbId)) {
jdbcconfig.setDriverName(recordEle
.elementTextTrim("driver-name"));
jdbcconfig.setUrl(recordEle.elementTextTrim("url")+"/"+dbName);
jdbcconfig.setUserName(recordEle
.elementTextTrim("user-name"));
jdbcconfig.setPassword(recordEle
.elementTextTrim("password"));
}
}
} catch (DocumentException e) {
// 打印错误
e.printStackTrace();
}
return jdbcconfig;
}
jdbcconfig.setUrl(recordEle.elementTextTrim("url")+"/"+dbName);
这里会有一个拼接的操作,比较简单。
这几个类我打包了。由于我是用了maven做包管理,所以org.dom4j这个包自行下载了。。
下载地址:http://pan.baidu.com/s/1o617RAy