1. 程式人生 > >使用Java實現數據庫編程—07 JDBC

使用Java實現數據庫編程—07 JDBC

padding aci 三方 prop oca try 而是 fault 建議

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:
驅動類:oracle.jdbc.driver.OracleDriver
連接串:jdbc:oracle:thin:@127.0.0.1:1521:test
MYSQL:

驅動類:com.mysql.jdbc.Driver
連接串:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

Eg

右側的代碼註意的問題:
報下面的錯誤:
Tue Jul 17 09:35:59 CST 2018 WARN: Establishing SSL connection without server‘s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn‘t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false‘. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

(警告:不建議在沒有服務器身份驗證的情況下建立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語句,

Insertupdatedelete語句,

或是無返回內容的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