一、JDBC概念、體系
JDBC(Java DataBase Connectivity)是一種執行SQL語句的java API,可以爲多種關係數據庫提供統一的訪問接口,能夠以一致的方式連接多種不同的數據庫系統。進而使用標準的SQL語言來存取數據庫中的數據。JDBC能完成下列3個功能:
1.與數據建立連接
2.向數據庫發送SQL指令
3.處理數據庫返回的結果
JDBC API通過數據庫驅動程序管理器(DriverManager)加載具體的數據庫驅動程序。數據庫驅動程序負責與具體數據庫的透明連接。JDBC數據庫驅動程序管理器將確保正確的驅動程序被用於連接數據源。它可以同時支持與不同數據庫的連接。JDBC數據庫驅動程序管理器將標準JDBC指令轉換成適用於不同數據庫的通信網絡協議指令或其他API指令,這種指令的轉換機制,使基於JDBC接口開發的程序可以獨立於數據庫的種類。如果底層的數據庫被更換了,用戶只需要相應的替換程序中所引用的JDBC驅動程序即可。
簡單做了下圖:
DRP中,在MyEclipse中連接Oracle數據庫爲例:
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 取得與數據庫的連接
* @author xujiao
*
*/
public class DbUtil {
public static Connection getConnection(){
Connection conn = null;
try {
//加載驅動程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//訪問數據庫的連接串
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
//連接數據庫用戶名
String username="drp1";
//連接數據庫密碼
String password = "drp1";
//取得與數據庫的連接
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
以上示例中定義了四個與具體數據庫有關的變量,如果要使用其它數據庫只要修改這四個變量就可以了。
如果更換數據庫,爲了避免要修改程序代碼,將這個四個變量放到配置文件中:
1.建立如下配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
<user-name>drp1</user-name>
<password>drp1</password>
</db-info>
</config>
2.將與連接數據庫相關的四個變量,封裝到實體類中
/**
* 建立連接數據庫的相關實體類
* @author xujiao
*
*/
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;
}
}
3.讀取配置文件類:
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;
/**
*採用單例模式解析sys-config.xml
* @author xujiao
*
*/
public class XmlConfigReader {
//懶漢式(延遲加載lazy)
private static XmlConfigReader instance = null;
private JdbcConfig jdbcConfig = new JdbcConfig();
private XmlConfigReader(){
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try{
//取得jdbc相關配置信息
Document doc = reader.read(in);
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");
//設置jdbc相關配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue());
}catch(DocumentException e){
e.printStackTrace();
}
}
public static synchronized XmlConfigReader getInstance(){
if(instance == null){
instance = new XmlConfigReader();
}
return instance;
}
/**
* 返回jdbc相關配置
* @return
*/
public JdbcConfig getJdbcConfig(){
return jdbcConfig;
}
}
4.取得數據庫連接的類package com.bjpowernode.drp.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*取得數據庫的連接
* @author xujiao
*
*/
public class DbUtil {
/**
* 取得Connection
* @return
*/
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();
}
}
}
}
這樣,通過讀取配置文件,就能取得對Oracle的連接,如果要連接其它的數據庫,只需要修改配置文件就可以了。
上述實例是通過實現特定的數據庫協議直接與數據庫通信,所以效率很高,但是當目標數據庫的類型更改時,需要更換JDBC驅動程序,並在本地安裝。大多數的數據庫系統都帶有ODBC驅動程序,在之前的項目中,我們也是通過ODBC驅動程序訪問數據庫。在JAVA中,存在這樣的一個橋,JDBC-ODBC橋使基於JDBC的程序通過傳統的ODBC驅動程序訪問數據庫。但是JDBC-ODBC橋需要引入ODBC訪問層,程序的執行效率會降低,在大、中型系統中並不適用。