最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的JDBC編程詳解

 更新時(shí)間:2025年09月08日 09:47:17   作者:BUG召喚師  
這篇文章主要介紹了MySQL的JDBC編程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

本文介紹了MySQL數(shù)據(jù)庫(kù)的JDBC操作流程,包括前置知識(shí)、寫(xiě)操作和讀操作的實(shí)現(xiàn)步驟。

內(nèi)容涵蓋:

  • 1)如何創(chuàng)建Maven項(xiàng)目并引入MySQL依賴;
  • 2)URL格式解析;
  • 3)JDBC寫(xiě)操作流程(創(chuàng)建數(shù)據(jù)源、建立連接、構(gòu)造SQL、執(zhí)行更新、釋放資源);
  • 4)使用PreparedStatement防止SQL注入;
  • 5)JDBC讀操作流程(執(zhí)行查詢、處理ResultSet結(jié)果集)。

文章通過(guò)代碼示例詳細(xì)演示了插入、查詢等基本操作,并強(qiáng)調(diào)了資源釋放的順序和SQL語(yǔ)句參數(shù)化的安全性考慮。

一、前置知識(shí)

1. 引入依賴

創(chuàng)建 Maven 項(xiàng)目,同時(shí)在 Maven Respository 中找到 MySQL 的依賴,在 Maven 項(xiàng)目中引入;

    <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
    </dependencies>

2. 認(rèn)識(shí) url

url 是資源在網(wǎng)路上的位置;

以下面 url 為例:

jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSS=false

  • jdbc:mysql 表示 url 的作用,是給 jdbc 操作 mysql 的;
  • 127.0.0.1 表示 IP 地址,描述網(wǎng)絡(luò)上主機(jī)所在的位置;
  • 3306 表示端口號(hào),代表操作網(wǎng)絡(luò)的應(yīng)用程序;
  • myjdbc 表示數(shù)據(jù)庫(kù)名;
  • characterEncoding=utf8 指定字符集為 utf8;
  • useSS=false 表示設(shè)置為不加密;
  • ? 前面表示資源,后面表示訪問(wèn)資源的參數(shù);
  • & 表示參數(shù)間的分隔符,多個(gè)參數(shù)使用這個(gè)符號(hào)分割;

二、JDBC 操作流程

1. JDBC 的寫(xiě)操作

1. 創(chuàng)建數(shù)據(jù)源,設(shè)置好 url,用戶名和密碼;

2. 建立和數(shù)據(jù)庫(kù)服務(wù)器的連接;

3. 構(gòu)造 sql,使用 JDBC 操作數(shù)據(jù)庫(kù)仍然需要手動(dòng)構(gòu)造 sql;

  • 構(gòu)造完 sql 之后需要預(yù)處理 sql 語(yǔ)句,目的是檢查 sql 編寫(xiě)是否正確,避免直接發(fā)給服務(wù)器,導(dǎo)致服務(wù)器報(bào)錯(cuò),浪費(fèi)服務(wù)器資源;
  • 除了檢查 sql 是否正確,還會(huì)解析 sql 得到結(jié)構(gòu)化的數(shù)據(jù),直接把解析好的結(jié)構(gòu)化數(shù)據(jù)發(fā)給數(shù)據(jù)庫(kù)服務(wù)器,服務(wù)器就省下了這部分解析的工作;

4. 把 sql 發(fā)給服務(wù)器,服務(wù)器返回受到影響的行數(shù);

5. 關(guān)閉連接,釋放資源;先獲得的資源后釋放,后獲得的資源先釋放;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

// 在數(shù)據(jù)庫(kù)中插入數(shù)據(jù)
public class Demo1 {
    public static void main(String[] args) throws SQLException {
        // 1. 創(chuàng)建數(shù)據(jù)源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");

        //    設(shè)置用戶名和密碼
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        // 2. 建立和數(shù)據(jù)庫(kù)服務(wù)器之間的連接
        Connection connection = dataSource.getConnection();

        // 3. 構(gòu)造 sql
        String sql = "insert into student values(1, '張三')";
        //    預(yù)處理 sql 語(yǔ)句
        PreparedStatement statement = connection.prepareStatement(sql);
        
        // 4. 把 sql 發(fā)給服務(wù)器
        int n = statement.executeUpdate();

        // 5. 關(guān)閉連接,釋放資源
        statement.close();
        connection.close();
    }
}

更新和刪除記錄的操作和插入的操作步驟相同,只需要更改 sql 語(yǔ)句;

注意:

為了解決 sql 寫(xiě)死的問(wèn)題,代碼中的 sql 是可以拼接參數(shù)的;

但是字符串中拼接上參數(shù),容易被注入 sql 攻擊,為了避免被注入 sql,可以使用占位符 “?”,再調(diào)用 PreparedStatement 的 setInt(), setString() 等方法進(jìn)行替換;

        // 3. 構(gòu)造 sql
        //String sql = "insert into student values(" + id + ", '" + name +"')";
        String sql = "insert into student values (?, ?)";
        //    預(yù)處理 sql 語(yǔ)句 - 檢查 sql 是否存在問(wèn)題
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        statement.setString(2, name);

2. JDBC 的讀操作

讀操作和寫(xiě)操作的主要區(qū)別:

1. sql 語(yǔ)句:需要編寫(xiě)查詢語(yǔ)句;

2. 執(zhí)行 sql 的方法:executeQuery();

3. 執(zhí)行 sql 語(yǔ)句的返回值:返回的結(jié)果集的類型為 ResultSet;

  • ResultSet 默認(rèn)指向第 0 行記錄的前一個(gè)位置,調(diào)用 next() 方法,才會(huì)指向第 0 行記錄;
  • 如果 next() 指向的地方有數(shù)據(jù)記錄,返回 true,否則返回 false;

4. 獲取數(shù)據(jù)記錄的列需要使用 getInt(),getString() 等方法,取決于列的數(shù)據(jù)類型,括號(hào)中填寫(xiě)要獲取臨時(shí)表的列名,如果使用別名,就寫(xiě)別名;

5. 關(guān)閉資源時(shí),要注意關(guān)閉 ResultSet,因?yàn)?ResultSet 是最后打開(kāi)的,因此要最先關(guān)閉;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// jdbc 查詢
public class Demo2 {
    public static void main(String[] args) throws SQLException {
        // 1. 創(chuàng)建數(shù)據(jù)源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 建立連接
        Connection connection = dataSource.getConnection();

        // 3. 編寫(xiě) sql 語(yǔ)句
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 4. 執(zhí)行 sql 語(yǔ)句
        ResultSet resultSet = statement.executeQuery();

        // 5. 遍歷結(jié)果集合
        //    通過(guò) next() 方法,可以獲取臨時(shí)表的每一行數(shù)據(jù),執(zhí)行到最后一行的下一行會(huì)返回 false
        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");

            System.out.println("id = " + id + ", name = " + name);
        }

        // 6. 釋放資源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

 注意:讀操作同樣可以使用占位符,后續(xù)用變量去替換;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL數(shù)據(jù)庫(kù)表的CRUD操作

    MySQL數(shù)據(jù)庫(kù)表的CRUD操作

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)表的CRUD操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • MySQL中int(10)和int(11)的區(qū)別詳解

    MySQL中int(10)和int(11)的區(qū)別詳解

    本文主要介紹了MySQL中int(10)和int(11)的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 關(guān)于JDBC與MySQL臨時(shí)表空間的深入解析

    關(guān)于JDBC與MySQL臨時(shí)表空間的深入解析

    這篇文章主要給大家介紹了關(guān)于JDBC與MySQL臨時(shí)表空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 你還在 Select * 嗎?

    你還在 Select * 嗎?

    這篇文章主要介紹了MySql Select ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • MySQL8.0臨時(shí)表空間的使用及解讀

    MySQL8.0臨時(shí)表空間的使用及解讀

    MySQL 8.0+引入會(huì)話級(jí)(temp_N.ibt)和全局(ibtmp1)InnoDB臨時(shí)表空間,用于存儲(chǔ)臨時(shí)數(shù)據(jù)及事務(wù)日志,自動(dòng)創(chuàng)建與回收,重啟釋放,管理高效
    2025-09-09
  • MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)統(tǒng)計(jì)所有表的空間占用與行數(shù)

    MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)統(tǒng)計(jì)所有表的空間占用與行數(shù)

    這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)統(tǒng)計(jì)所有表的空間占用與行數(shù)的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-02-02
  • MySql忘記密碼修改方式適應(yīng)5.7以上版本

    MySql忘記密碼修改方式適應(yīng)5.7以上版本

    這篇文章主要介紹了MySql忘記密碼修改方式適應(yīng)5.7以上版本,需要的朋友可以參考下
    2017-06-06
  • Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表

    Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表

    在Mysql的范圍分區(qū)表定義中,分區(qū)范圍需要連續(xù)并且不會(huì)有覆蓋,定義范圍分區(qū)表時(shí),使用VALUES LESS THAN操作符,這篇文章主要介紹了Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表,需要的朋友可以參考下
    2024-08-08
  • 一文帶你學(xué)透SQL語(yǔ)言的核心之DML操作

    一文帶你學(xué)透SQL語(yǔ)言的核心之DML操作

    DML(Data?Manipulation?Language)是SQL語(yǔ)言的核心部分,其主要用于對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行增刪改查,在學(xué)習(xí)數(shù)據(jù)時(shí),學(xué)習(xí)DML操作是必不可少的一部分,本文就帶大家詳細(xì)了解SQL語(yǔ)言的核心DML操作,需要的朋友可以參考下
    2023-06-06
  • Mysql常見(jiàn)bug及解決方案超詳細(xì)講解

    Mysql常見(jiàn)bug及解決方案超詳細(xì)講解

    在使用MySQL的過(guò)程中,相比大家都踩過(guò)不少坑,下面這篇文章主要給大家介紹了關(guān)于Mysql常見(jiàn)bug及解決方案超詳細(xì)講解的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評(píng)論

连南| 泊头市| 德令哈市| 吴桥县| 遵义县| 永仁县| 华池县| 招远市| 定结县| 蒙山县| 龙门县| 西乌| 苍山县| 泾源县| 新野县| 敦煌市| 通渭县| 安国市| 元江| 福海县| 承德市| 石台县| 嘉禾县| 滨海县| 南岸区| 镇雄县| 建德市| 略阳县| 祥云县| 布拖县| 儋州市| 长海县| 鲜城| 满城县| 长垣县| 锡林郭勒盟| 庆元县| 澜沧| 龙川县| 禄丰县| 清苑县|