在我们大多数需要开发的软件中,我们无不需要连接到数据库,当然,有时候我们将这些链接信息放到类中,而更多时候我们都是放到xml文件中,今天我们就一起来学习一下怎样通过dom4j读取配置文件,进行连接数据库。
dom4j是什么?这个我们要去查,百度的解释是:dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
说了一堆,一句话,其实就是在说它是一个API,用来读取xml文件。
接下来我们就通过程序运行的顺序来看看,它是怎么连接到数据库的。
1.需要连接到的配置文件,sys-config.xml
<pre name="code" class="java"><pre name="code" class="html"><span style="font-family:KaiTi_GB2312;font-size:18px;"><config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@127.0.0.1:1521:myOracle</url>
<user-name>jinbo</user-name>
<password>123</password>
</db-info>
</config></span>
2.数据库连接类:DbUtil类,从这个类我们调到了XmlConfigReader类。
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class DbUtil {
/**
* 取得connection
*/
public static Connection getConnection(){
Connection conn=null;
try {
JdbcConfig jdbcConfig=XmlConfigReader.getInstance().getJdbcConfig();
Class.forName(jdbcConfig.getDriverName());
conn=DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}</span>
3.XMLConfigReader类.
这里我们用到了单例模式,并且我们知道单例模式分为两种饿汉式和懒汉式,用单例模式保证了我们只会实例化一个对象。
并且单例模式有三个重点:
a)静态的私有的成员变量
b)私有的构造方法
c)公共静态的入口点方法。
并且这里我们用到了dom4j,读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。 从文件读取XML,输入文件名,返回XML文档,read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就代表了整个XML,然后再通过element拿到节点元素。
<span style="font-family:KaiTi_GB2312;font-size:18px;">/*
* 采用单例模式解析sys-config.xml文件
*/
public class XmlConfigReader {
// //饿汉式 上来就new 不管我们用不用,在内存中生成对象。(预先加载)
// private static XmlConfigReader instance=new XmlConfigReader();
//
// private XmlConfigReader(){
//
//
// }
//
// public static XmlConfigReader getInstance(){
//
// return instance;
// }
//懒汉式(延迟加载)
private static XmlConfigReader instance=null;
//保存jdbc相关配置
private JdbcConfig jdbcConfig =new JdbcConfig();
//私有构造方法
@SuppressWarnings("unused")
private XmlConfigReader(){
SAXReader reader =new SAXReader();
InputStream in= Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
Document doc=reader.read(in);
//取得jdbc相关配置信息
Element driverNameElt=(Element)doc.selectObject("/config/db-info/driver-name");
Element urlElt=(Element)doc.selectObject("/config/db-info/url");
Element userNameElt=(Element)doc.selectObject("/config/db-info/user-name");
Element passwordElt=(Element)doc.selectObject("/config/db-info/password");
// String dirverName=driverNameElt.getStringValue();
// String url=driverNameElt.getStringValue();
// String userName=driverNameElt.getStringValue();
//
// String password=driverNameElt.getStringValue();
//设置jdbc相关配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//公共静态入口方法 同步关键字
public static synchronized XmlConfigReader getInstance(){
//可能同时又很多人调用这个方法,不能保证单例的实现,所以需要判断保证
if(instance==null){
instance=new XmlConfigReader();
}
return instance;
}
/*
* 返回jdbc相关配置
*/
public JdbcConfig getJdbcConfig(){
return jdbcConfig;
}
public static void main(String[ ] args){
JdbcConfig jdbcConfig= XmlConfigReader.getInstance().getJdbcConfig();
System.out.println(jdbcConfig);
}
}</span>
4.jdbcconfig类,关于配置数据库的实体类。
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class JdbcConfig {
private String driverName;
private String url;
private String userName;
private String password;
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;
}
@Override
public String toString() {
return this.getClass().getName()+ "{driverName:"+driverName+",url:"+url+",userName:"+userName+"}";
}
}
</span>
这样,我们就读取到了配置文件,这样我们以后的维护会非常方便,只需要修改一下配置文件,而不用去类中修改。
当然也不是一种读取配置文件的方式,还有JDOM,SAX等,如果XML文档较大且不考虑移植性问题建议采用DOM4J;如果XML文档较小则建议采用JDOM;如果需要及时处理而不需要保存数据则考虑SAX。但无论如何,还是那句话:适合自己的才是最好的。