當前位置:網站首頁>MySQL的JDBC編程

MySQL的JDBC編程

2022-07-23 21:58:54Zzt.opkk

MySQL的JDBC編程

1. 數據庫編程的條件

  • 編程語言: Java,C,C++,Python…
  • 數據庫: Oracle,MySQL,SQLServer…
  • 數據庫驅動包: 不同的數據庫,對應不同的編程語言提供不同的數據庫驅動包,
    • 如:MySQL提供了Java的驅動包mysql-connector-java,需要基於Java操作MySQL即需要該驅動包。同樣的,
      要基於Java操作Oracle數據庫則需要Oracle的數據庫驅動包ojdbc .

2. JDBC編程

JDBC,即Java Database Connectivity,java數據庫連接 ,是一種用於執行SQL語句的Java API(計算機中一個相當廣泛使用的術語Application Programming Interface提供了一些函數/方法/類,可以讓程序員直接調用來完成一些功能),稱為"數據庫SDK"(software development kit, SDK概念要更廣泛,除了可以提供API之外,還會提供一些可執行程序(工具)輔助開發/調試…),就可以借助這些API比較方便的訪問數據庫服務器.

對於MySQL/Oracle/SQLServer是客戶端/服務器結構的程序,那麼操作數據庫是通過官方提供的命令行客戶端/圖形化界面/代碼中的哪一個呢?現在主流的操作數據庫方式是通過代碼操控.

在早期不同的的數據庫提供的API都不太一樣,對於程序員十分不友好,於是Java提供一套"標准"的接口體系,讓這些數據庫廠商.提供的API都往Java這套接口體系中進行適配,所以程序員只需要掌握Java這一條API就可以適應所有常見的主流數據庫了.Java的這套操作數據庫的API,就稱為JDBC.

3. JDBC工作原理

JDBC 為多種關系數據庫提供了統一訪問方式,作為特定廠商數據庫訪問API的一種高級抽象,它主要包含一些通用的接口類

JDBC訪問數據庫層次結構:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-M7jd2PDR-1658300956096)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717150318903.png)]

JDBC優勢:

  • Java語言訪問數據庫操作完全面向抽象接口編程
  • 開發數據庫應用不用限定在特定數據庫廠商的API
  • 程序的可移植性大大增强

4. JDBC的使用

4.1 操作數據庫 - 插入

  1. 要操作數據庫,首先要連上數據庫,要想連上數據庫,就得描述數據庫的比特置.在JDBC中,使用DataSource這個類來描述MySQL服務器比特置,

    //DataSource是一個interface,不能直接實例化.而MysqlDataSource則是實現了DataSource,這個類是來自於驅動包.
    //這個操作就是 - 向上轉型
    DataSource dataSource = new MysqlDataSource();
    //連接服務器 - 向下轉型
    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java104?characterEncoding=utf8&useSSL=false");
    

    這裏就會有人有疑問了,為什麼不用直接用MysqlDataSource來實例化對象呢?這樣不是十分方便嗎?

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setUrl();
    

    雖然兩種寫法沒啥區別.但是實際開發中可能還是更多的看到第一種寫法.

    • 第一種寫法裏,得到的數據源是 DataSource類型.後續寫其他代碼,方法/類,如果使用到數據源,持有的類型也是 DataSource類型,DataSource是通用的類型,可以代指任何數據庫.未來一旦需要更換數據庫,代碼改動是非常小的,只需要把實例化這一小塊代碼改了即可,其他代碼都不用變.
    • 第二種寫法,得到的數據源是MysqlDataSource類型.後續的其他代碼,方法/類,如果用到數據源,持有的類型也就是MysqlDataSource,而MysqlDataSource只是針對MySQL的類型.未來一旦更換數據庫,可能就需要把散落在代碼各個地方的MysqIDataSource類型進行修改.

    第一種寫法大大提高代碼的可維護性,可拓展性.

    //MySQL數據連接的URL參數格式如下:
    jdbc:mysql://服務器地址:端口/數據庫名?參數名=參數值
    

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KDaYDy3a-1658300956098)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717155040996.png)]

​ 輸入用戶名和密碼:

((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

所以通過IP地址,端口號,數據庫名,用戶名和密碼就描述數據庫的比特置.

  1. 和數據庫服務器創建連接

在網絡通信中,有兩種風格,一種是’有連接’,相當於"打電話";另一種是’無連接’,相當於"發微信".

數據采用的是"有連接"的方式,主要是能够在通信前,先看看通信的鏈路是否通暢,有個壞處,就是連接需要管理,對於不用的連接需要及時釋放(比如打電話時,忘記掛電話,導致無法斷開連接,話費蹭蹭蹭的留~~).

// 導入import java.sql.Connection包下的Connection類
Connection connection = dataSource.getConnection();
System.out.println(connection);
//如果輸出對象為 [email protected] 的說明連接成功
//還要注意要拋出异常 導入import java.sql.SQLException; 
  1. 操作數據庫

使用SQL語句,利用JDBC來操作數據庫,本質還是用SQL來操作數據庫

// 創建數據庫
create table student(id int primary key, name varchar(20));

String sql = "insert into student values(1, '張三');";

通過PreparedStatement對象來告訴SQL所執行的語句,這個對象的SQL是來自於這個字符串.

PreparedStatement statement = connection.prepareStatement(sql);

還可以通過下面這種方式來填寫:

Scanner in = new Scanner(System.in);
System.out.println("請輸入學號:");
int id = in.nextInt();
System.out.println("請輸入姓名:");
String name = in.next();
String sql = "insert into student values(?, ?);";//? 為占比特符
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id); // 默認從1開始
statement.setString(2, name);
  1. 執行SQL語句
int n = statement.executeUpdate();
System.out.println(n);

這裏insert,update,delete是通過 executeUpdate 來執行, 返回值為整數, 代錶這個操作影響到幾行,select 是通過 executeQuery 來執行.

  1. 斷開連接
statement.close();
connection.close();

注: 後創建的先釋放

4.2 操作

4.2.1 修改記錄

 public static void main(String[] args) throws SQLException {
    
        //1. 找到數據源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

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

        //3. 輸入修改信息
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入修改同學學號:");
        int id = in.nextInt();
        System.out.println("該同學修改後姓名:");
        String name = in.next();

        //3. 構建SQL語句
        String sql = "update student set name = ? where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2, name);

        //4. 執行SQL
        int n = statement.executeUpdate();
        System.out.println(n);

        //5. 關閉資源
        statement.close();
        connection.close();

    }

4.2.2 删除記錄

public static void main(String[] args) throws SQLException {
    
    //1. 找到數據源
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("123456");

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

    //3. 輸入對删除記錄信息
    Scanner in = new Scanner(System.in);
    System.out.println("請輸入删除學生學號:");
    int id = in.nextInt();

    //4. 構建SQL
    String sql = "delete from student where id = ?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setInt(1, id);

    //5. 執行SQL
    int n = statement.executeUpdate();
    System.out.println(n);

    //6. 關閉資源
    statement.close();
    connection.close();
}

4.2.3 查找記錄

    public static void main(String[] args) throws SQLException {
    
        //1. 創建數據源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //2. 和數據庫建立連接
        Connection connection = dataSource.getConnection();

        //3. 不需要輸入

        //4. 構建SQL
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        //5. 執行SQL
        //executeQuery的返回值是ResultSet對象, 可以把它當作一個 臨時錶
        ResultSet resultSet = statement.executeQuery();

        //6. 遍曆結果集
        //把 resultSet 當作迭代器
        while (resultSet.next()) {
    
            // 通過getXXX 方法, 來獲取

            // 取id, id類型為int, 使用getInt
            int id = resultSet.getInt("id");
            //取name, 類型為String 使用getString
            String name = resultSet.getString("name");
            System.out.println(id + ":" + name);
        }

        //7. 關閉資源
        statement.close();
        connection.close();
    }

4.2.4 插入記錄

    public static void main(String[] args) throws SQLException {
    
        //1. 獲取數據庫比特置
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //2. 連接數據庫
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

        //3. 使用SQL語句,利用JDBC來操作數據庫,本質還是通過SQL來操作
        /*String sql = "insert into student values(3, '張三');";*/
        
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入學號:");
        int id = in.nextInt();
        System.out.println("請輸入姓名:");
        String name = in.next();
        String sql = "insert into student values(?, ?);";
        PreparedStatement statement = connection.prepareStatement(sql);

        statement.setInt(1, id);
        statement.setString(2, name);
        
        //4. 執行SQL語句
        // insert,update,delete是通過 executeUpdate 來執行
        // select 是通過 executeQuery 來執行
        // 返回值為整數, 代錶這個操作影響到幾行
        int n = statement.executeUpdate();
        System.out.println(n);
        
        //5. 斷開連接
        statement.close();
        connection.close();
    }

4.3 數據庫的連接

Connection接口實現類由數據庫提供,獲取Connection對象通常有兩種方式 :

  • 通過DriverManager(驅動管理類)的靜態方法獲取
// 加載JDBC驅動程序
Class.forName("com.mysql.jdbc.Driver");
// 創建數據庫連接
Connection connection = DriverManager.getConnection(url);
  • 通過DataSource(數據源)對象獲取。實際應用中會使用DataSource對象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("url");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
Connection connection = dataSource.getConnection();

差別:

  1. DriverManager類來獲取的Connection連接,是無法重複利用的,每次使用完以後釋放資源時,通過connection.close()都是關閉物理連接。
  2. DataSource提供連接池的支持。連接池在初始化時將創建一定數量的數據庫連接,這些連接是可以複用的,每次使用完數據庫連接,釋放資源調用connection.close()都是將Conncetion連接對象回收

4.4 Statement對象

Statement對象主要是將SQL語句發送到數據庫中。JDBC API中主要提供了三種Statement對象

實際開發中最常用的是PreparedStatement對象,以下對其的總結 :

返回值:

  • executeQuery() 方法執行後返回單個結果集的,通常用於select語句
  • executeUpdate()方法返回值是一個整數,指示受影響的行數,通常用於update、insert、delete語句

4.5 ResultSet對象

ResultSet對象它被稱為結果集,它代錶符合SQL語句條件的所有行,並且它通過一套getXXX方法提供
了對這些行中數據的訪問 .

=“C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717203426690.png” alt=“image-20220717203426690” style=“zoom:50%;” />

返回值:

  • executeQuery() 方法執行後返回單個結果集的,通常用於select語句
  • executeUpdate()方法返回值是一個整數,指示受影響的行數,通常用於update、insert、delete語句

4.5 ResultSet對象

ResultSet對象它被稱為結果集,它代錶符合SQL語句條件的所有行,並且它通過一套getXXX方法提供
了對這些行中數據的訪問 .

ResultSet裏的數據一行一行排列,每行有多個字段,並且有一個記錄指針,指針所指的數據行叫做當前數據行,我們只能來操作當前的數據行。我們如果想要取得某一條記錄,就要使用ResultSet的next()方法 ,如果我們想要得到ResultSet裏的所有記錄,就應該使用while循環

版權聲明
本文為[Zzt.opkk]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/204/202207232157186784.html

隨機推薦