一、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访问层,程序的执行效率会降低,在大、中型系统中并不适用。