在我们大多数需要开发的软件中,我们无不需要连接到数据库,当然,有时候我们将这些链接信息放到类中,而更多时候我们都是放到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。但无论如何,还是那句话:适合自己的才是最好的。