使用Java實現資料庫編程—07 JDBC

来源:https://www.cnblogs.com/HQING/archive/2018/07/21/9347945.html
-Advertisement-
Play Games

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:
驅動類: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對象來執行資料庫操作,以提高效率;

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • static 用法 1.static 變數 static變數又稱為靜態變數,靜態變數保存在方法區靜態域中,一個類的靜態變數被其所有實例共用。 2.static方法 靜態方法不與包含它的任何對象關聯,即使沒有創建對象,也可使用,例: 1 public class StaticTest { 2 3 pu ...
  • ng-app="angular_app" 範圍 ng-controller="angular_controller" 控制器 ng-init="findAll()" 初始化方法 雙向數據綁定 就是angular的ng-model屬性同時具備了表單元素中的name與value兩個屬性,既可以提交表單數 ...
  • static 和 final 關鍵字 對實例變數賦初始值的影響 最近一直在看《深入理解Java虛擬機》,在看完了對象記憶體分配、Class文件格式之後,想深扒一下實例變數是如何被賦上初始值的這個問題的細節。 在2.3.1小節中講對象創建的時候,講到記憶體分配有兩種方式:一種是指針碰撞;另一種是空閑列表。 ...
  • python語言程式設計基礎 習題2.5 ​​​ ...
  • 大道至簡這本書總體來說比較通俗易懂,同時在說明自己觀點的時候引用了許多古代的例子,更加的形象生動有趣,可讀性很強。 前幾章的主要思想如下: 程式=演算法+結構+方法;編程的第一要務是先把事情分析清楚,把事件先後的邏輯關係和依賴關係搞清楚,然後再去寫代碼實現。代碼是不存在的,存在的只是思想。其實演算法是對 ...
  • 一、多進程 1.1 多進程的概念 由於GIL的存在,python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。藉助 ...
  • 今天和大家聊聊golang中怎麼使用rpc,rpc數據傳輸會涉及到gob編碼,所以先講講gob,別擔心,就算你完全沒有接觸過gob與rpc,只要知道rpc的中文是遠程過程調用,剩下的我都能給你講明白(帶你入門不包你精通)! 一、數據結構編碼之gob gob全稱為:Go binary Golang自帶 ...
  • Mysqli面向對象操作資料庫 首先配置一下資料庫: 接著用PHP中的Mysqli擴展庫面向對象查詢這個數據表。 操作分為以下幾個步驟: 連接資料庫 操作資料庫 處理結果 關閉資源 query($sql); //查詢語句返回結果集 while($row=$result fetch_row()){ f ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...