概述
什么是JDBC
Java的數據庫連接接口。它是Java API中的一部分,通過它可以將Java程序和關系數據庫集成在一起。
應用程序通過調用JDBC來操作數據庫的過程,其實是由數據庫廠商提供的JDBC驅動程序來負責的。如果要更換數據庫,只要更換驅動程序,并在JDBC中載入新的驅動程序來源,即可完成數據庫系統的變更。
JDBC允許任何使用Java語言編寫的小應用程序或應用程序訪問數據庫。通過使用SQL語句可以對數據庫中的數據進行相應的插入、刪除和更新操作。
JDBC由Java語言編寫的相關類和接口組成
驅動程序 DriverManager類、Driver 接口與特定數據庫連接 Connection接口
執行SQL語句 Statement接口、PreparedStatement接口
提供數據庫信息 DatabaseMetaData接口
結果集 ResultSet接口
DriverManager類,用來管理JDBC驅動程序,主要用于跟蹤和加載驅動程序并負責選取數據庫驅動程序和建立新的數據庫連接
Driver 接口,每個驅動程序類必須實現的接口。該接口可以將API的調用映射到數據庫的操作
Connection接口,用來連接應用程序與指定的數據庫
Statement接口,用來執行靜態SQL語句并得到SQL語句并得到執行后的結果
PreparedStatement接口,用來返回有關數據、數據庫和驅動程序等與底層數據庫有關的信息
DatabaseMetaData接口,提供對數據庫表的訪問,執行查詢后返回的結果集。通過ResultSet對象是通過執行一個查詢數據庫的語句生成
連接
jdbc:<protocol>:<DatabaseName>
在連接數據庫時,需要找到使用JDBC驅動程序類的名稱。不同的數據庫供應商的數據庫產品都有自己的驅動程序,不同數據庫的URL和驅動程序也有所不同。
使用Java與數據庫連接進行數據存取的過程:加載驅動程序-->Collection建立連接(連接數據庫)-->創建Statement對象(執行SQL語句)-->取得ResultSet結果集
具體過程
(1)首先要加載當前數據源的驅動程序。通常使用Class.forName()方法加載
(2)建立數據庫的連接。可以通過DriverManager類中的getConnection方法來實現與數據庫的連接。conn = DriverManager.getConnection(url, userNamew, password);
(3)建立連接后就可以使用SQL語句對數據庫進行訪問。這就需要創建Statement對象。通過該對象可以執行相應的SQL語句并將其操作于數據庫
stmt = conn.createStatement();
(4)將SQL語句執行后的結果返回。執行的查詢結果可以以ResultSet結果集的形式返回ResultSet rs = stmt.executeQuery(sqlSelect);
(5)對結果集進進行處理。例如,我們可以通過使用一個while循序獲得結果集中的所有記錄while (rs.next()) { String str1 = rs.getString(1); ? ?String str2 = rs.getString(2); ?}
(6)關閉數據庫的連接。在執行完數據庫的操作之后,需要將與數據庫連接有關的對象關閉。主要包括Statement對象、Connection對象等。
? ? stmt.close(); conn.close();API詳解
注冊驅動(應用)Class.forName("com.mysql.jdbc.Driver");
獲得連接對象(應用)getConnection("jdbc:mysql://localhost:3306/day07",root,root)
獲得執行sql的statement對象(應用)
createStatement()返回的是Statement接口
Statement接口執行操作
* executeUpdate(sql)
* executeQuery(sql)
prepareStatement(sql),返回PreparedStatement接口,預編譯SQL語句
PreparedStatement 是Statement的子接口
* 使用它可以解決sql注入問題
* 執行SQL方法:
executeQuery()
executeUpdate()
setInt(?的位置,值)
遍歷結果集(應用)next() ?, ?getInt() ? , ?getString()
釋放資源 ? 調用close方法
PreparedStatement對象滾動結果集
可以將游標定位到任意位置
PrepareStatement pstmt = conn.prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
ResultSet對象處理結果集
方法
ResultSetMetaData getMetaData() 檢索此ResultSet對象的列的編號、類型和屬性boolean getBoolean(int columnIndex) 以Java編程語言中boolean的形式檢索此ResultSet對象的當前行中指定列的值
float getFloat(int columnIndex) 以Java編程語言中float的形式檢索
int getInt(int columnIndex) 以Java編程語言中int的形式檢索此ResultSet對象的當前行中指定列的值
String getString(int columnIndex) 以Java編程語言中String的形式檢索此ResultSet對象的當前行中指定列的值
boolean next() 將指針從當前位置下移一行
ResultSet接口中還提供了一些方法用于實現滾動結果集
boolean relative(int rows) 按相對行數移動游標到參數rows指定的行。若游標位于有效行上則返回true
boolean first() 將游標移動到第一行。若游標位于有效行則返回true,若結果集中沒有數據行則返回false
boolean last() 將游標移動到最后一行。若游標位于有效行則返回true,若結果集中沒有數據行則返回false
boolean next() 將游標移動到當前位置的下一行。若新當前行有效,則返回true;若不存在,則返回false
boolean previous() 將游標移動到ResultSet對象的上一行。若該行有效則返回true,若不在結果集中則返回false
boolean isFirst() 判斷游標是否在此ResultSet對象的第一行。如果是則返回true
boolean isLast() 判斷游標是否在此ResultSet對象的最后一行。如果是則返回true
boolean isBeforeFirst() 判斷游標是否在此ResultSet對象的第一行之前,如果是則返回true
boolean isAfterLast() 判斷游標是否在此ResultSet對象的最后一行之后,如果是則返回true
void beforeFirst() 將游標移動到此ResultSet對象第一行之前
void afterLast() 將游標移動到此ResultSet對象的最后一行之后
更新結果集
方法
void insertRow() 將插入行的內容插入到此 ResultSet 對象和數據庫中。當指針位于插入時才可以調用該方法
void updateRow() 用此 ResultSet 對象的當前行的新內容更新底層數據庫
void deleteRow() 將當前行從此 ResultSet 對象和底層數據庫中刪除
void cancelRowUpdates() 取消對 ResultSet對象中的當前行所作的更新。此方法在調用更新方法之后,調用updateRow方法之前調用才可以實現對行所作的更新。如果在updateRow方法之后調用該方法,則不能取消對行所做的更新
void moveToCurrentRow() 將游標移動到當前行。只有游標位于插入行上時,調用此方法才有效
void moveToInsertRow() 將游標移動到ResultSet 對象中插入行
核心API
Driver
Connection
Statement
? ? PreparedStatement
? ? CallableStatement
ResultSet
RowSet
DatabaseMetaData
ResultSetMetaData
Types
SQLException
JDBC批處理
Statement批處理
PreparedStatement批處理
大數據處理
處理CLOB數據
處理BLOB數據
JDBC處理事務與數據庫連接池
JDBC處理事務
只有當事務中的所有操作都正常完成,整個事務才能被提交到數據庫中,如果有一項操作沒有完成,則整個事務會被撤銷。
針對JDBC處理事務的操作,在Connection接口中,提供了三個相關的方法
setAutoCommit(boolean autoCommit)
commit()
rollback()
數據庫連接池
什么是數據庫連接池
為了避免頻繁的創建數據庫連接,工程師們提出了數據庫連接池技術。
為了避免頻繁的創建數據庫連接,工程師們提出了數據庫連接池技術。
DataSource接口
Connection getConnection()?
Connection getConnection(String username, String password)
我們習慣性的把實現了javax.sql.DataSource接口的類稱為數據源,顧名思義,數據源即數據的來源。在數據源中存儲了所有建立數據庫連接的信息。
DBCP數據源
commons-pool.jar包
commons-dbcp.jar包
?commons-dbcp.jar包中包含兩個核心類,分別是BasicDataSourceFactory和BasicDataSource,它們都包含獲取DBCP數據源對象的方法。
編寫配置文件
配置文件 xx.properties中有命名格式要求
driverClassName
url
username
password
BasicDataSource是DataSource接口的實現類,主要包括設置數據源對象的方法。
方法
void?setDriverClassName(String?driverClassName) 設置連接數據庫的驅動名稱
void?setUrl(String?url) 設置連接數據庫的路徑
void?setUsername(String?username) 設置數據庫的登陸賬號
void?setPassword(String?password) 設置數據庫的登錄密碼
void setInitialSize(int?initialSize) 設置數據庫連接池初始化的連接數目
void setMaxActive (int?maxIdle) 設置數據庫連接池最大活躍的連接數目
void setMinIdle(int?minIdle) 設置數據庫連接池最小閑置的連接數目
Connection getConnection() 從連接池中獲取一個數據庫連接
?當使用DBCP數據源時,首先得創建數據源對象,數據源對象的創建方式有兩種
1.通過BasicDataSource類直接創建數據源對象
使用BasicDataSource類創建一個數據源對象,手動給數據源對象設置屬性值,然后獲取數據庫連接對象。
2.通過讀取配置文件創建數據源對象
使用BasicDataSourceFactory工廠類讀取配置文件,創建數據源對象,然后獲取數據庫連接對象。
C3P0數據源
我們在使用C3P0數據源開發時,需要了解C3P0中DataSource接口的實現類ComboPooledDataSource,它是C3P0的核心類,提供了數據源對象的相關方法。
方法
void setDriverClass() 設置連接數據庫的驅動名稱void setJdbcUrl() 設置連接數據庫的路徑
void setUser() 設置數據庫的登陸賬號
void setPassword() 設置數據庫的登錄密碼
void setMaxPoolSize() 設置數據庫連接池最大的連接數目
void setMinPoolSize() 設置數據庫連接池最小的連接數目
void setInitialPoolSize() 設置數據庫連接池初始化的連接數目
Connection getConnection() 從數據庫連接池中獲取一個連接
當使用C3P0數據源時,首先得創建數據源對象,創建數據源對象可以使用ComboPooledDataSource類,該類有兩個構造方法,分別是ComboPooledDataSource()和ComboPooledDataSource(String configName)
1.通過ComboPooledDataSource類直接創建數據源對象
?使用ComboPooledDataSource類直接創建一個數據源對象,手動給數據源對象設置屬性值,然后獲取數據庫連接對象
2.通過讀取配置文件創建數據源對象
通過ComboPooledDataSource (String configName)構造方法讀取c3p0-config.xml配置文件,創建數據源對象,然后獲取數據庫連接對象。