在我們大多數需要開發的軟件中,我們無不需要連接到數據庫,當然,有時候我們將這些鏈接信息放到類中,而更多時候我們都是放到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。但無論如何,還是那句話:適合自己的纔是最好的。