JDBC原理之层次结构
目錄
- JDBC的層次結構
- 前言
- Collection角色
- Statement角色
- ResultSet角色
- JDBC工作的基本流程
JDBC的層次結構
前言
JDBC API提供了以下接口和類:
- DriverManager: 這個類管理數據庫驅動程序的列表。確定內容是否符合從Java應用程序使用的通信子協議正確的數據庫驅動程序的連接請求。識別JDBC在一定子協議的第一個驅動器將被用來建立數據庫連接。
- Driver: 此接口處理與數據庫服務器通信。很少直接直接使用驅動程序(Driver)對象,一般使用DriverManager中的對象,它用于管理此類型的對象。它也抽象與驅動程序對象工作相關的詳細信息
- Connection:Driver 或者 DriverManager根據連接的url 和參數信息創建Connection實例,用來維持和數據庫的數據通信,如果沒有銷毀或者調用close()對象,此對象和數據庫的對象會一直保持連接;
- Statement:Connection創建Statement對象,表示需要執行的sql語句或者存儲過程;
- ResultSet: 表示Statement執行完SQL語句后返回的結果集。
- SQLException: 這個類用于處理發生在數據庫應用程序中的任何錯誤。
總體而言,JDBC包含以下幾大角色 : Driver、DriverManager、Connection、Statement、ResultSet。這幾大角色之間的層次關系如下圖所示:
Collection角色
在一般實際使用情況下,我們關注的Connection的功能有以下幾點:
1.創建可以執行sql語句或者存儲過程的對象statement,用來和數據庫進行交互;
比如,以下代碼創建了幾種不同類型的Statement:
2.控制sql語句的事務;
Connection默認情況下,對于創建的statement執行的sql語句都是自動提交的,即在statement語句執行完后,自動執行commit操作,將結果影響到物理數據庫。為了滿足更好地事務控制需求,我們也可以手動地控制事務,手動地對statement 的sql語句執行進行提交(commit)或者回滾(rollback)。
String sqlString="insert into tableName(column1,column2) values(value1,value2)"; //加載Oracle數據庫驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); //根據特定的URL,返回可以接受此URL的數據庫驅動對象 Driver driver = DriverManager.getDriver(URL); //使用數據庫驅動創建數據庫連接Connection會話 connection = driver.connect(URL, props); //使用自定義的事務,要設置connection不自動提交 connection.setAutoCommit(false); //創建靜態的sql語句 Statement 對象來將 SQL 語句發送到數據庫。 Statement staticStatement= connection.createStatement(); try{ //執行插入操作 staticStatement.execute(sqlString); staticStatement.getConnection().commit();//和上面的connection等價,statement只有一個創建自身的connection的引用 }catch(Exception e) { //有異常,則rollback staticStatement.getConnection().rollback(); }3.獲取數據庫連接的元數據,即數據庫的整體綜合信息。
連接的數據庫整體信息被封裝在了一個 DatabaseMetaData類型的對象上,可以通過以下代碼獲得:
具體DatabaseMetaData內包含了什么信息,請查看 JDK 的API對DatabaseMetaData的描述。
Statement角色
Statement 的功能在于根據傳入的sql語句,將傳入sql經過整理組合成數據庫能夠識別的sql語句(對于靜態的sql語句,不需要整理組合;而對于預編譯sql語句和批量語句,則需要整理),然后傳遞sql請求,之后會得到返回的結果。
對于查詢sql,結果會以ResultSet的形式返回。
SQL語句可以分為增刪改查(CRUD,Create,Read,Update,Delete)四種形式,JDBC 從對數據更新與否的角度上看,將上面的四種形式分為兩類:查詢類別和更新類別。即:
查詢類別:select 語句
更新類別:Insert 、update、delete語句
對應地,Statement執行sql的幾種形式:
對sql語句類型不進行區分,執行sql語句的方法;
statement提供了execute(String sql)方法支持此種形式,定義如下:
- 如果是執行的sql是查詢類型的select語句,此方法會返回true,需要自己再調用 statement.getResultSet() 方法來獲取 Resultset結果集;
- 如果是執行的更新類的sql語句如 update,delete,insert語句,此方法會返回false,自己調用statement.getUpdateCount() 返回sql語句影響的行數。
對查詢類型的sql語句的執行方法
statement提供了executeQuery(String sql)方法支持此形式,定義如下:
對更新類的sql語句 的執行方法
statement提供了executeUpdate(String sql)方法支持此形式,定義如下:
批量sql的執行方法
有時候需要將一些sql語句一起提交給數據庫,批量執行,statement提供了一些方法,對批量sql的支持:
ResultSet角色
當Statement查詢sql執行后,會得到ResultSet對象,ResultSet對象是sql語句查詢的結果,作為數據庫結果的映射,其映射關系如下圖所示。ResultSet對從數據庫返回的結果進行了封裝,使用迭代器的模式逐條取出結果集中的記錄。其遍歷結果集的基本形式如下:
while(resultSet.next())
{
//傳入列明或者列索引獲取記錄中對應列的值
resultSet.getXXX(param);
}
ResultSet游標的移動和定位:
Resultset 提供了很多游標定位的方法,部分方法已經在下面列出(部分方法,詳情查API):
ResultSet結果集的元數據信息
元信息是指關于 ResultSet 對象中列的類型和屬性信息的對象。可以通過以下方法獲取:
ResultSet.getXXX(param) 、ResultSet.updateXXX()的XXX問題
JDBC中定義了數據庫中的數據類型和java數據類型的映射,用于數據庫和Java數據類型之間的轉換。在使用ResultSet去記錄中的某一列值的時候,用戶要根據數據庫對應列的數據類型地應的java數據類型,否則的話有可能拋出異常。下圖定義了數據庫和Java類型之間的映射:
JDBC工作的基本流程
一個基本的JDBC工作流程,分為以下幾步:
以下是一個簡單的案例:
package com.sxt.reflectdemo05; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;public class DBConnection {static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";static final String USER_NAME = "xyr";static final String PASSWORD = "123456";public static void main(String[] args) {connectionTest(); }public static void connectionTest() {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {// 1.加載類,并注冊驅動器(Driver會注冊到DriverManager中)// 加載Oracle數據庫驅動Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();// 2.根據特定的URL,返回可以接受此URL的數據庫驅動對象Driver driver = DriverManager.getDriver(URL);Properties props = new Properties();props.put("user", USER_NAME);props.put("password", PASSWORD);// 3.使用數據庫驅動創建數據庫連接Connection會話connection = driver.connect(URL, props);// 4.獲得Statement對象statement = connection.createStatement();// 5.執行 sql語句,返回結果resultSet = statement.executeQuery("select * from emp");// 6.處理結果,取出數據while (resultSet.next()) {System.out.println(resultSet.getString(2));}// 7.關閉鏈接,釋放資源} catch (ClassNotFoundException e) {System.out.println("加載Oracle類失敗!");e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 使用完成后管理鏈接,釋放資源,釋放順序應該是: ResultSet ->Statement ->Connectiontry {resultSet.close();} catch (SQLException e) {e.printStackTrace();}try {statement.close();} catch (SQLException e) {e.printStackTrace();}try {connection.close();} catch (SQLException e) {e.printStackTrace();}} } }以上
@Fzxey
轉載于:https://www.cnblogs.com/fzxey/p/10946762.html
總結
以上是生活随笔為你收集整理的JDBC原理之层次结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go-select和switch的使用区
- 下一篇: 2019-5-30-websocket下