1、JDBC:JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,提供連接各種常用資料庫的能力; ●Java是通過JDBC技術實現對各種資料庫訪問的, ●JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,他充當 ...
1、JDBC:JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,提供連接各種常用資料庫的能力;
●Java是通過JDBC技術實現對各種資料庫訪問的,
●JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,他充當了Java應用程式與各種不同資料庫之間進行對話的媒介。
他可以把數據持久性保存,這就是一種持久化機制。持久化:持久化是將程式中的數據在瞬時狀態和持久狀態見轉換的機制。
2、工作原理:
JDBC API:JDBC API由Sun公司提供,其中提供了Java應用程式與各種不同資料庫交互的標準解救, 如Connection(連接)介面、Statement介面、ResultSet(結果集)介面、PrepardStatement介面等。 開發者使用這些JDBC介面進行各類資料庫操作。 |
JDBC Driver Manager:JDBC Driver Manager(驅動程式管理)有Sun公司提供,他是JDBC體繫結構的支柱, 負責管理各種不同的JDBC驅動,把Java應程式連接到相應的JDBC驅動程式上,位於JDK的java.sql包中。 |
JDBC驅動:JDBC驅動有各個資料庫廠商或第三方中間件廠商提供,負責連接各種不同的資料庫。 |
3、JDBC API:JDBC API主要做三件事:與資料庫建立連接、發送SQL語句、處理結果。
(1)DriverManager類:裝載驅動程式,併為創建新的資料庫連接提供支持。
(2)Connection介面:負責連接資料庫並擔任傳送數據的任務。
(3)Statement介面:由Connection產生,負責執行SQL語句。
(4)ResultSet介面:負責保存和處理Statement執行後所產生的查詢結果。
(5)PreparedStatement介面:Statement的子介面,也由Connection產生,同樣負責執行SQL語句。
Statement介面相比,PrepardStatement介面具有高安全性、高性能、高可讀性和高可維護性的優點。
4、JDBC訪問資料庫的步驟:
1)載入JDBC驅動 使用Class.forName( )方法將給定的JDBC驅動類載入到Java虛擬機中。若系統中不存在給定的類,則會引發異常,異常類型:ClassNotFoundExecption。 Class.forName(“JDBC驅動類的名稱”); |
2)與資料庫建立連接 DriverManager類是JDBC的管理層,作用於用戶和驅動程式之間。 Connection con=DriverManager.getConnection(數據連接字元串,資料庫用戶名,密碼); |
3)發送SQL語句,並得到返回結果 一旦建立連接,就使用該連接創建Statement介面的對象,並將SQL語句傳遞給它所連接的是資料庫。 如果是查詢操作,將返回類型為resultSet的結果集,它包含執行SQL查詢的結果, 如果是其他操作,將根據調用的方法的不同返回布爾值或操作影響記錄數目; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM table1;"); |
4)處理返回結果 處理返回結果主要是針對查詢操作的結果集,通過迴圈取出結果集中每條記錄並做相應處理。 while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } |
5、釋放資源 |
5、連接資料庫:
●兩種常用的驅動方式:第一種是JDBC-ODBC橋連方式,適用於個人開發與測試,他通過ODBC與資料庫進行連接。
另一種是純Java驅動方式,它直接同資料庫進行連接,在生產型開發中,推薦使用純Java驅動方式。
◆使用JDBC-ODBC橋連方式連接資料庫:JDBC-ODBC橋連就是將對JDBC API的調用轉換為對另一組資料庫連接(即ODBC)API的調用。
將對JDBC API的調用,轉換為對另一組資料庫連接API的調用 優點:可以訪問所有ODBC可以訪問的資料庫 缺點:執行效率低、功能不夠強大(只能運用於windows平臺服務,可移植性不好)
註意:ERROR - java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 這個問題的原因是類找不到,JDK 1.6中運行上面的代碼是正常的,JDK1.6以後的版本,oracle已經取消了odbc的連接方式,故會報上面的錯誤 解決這個問題也比較簡單,下載資料庫對應的jdbc版本,添加進工程即可 SQL SERVER: 驅動類:com.microsoft.sqlserver.jdbc.SQLServerDriver 連接串:jdbc:sqlserver://localhost:1433;DatabaseName=test ORACLE: 驅動類:com.mysql.jdbc.Driver |
||
Eg: 右側的代碼註意的問題: (警告:不建議在沒有伺服器身份驗證的情況下建立SSL連接。根據MySQL 5.5.45+, 5.6.26+和5.7.6+的要求,如果沒有設置顯式選項,則必須預設建立SSL連接。您需要通過設置useSSL=false顯式地禁用SSL,或者設置useSSL=true併為伺服器證書驗證提供信任存儲。)
解決方法: 這隻是一個警告,更改如下: "jdbc:mysql://localhost:3306/test"; 更改後: "jdbc:mysql://localhost:3306/test?useSSL=false"; |
Eg: package example71; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.apache.log4j.Logger; /** * 使用JDBC-ODBC橋方式建立資料庫連接並關閉 */ public class Test { private static Logger logger = Logger.getLogger(Test.class.getName());
public static void main(String[] args) { Connection conn = null; // 1.載入驅動 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { logger.error(e); }
// 2.建立連接 try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/epet?useSSL=false", "QINGG", "1234"); System.out.println("建立連接成功!"); } catch (SQLException e) { logger.error(e); } finally { // 3.關閉連接 try { if (null != conn) { conn.close(); System.out.println("關閉連接成功!"); } } catch (SQLException e) { logger.error(e); } } } } |
|
附加: 本地的兩種表現方式: 1、localhost 2、127.0.0.1 |
◆使用純Java方式連接資料庫 :由JDBC驅動直接訪問資料庫;
優點:驅動程式完全用Java語言編寫,運行速度快、跨平臺;
缺點:訪問不同的資料庫需要下載專用的JDBC驅動;
常見的錯誤: ●JDBC驅動類的名稱書寫錯誤,出現ClassNotFoundExexption異常; ●數據連接字元串,資料庫名、密碼書寫錯誤、出現SQLException異常; ●資料庫操作結束後,沒有關閉資料庫連接,導致仍占有系統資源; ●關閉資料庫連接語句沒有放到finally語句塊中,導致語句可能沒有被執行; |
|
在實際項目如果使用MySQL資料庫,為了避免可能出現亂碼問題,將指定資料庫連接的編碼集為UTF8 上面的示例資料庫連接URL如下: url= jdbc:mysql://27.0.0.1:3306/epet?useUnicode=true&characterEncoding=utf-8; |
6、Statement介面和ResultSet介面:
獲取Connection對象後就可以進行各種資料庫操作了,此時需要使用Connection對象創建Statement對象。
●Connection介面常用方法
方法名稱 |
作用 |
void close() |
立即釋放此Connection對象的資料庫和JDBC資源 |
Statement createStatement() |
創建一個Statement對象將SQL語句發送到資料庫 |
PreparedStatement preparedStatement(String sql) |
創建一個PreparedStatement對象來將參數化的SQL語句發送到數據 |
boolean isClosed() |
查詢此Connection對象是否已經被關閉 |
●Statement介面常用方法
方法名稱 |
作用 |
ResuultSet executeQuery(String sql) |
可執行SQL查詢獲取ResulSet對象 |
int executeUpdate(String sql) |
可執行插入、刪除、更新的操作,返回值是執行該操作所影響的行數 |
boolean exeute(String sql) |
可執行任意SQL語句,若結果為ResultSet對象,則返回true; 若其為更新計數或者不存在任何結果,則返回false |
●ResuoltSet介面常用方法及作用
方法名稱 |
作用 |
boolean next() |
將游標從當前位置向下移動一行 |
boolean previous() |
將游標從當前位置上移動一行 |
void close() |
關閉ResultSet對象 |
int getInt(int columnIndex) |
以int的形式獲取結果集的那個錢行指定列號的值 |
int getInt(String columnLable) |
以int的形式獲取結果集的那個錢行指定列名的值 |
float getFloat(int columnIndex) |
以float的形式獲取結果集的那個錢行指定列號的值 |
float getFloat(String columnIndex) |
以float的形式獲取結果集的那個錢行指定列名的值 |
String getString(int columnIdex) |
以String的形式獲取結果集的那個錢行指定列號的值 |
String getString(String columnLable) |
以String的形式獲取結果集的那個錢行指定列名的值 |
int getRow() |
得到游標當前所指行的行號 |
boolean absolute(int row) |
游標移動到row指定的行 |
●作為一種好的編程風格,應該在不需要ResultSet對象、Statement對象和Connection對象時顯示的關閉他們; 語法:public void close() throws SQLExecption ●要先按ResultSet結果集,後Statement,最後Connection的順序關閉,因為ResultSet是通過Statement執行SQL命令得到的, 而Statement是需要在創建連接後才可以使用的,所以三者之間存在相互依賴的關係,關閉時也必須按照依存關係進行。 ●用戶如果不關閉ResultSet,當Statement關閉,重新執行或用於從多結果序列中獲取下一個結果時,該ResultSet將被自動關閉 |
7、PreparedStatement 介面:繼承自 Statement介面,比Statement對象使用起來更加靈活,更有效率
●PreparedStatement介面 預編譯的 SQL 語句):
★提高了代碼的可讀性和可維護性
★提高了SQL語句執行的性能
★提高了安全性
方法名稱 |
作用 |
boolean execute() |
在此PreParedStatement對象中執行SQL語句,該語句可以是任何SQL語句 如結果是Result對象,則返回true,如果結果是更新計數或者沒結果,則返回false |
ResultSet executeQuery() |
在此PreParedStatement對象中執行SQL查詢,並返回該查詢生成的ResultSet對象 |
int executeUpdate() |
在此PreParedStatement對象執行SQL語句,該語句必須是DML語句, 如Insert,update或delete語句, 或是無返回內容的sql語句,如DDL語句,返回值是執行該操作所影響的行數。 |
void setInt(int index,int x) |
將指定參數設置為給定Java int值,設置其他類型參數的方法與此類型。 如setFloat(int index,float x)、setDouble(int index,double x)等; |
void setObject(int index,Object x) |
使用給定對象設置指定參數的值。 |
◆使用PreParedStatement操作資料庫的基本步驟:
1、創建PreParedStatement對象:
★通過Connection介面的PreParedStatement(String sql)方法來創建PreParedStatement對象,SQL語句可具有一個或多個輸入參數。
這些參數的值在SQL語句創建時未被指定,而是為每個輸入參數保留一個問好(“?“)作為占位符;
PreParedStatement pstmt=conn.PreParedStatement("UPDATE dog SET health=? ,love=? Where=?");
2、設置每個輸入參數的值:通過調用setXXX()方法來完成,其中XXX是與該參數相應的類型;
setXXX(要設置參數的序數位置(從一開始計數),設置給參數的值);
3、執行SQL語句:
★在設置了各個輸入參數的值後,就可以調用PreParedStatement介面的三個執行方法
(ResultSet executeQuery()、int executeUpdate()、Boolean execute())之一來執行SQL語句;
★註意這三個執行方法和Statement介面中三個方法名稱相同、作用相同但是不需要SQL語句做參數,SQL語句已經在創建對象PreParedStatement時指定了;
Eg: pst.executeUpdate();
★創建PreParedStatement對象時會對SQL語句進行預編譯,所以執行速度要快於Statement對象,因此,如果在程式中需要多次執行SQL語句時,
應該使用PreParedStatement對象來執行資料庫操作,以提高效率;