使用Java實現數據庫編程—07 JDBC
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對象來執行數據庫操作,以提高效率;
使用Java實現數據庫編程—07 JDBC