【Java開發(fā)】嘿馬JavaWeb全技術(shù)開發(fā)第7篇:JDBC,1,JDBC概述【附代碼文檔】

??????教程全知識點(diǎn)簡介:MySQL基礎(chǔ) 1,數(shù)據(jù)庫相關(guān)概念 2,MySQL 3,SQL概述 4,DDL:操作數(shù)據(jù)庫 6,navicat使用 7,DML mysql高級 1,約束 2,數(shù)據(jù)庫設(shè)計 創(chuàng)建部門表 4,事務(wù) JDBC 1,JDBC概述 2,JDBC快速入門 3,JDBC API詳解 4,數(shù)據(jù)庫連接池 Getting Started Mybatis練習(xí) 1,配置文件實(shí)現(xiàn)CRUD HTML&CSS 1,HTML 2,CSS JavaScript 5,BOM 9,RegExp對象 HTTP&Tomcat&Servlet 1,Web概述 2, HTTP 3, Tomcat 4, Servlet 一、狀態(tài)碼大類 二、常見的響應(yīng)狀態(tài)碼 Contributing to Apache Tomcat Code of Conduct How Can I Contribute? 1,Request和Response的概述 2,Request對象 JSP 3,JSP 原理 5,EL 表達(dá)式 6,JSTL標(biāo)簽 會話技術(shù) 1,會話跟蹤技術(shù)的概述 2,Cookie 3,Session 4,用戶登錄注冊案例 Filter&Listener&Ajax 1,F(xiàn)ilter 2,Listener 3,Ajax 4,axios 5,JSON 6,案例 VUE&Element 1,VUE 3,綜合案例 1,功能介紹 2,環(huán)境準(zhǔn)備 3,查詢所有功能 4,添加功能 6,批量刪除 7,分頁查詢


????倉庫code.zip ??直接-->:???https://gitee.com/xiaoshuai112/Backend/blob/master/Java/嘿馬JavaWeb全技術(shù)開發(fā)/note.md ???????

? 本教程項(xiàng)目亮點(diǎn)

?? 知識體系完整:覆蓋從基礎(chǔ)原理、核心方法到高階應(yīng)用的全流程內(nèi)容
?? 全技術(shù)鏈覆蓋:完整前后端技術(shù)棧,涵蓋開發(fā)必備技能
?? 從零到實(shí)戰(zhàn):適合 0 基礎(chǔ)入門到提升,循序漸進(jìn)掌握核心能力
?? 豐富文檔與代碼示例:涵蓋多種場景,可運(yùn)行、可復(fù)用
?? 工作與學(xué)習(xí)雙參考:不僅適合系統(tǒng)化學(xué)習(xí),更可作為日常開發(fā)中的查閱手冊
?? 模塊化知識結(jié)構(gòu):按知識點(diǎn)分章節(jié),便于快速定位和復(fù)習(xí)
?? 長期可用的技術(shù)積累:不止一次學(xué)習(xí),而是能伴隨工作與項(xiàng)目長期參考


??????全教程總章節(jié)


??????本篇主要內(nèi)容

JDBC

今日目標(biāo)

  • 掌握J(rèn)DBC的的CRUD
  • 理解JDBC中各個對象的作用
  • 掌握Druid的使用

1,JDBC概述

在開發(fā)中 使用的是java語言,那么勢必要通過java語言操作數(shù)據(jù)庫中的數(shù)據(jù)。這就是接下來要學(xué)習(xí)的JDBC。

1.1 JDBC概念

JDBC 就是使用Java語言操作關(guān)系型數(shù)據(jù)庫的一套API

全稱:( Java DataBase Connectivity ) Java 數(shù)據(jù)庫連接

<img src="https://upload-images.jianshu.io/upload_images/29644671-f4dfc7c9067a31ca.png" alt="image-20210725130537815" style="zoom:80%;" />

開發(fā)的同一套Java代碼是無法操作不同的關(guān)系型數(shù)據(jù)庫,因?yàn)槊恳粋€關(guān)系型數(shù)據(jù)庫的底層實(shí)現(xiàn)細(xì)節(jié)都不一樣。如果這樣,問題就很大了,在公司中可以在開發(fā)階段使用的是MySQL數(shù)據(jù)庫,而上線時公司最終選用oracle數(shù)據(jù)庫, 就需要對代碼進(jìn)行大批量修改,這顯然并不是 想看到的。 要做到的是同一套Java代碼操作不同的關(guān)系型數(shù)據(jù)庫,而此時sun公司就指定了一套標(biāo)準(zhǔn)接口(JDBC),JDBC中定義了所有操作關(guān)系型數(shù)據(jù)庫的規(guī)則。眾所周知接口是無法直接使用的, 需要使用接口的實(shí)現(xiàn)類,而這套實(shí)現(xiàn)類(稱之為:驅(qū)動)就由各自的數(shù)據(jù)庫廠商給出。

1.2 JDBC本質(zhì)

  • 官方(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫的規(guī)則,即接口
  • 各個數(shù)據(jù)庫廠商去實(shí)現(xiàn)這套接口,提供數(shù)據(jù)庫驅(qū)動jar包
  • 可以使用這套接口(JDBC)編程,真正執(zhí)行的代碼是驅(qū)動jar包中的實(shí)現(xiàn)類

1.3 JDBC好處

  • 各數(shù)據(jù)庫廠商使用相同的接口,Java代碼不需要針對不同數(shù)據(jù)庫分別開發(fā)
  • 可隨時替換底層數(shù)據(jù)庫,訪問數(shù)據(jù)庫的Java代碼基本不變

以后編寫操作數(shù)據(jù)庫的代碼只需要面向JDBC(接口),操作哪兒個關(guān)系型數(shù)據(jù)庫就需要導(dǎo)入該數(shù)據(jù)庫的驅(qū)動包,如需要操作MySQL數(shù)據(jù)庫,就需要再項(xiàng)目中導(dǎo)入MySQL數(shù)據(jù)庫的驅(qū)動包。如下圖就是MySQL驅(qū)動包

<img src="https://upload-images.jianshu.io/upload_images/29644671-c26527d231310453.png" alt="image-20210725133015535" style="zoom:90%;" />

2,JDBC快速入門

先來看看通過Java操作數(shù)據(jù)庫的流程

<img src="https://upload-images.jianshu.io/upload_images/29644671-8ca73806c83b8530.png" alt="image-20210725163745153" style="zoom:80%;" />

第一步:編寫Java代碼

第二步:Java代碼將SQL發(fā)送到MySQL服務(wù)端

第三步:MySQL服務(wù)端接收到SQL語句并執(zhí)行該SQL語句

第四步:將SQL語句執(zhí)行的結(jié)果返回給Java代碼

2.1 編寫代碼步驟

  • 創(chuàng)建工程,導(dǎo)入驅(qū)動jar包

    <img src="https://upload-images.jianshu.io/upload_images/29644671-c26527d231310453.png" alt="image-20210725133015535" style="zoom:90%;" />

  • 注冊驅(qū)動

Class.forName("com.mysql.jdbc.Driver");
  • 獲取連接

    Connection conn = DriverManager.getConnection(url, username, password);
    

    Java代碼需要發(fā)送SQL給MySQL服務(wù)端,就需要先建立連接

  • 定義SQL語句

    String sql =  “update…” ;
    
  • 獲取執(zhí)行SQL對象

Javadoc 工具

執(zhí)行SQL語句需要SQL執(zhí)行對象,而這個執(zhí)行對象就是Statement對象

Statement stmt = conn.createStatement();

Jenkov Java 教程

  • 執(zhí)行SQL

    stmt.executeUpdate(sql);  
    
  • 處理返回結(jié)果

  • 釋放資源

2.2 具體操作

  • 創(chuàng)建新的空的項(xiàng)目

<img src="https://upload-images.jianshu.io/upload_images/29644671-f6db4b3f7867188c.png" alt="image-20210725165156501" style="zoom:70%;" />

  • 定義項(xiàng)目的名稱,并指定位置

<img src="" alt="image-20210725165220829" style="zoom:70%;" />

  • 對項(xiàng)目進(jìn)行設(shè)置,JDK版本、編譯版本

<img src="https://upload-images.jianshu.io/upload_images/29644671-54312a4682f9e4ef.png" alt="image-20210725165349564" style="zoom:70%;" />

Oracle Java 教程

  • 創(chuàng)建模塊,指定模塊的名稱及位置

<img src="https://upload-images.jianshu.io/upload_images/29644671-9acee0923d8d0442.png" alt="image-20210725165536898" style="zoom:70%;" />

  • 導(dǎo)入驅(qū)動包

    將mysql的驅(qū)動包放在模塊下的lib目錄(隨意命名)下,并將該jar包添加為庫文件

<img src="" alt="image-20210725165657556" style="zoom:80%;" />

  • 在添加為庫文件的時候,有如下三個選項(xiàng)
    • Global Library : 全局有效
    • Project Library : 項(xiàng)目有效
    • Module Library : 模塊有效

<img src="https://upload-images.jianshu.io/upload_images/29644671-0ef2550f68f63c6b.png" alt="image-20210725165751273" style="zoom:80%;" />

  • 在src下創(chuàng)建類

<img src="https://upload-images.jianshu.io/upload_images/29644671-cd6f506a89222c4f.png" alt="image-20210725170004319" style="zoom:70%;" />

  • 編寫代碼如下

Mustache Java

/**
 * JDBC快速入門
 */
public class JDBCDemo {

    public static void main(String[] args) throws Exception {
        //1. 注冊驅(qū)動
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 獲取連接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定義sql
        String sql = "update account set money = 2000 where id = 1";
        //4. 獲取執(zhí)行sql的對象 Statement
        Statement stmt = conn.createStatement();
        //5. 執(zhí)行sql
        int count = stmt.executeUpdate(sql);//受影響的行數(shù)
        //6. 處理結(jié)果
        System.out.println(count);
        //7. 釋放資源
        stmt.close();
        conn.close();
    }
}

3,JDBC API詳解

3.1 DriverManager

DriverManager(驅(qū)動管理類)作用:

  • 注冊驅(qū)動

    registerDriver方法是用于注冊驅(qū)動的,但是 之前做的入門案例并不是這樣寫的。而是如下實(shí)現(xiàn)

    Class.forName("com.mysql.jdbc.Driver");
    

    查詢MySQL提供的Driver類,看它是如何實(shí)現(xiàn)的,源碼如下:

    <img src="https://upload-images.jianshu.io/upload_images/29644671-333e63089361dcf2.png" alt="image-20210725171635432" style="zoom:70%;" />

    在該類中的靜態(tài)代碼塊中已經(jīng)執(zhí)行了 DriverManager 對象的 registerDriver() 方法進(jìn)行驅(qū)動的注冊了,那么 只需要加載 Driver 類,該靜態(tài)代碼塊就會執(zhí)行。而 Class.forName("com.mysql.jdbc.Driver"); 就可以加載 Driver 類。

    ==提示:==

    • MySQL 5之后的驅(qū)動包,可以省略注冊驅(qū)動的步驟
    • 自動加載jar包中META-INF/services/java.sql.Driver文件中的驅(qū)動類
  • 獲取數(shù)據(jù)庫連接

    參數(shù)說明:

    • url : 連接路徑

      語法:jdbc:mysql://ip地址(域名):端口號/數(shù)據(jù)庫名稱?參數(shù)鍵值對1&參數(shù)鍵值對2…

      示例:jdbc:mysql://127.0.0.1:3306/db1

      ==細(xì)節(jié):==

      • 如果連接的是本機(jī)mysql服務(wù)器,并且mysql服務(wù)默認(rèn)端口是3306,則url可以簡寫為:jdbc:mysql:///數(shù)據(jù)庫名稱?參數(shù)鍵值對

      • 配置 useSSL=false 參數(shù),禁用安全連接方式,解決警告提示

    • user :用戶名

    • poassword :

3.2 Connection

Connection(數(shù)據(jù)庫連接對象)作用:

  • 獲取執(zhí)行 SQL 的對象
  • 管理事務(wù)

JUnit 5 用戶指南

3.2.1 獲取執(zhí)行對象

  • 普通執(zhí)行SQL對象

    Statement createStatement()
    

Hibernate ORM 文檔

入門案例中就是通過該方法獲取的執(zhí)行對象。

  • 預(yù)編譯SQL的執(zhí)行SQL對象:防止SQL注入

    PreparedStatement  prepareStatement(sql)
    

    通過這種方式獲取的 PreparedStatement SQL語句執(zhí)行對象是 一會重點(diǎn)要進(jìn)行講解的,它可以防止SQL注入。

  • 執(zhí)行存儲過程的對象

Ehcache 文檔

CallableStatement prepareCall(sql)

通過這種方式獲取的 CallableStatement 執(zhí)行對象是用來執(zhí)行存儲過程的,而存儲過程在MySQL中不常用,所以這個 將不進(jìn)行講解。

3.2.2 事務(wù)管理

先回顧一下MySQL事務(wù)管理的操作:

  • 開啟事務(wù) : BEGIN; 或者 START TRANSACTION;
  • 提交事務(wù) : COMMIT;
  • 回滾事務(wù) : ROLLBACK;

MySQL默認(rèn)是自動提交事務(wù)

接下來學(xué)習(xí)JDBC事務(wù)管理的方法。

Connection幾口中定義了3個對應(yīng)的方法:

  • 開啟事務(wù)

    參與autoCommit 表示是否自動提交事務(wù),true表示自動提交事務(wù),false表示手動提交事務(wù)。而開啟事務(wù)需要將該參數(shù)設(shè)為為false。

  • 提交事務(wù)

  • 回滾事務(wù)

具體代碼實(shí)現(xiàn)如下:

Java Concurrency in Practice

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容