目前DRP进行中,视频太多了,必须要一步一步走,一步一步做好总结。现在总结一下采用dom4j解析XML文件实现Java与oracle连接。这里XML可以根据自己需要来自定义.虽然BS中WebConfig也是XML文件、CS中AppConfig也是XML文件,但是使用这些配置信息都必须写在规定好的节点中,明确地使用哪些类来获取信息。这里我们要说得可以说更灵活。XML标签可以自定义,在自定义的类中采用DOM4j和XPath方式来获取信息。
1.实现思路:
没有使用xml时Java和Oracle的连接:
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动
String url = "jdbc:oracle:thin:@localhost:1521:bjpowern"; //连接URL
String username = "drp1";
String password = "drp1";
conn = DriverManager.getConnection(url, username, password); //建立连接
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;*/ }
使用xml文件来实现有什么好处?
需要变动数据库时直接改配置文件不用到代码中去改动了,其实横竖都是改,改配置文件怎么就好了?是因为在程序运行的时候加载XML文件,无需编译XML。这样能提高程序执行效率。
学到现在我意识到了进步就是用心将自己学到的新东西应用到实际中。而不是学了这个以后,还是重复着以前的不好的方法。不再同一个地方摔倒两次。
那么使用了XML文件,我的配置信息就写到了配置文件中。配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:1521:bjpowern</url>
<user-name>drp1</user-name>
<password>drp1</password>
</db-info>
</config>
有了配置文件后,我们要做的就是获取XML文件信息,将他们填到Class.forName(?);conn = DriverManager.getConnection(?, ?, ?);问号的位置,其实你看根本的还是一样,只是换了一种方式而已。那么现在的问题就是如何获取XML文件信息,这里采用dom4j来处理。我们可以用理解HTML的方式来理解XML,XML也是一个Document树。处理树的方法就是dom4j(XML API)。核心代码:
private XmlConfigReader(){
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
Document doc = reader.read(in);
//取得jdbc的相关信息
Element eDriverName = (Element)doc.selectObject("/config/db-info/driver-name");
Element eUrl = (Element)doc.selectObject("/config/db-info/url");
Element eUserName = (Element)doc.selectObject("/config/db-info/username");
Element ePassword = (Element)doc.selectObject("/config/db-info/password");
//设置到实体类中来传递信息
jdbc.setDriverName(eDriverName.getStringValue());
jdbc.setUrl(eUrl.getStringValue()) ;
jdbc.setUserName(eUserName.getStringValue()) ;
jdbc.setPassword(ePassword.getStringValue()) ;
} catch (DocumentException e) {
e.printStackTrace();
}
}
SAXReader是一个可以读取XML文档的信息的类。主要的方法是read方法。通过看API 可以知道read方法的参数可以是File或者Stream。这里我们采用Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");,通过线程的上下文加载类加载XML文件并将它转为InputStream类型。
Document doc = reader.read(in);这句代码可以将信息读到Document里面,然后我们就可以采用XPath的SelectObject方法处理了。我们将处理的结果保存在一个实体类中,让实体类去传递数据到带?的地方。
说了这么多,我用一张图画出我的思路。
2.完整的Demo代码:
DBUtil:
package com.bjpowernode.drp.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 封装数据库常用操作
*
* @author wyj
*
*/
public class DBUtil {
/*
* 取得Connection
*/
public static Connection getConnection() {
/* Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:bjpowern";
String username = "drp1";
String password = "drp1";
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;*/
Connection conn = null;
try {
JdbcConfig jdbc = XmlConfigReader.getInstance().getJdbc();
Class.forName(jdbc.getDriverName());
conn = DriverManager.getConnection(jdbc.getUrl(),jdbc.getUserName(),jdbc.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();
}
}
}
public static void Close(PreparedStatement pstmt){
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void Main(String[] args){
System.out.println(DBUtil.getConnection());
}
}
XMLReader:
package com.bjpowernode.drp.util;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 采用单例模式解释xmlconfig文档
* @author wyj
*
*/
public class XmlConfigReader {
//饿汉式(预先加载)未实现,只是这么框架
/*private static XmlConfigReader instance = new XmlConfigReader();
private XmlConfigReader(){
}
public static XmlConfigReader getInstance(){
return instance;
}*/
//懒汉式(延迟加载)
private static XmlConfigReader instance = null;
private JdbcConfig jdbc = new JdbcConfig();
private XmlConfigReader(){
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
Document doc = reader.read(in);
//取得jdbc的相关信息
Element eDriverName = (Element)doc.selectObject("/config/db-info/driver-name");
Element eUrl = (Element)doc.selectObject("/config/db-info/url");
Element eUserName = (Element)doc.selectObject("/config/db-info/username");
Element ePassword = (Element)doc.selectObject("/config/db-info/password");
//设置到实体类中来传递信息
jdbc.setDriverName(eDriverName.getStringValue());
jdbc.setUrl(eUrl.getStringValue()) ;
jdbc.setUserName(eUserName.getStringValue()) ;
jdbc.setPassword(ePassword.getStringValue()) ;
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static synchronized XmlConfigReader getInstance(){
if (instance == null){
return new XmlConfigReader();
}
return instance;
}
public JdbcConfig getJdbc(){
return jdbc;
}
/* public static void main(String[] args){
}*/
}
XML文件上面已给出。
JdbcEntity:
package com.bjpowernode.drp.util;
/**
* 获取JDBC配置信息的实体类
* @author wyj
*
*/
public class JdbcConfig {
@Override
public String toString() {
return this.getClass().getName() + "{ driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}";
}
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;
}
}
总结:通过画图梳理思路挺好的。以后的知识点都应该像这样颗粒归仓。