Java講課筆記31:JDBC入門

文章目錄

零、本講學習目標

1、瞭解什麼是JDBC

2、熟悉JDBC的常用API

3、掌握JDBC的使用步驟

一、JDBC概述

1、JDBC定義

JDBC(Java DataBase Connectivity,Java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。

2、JDBC說明

  • 不同的數據庫(如MySQL、Oracle等)在其內部處理數據的方式是不同的,因此每一個數據庫廠商都提供了自己數據庫的訪問接口。
  • 直接使用數據庫廠商提供的訪問接口操作數據庫,程序的可移植性變得很差。
  • JDBC要求各個數據庫廠商按照統一的規範來提供數據庫驅動,由JDBC和具體的數據庫驅動聯繫,這樣應用程序就不必直接與底層的數據庫交互,從而使得代碼的通用性更強。

3、應用程序採用JDBC訪問數據庫的方式

在這裏插入圖片描述

  • 說明:JDBC在應用程序與數據庫之間起到了一個橋樑作用,當應用程序使用JDBC訪問特定的數據庫時,只需要通過不同的數據庫驅動與其對應的數據庫進行連接,連接後即可對該數據庫進行相應的操作。

二、JDBC常用API

(一)Driver接口

1、Driver接口定義

Driver接口是所有JDBC驅動程序必須實現的接口,該接口專門提供給數據庫廠商使用。在編寫JDBC程序時,必須要把所使用的數據庫驅動程序或類庫加載到項目的classpath中(這裏指數據庫的驅動JAR包)。

2、Driver接口常用方法

在這裏插入圖片描述

(二)DriverManager類

1、DriverManager類定義

DriverManager類用於加載JDBC驅動並且創建與數據庫的連接。

2、DriverManager類常用方法

方法聲明 功能描述
static synchronized void registerDriver(Driver driver) 該方法用於向DriverManager中註冊給定的JDBC驅動程序
static Connection getConnection(String url, String user, String pwd) 該方法用於建立和數據庫的連接,並返回表示連接的Connection對象
  • 注意:在實際開發中,通常不使用registerDriver(Driver driver) 註冊驅動。因爲JDBC驅動類Driver中有一段靜態代碼塊,是向DriverManager註冊一個Driver實例,當再次執行registerDriver(new Driver()),相當於實例化了兩個Driver對象,因此在加載數據庫驅動時通常使用Class類的靜態方法forName()來實現。

(三)Connection接口

1、Connection接口定義

Connection接口代表Java程序和數據庫的連接對象,只有獲得該連接對象後,才能訪問數據庫,並操作數據表。

2、Connection接口常用方法

方法聲明 功能描述
Statement createStatement() 該方法用於返回一個向數據庫發送語句的Statement對象
PreparedStatement prepareStatement(String sql) 該方法用於返回一個PreparedStatement對象,該對象用於向數據庫發送參數化的SQL語句
CallableStatement prepareCall(String sql) 該方法用於返回一個CallableStatement對象,該對象用於調用數據庫中的存儲過程

(四)Statement接口

1、Statement接口定義

  • Statement是Java執行數據庫操作的一個重要接口,它用於執行靜態的SQL語句,並返回一個結果對象。Statement接口對象可以通過Connection實例的createStatement()方法獲得,然後返回數據庫的處理結果。

2、Statement接口常用方法

方法聲明 功能描述
boolean execute(String sql) 用於執行各種SQL語句,返回一個boolean類型的值,如果爲true,表示所執行的SQL語句有查詢結果,可通過Statement的getResultSet()方法獲得查詢結果
int executeUpdate(String sql) 用於執行SQL中的insert、update和delete語句。該方法返回一個int類型的值,表示數據庫中受該SQL語句影響的記錄條數
ResultSet executeQuery(String sql) 用於執行SQL中的select語句,該方法返回一個表示查詢結果的ResultSet對象

(五)PreparedStatement接口

1、PreparedStatement接口作用

Statement接口封裝了JDBC執行SQL語句的方法,雖然可以完成Java程序執行SQL語句的操作,但是在實際開發過程中往往需要將程序中的變量作爲SQL語句的查詢條件,而使用Statement接口操作這些SQL語句會過於繁瑣,並且存在安全方面的問題。針對這一問題,JDBC API 中提供了擴展的PreparedStatement接口。

2、PreparedStatement接口定義

PreparedStatement是Statement的子接口,用於執行預編譯的SQL語句。PreparedStatement接口擴展了帶有參數SQL語句的執行操作,應用接口中的SQL語句可以使用佔位符“?”來代替其參數,然後通過setXxx()方法爲SQL語句的參數賦值。

3、PreparedStatement接口常用方法

方法聲明 功能描述
int executeUpdate() 在此PreparedStatement對象中執行 SQL 語句,該語句必須是一個DML語句或者是無返回內容的SQL 語句,如 DDL 語句
ResultSet executeQuery() 在此PreparedStatement對象中執行 SQL 查詢,該方法返回的是ResultSet對象
void setInt(int parameterIndex, int x) 將指定參數設置爲給定的int值
void setFloat(int parameterIndex, float x) 將指定參數設置爲給定的float值
void setString(int parameterIndex, String x) 將指定參數設置爲給定的String值
void setDate(int parameterIndex, Date x) 將指定參數設置爲給定的Date值
void addBatch() 將一組參數添加到此PreparedStatement對象的批處理命令中
void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) 將指定的輸入流寫入數據庫的文本字段
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) 將二進制的輸入流數據寫入到二進制字段中

4、PreparedStatement接口用法

爲SQL語句參數賦值時,可以通過輸入參數與SQL類型相匹配的setXxx()方法。例如字段的數據類型爲int或Integer,那麼應該使用setInt()方法,也可以通過setObject()方法設置多種類型的輸入參數。

(六)ResultSet接口

1、ResultSet接口定義

ResultSet接口用於保存JDBC執行查詢時返回的結果集,該結果集封裝在一個邏輯表格中。在ResultSet接口內部有一個指向表格數據行的遊標(或指針),ResultSet對象初始化時,遊標在表格的第一行之前,調用next()方法可將遊標移動到下一行。如果下一行沒有數據,則返回false。在程序中經常使用next()方法作爲while循環的條件來迭代ResultSet結果集。

2、ResultSet接口常用方法

方法聲明 功能描述
String getString(int columnIndex) 用於獲取指定字段的String類型的值,參數columnIndex代表字段的索引
String getString(String columnName) 用於獲取指定字段的String類型的值,參數columnName代表字段的名稱
int getInt(int columnIndex) 用於獲取指定字段的int類型的值,參數columnIndex代表字段的索引
int getInt(String columnName) 用於獲取指定字段的int類型的值,參數columnName代表字段的名稱
Date getDate(int columnIndex) 用於獲取指定字段的Date類型的值,參數columnIndex代表字段的索引
Date getDate(String columnName) 用於獲取指定字段的Date類型的值,參數columnName代表字段的名稱
boolean next() 將遊標從當前位置向下移一行
boolean absolute(int row) 將遊標移動到此 ResultSet 對象的指定行
void afterLast() 將遊標移動到此 ResultSet 對象的末尾,即最後一行之後
void beforeFirst() 將遊標移動到此 ResultSet 對象的開頭,即第一行之前
boolean previous() 將遊標移動到此 ResultSet 對象的上一行
boolean last() 將遊標移動到此 ResultSet 對象的最後一行

3、ResultSet接口說明

  • ResultSet接口中定義了大量的getXxx()方法,而採用哪種getXxx()方法取決於字段的數據類型。
  • 程序既可以通過字段的名稱來獲取指定數據,也可以通過字段的索引來獲取指定的數據,字段的索引是從1開始編號的。
  • 假設數據表的第1列字段名爲id,字段類型爲int,那麼既可以使用getInt(“id”)獲取該列的值,也可以使用getInt(1)獲取該列的值。

三、JDBC編程步驟

在這裏插入圖片描述

(一)加載數據庫驅動

1、加載數據庫驅動語法

Class.forName(“DriverName”);

  • DriverName就是數據庫驅動類所對應的字符串。

2、加載數據庫驅動示例

(1)加載MySQL數據庫驅動

Class.forName(“com.mysql.jdbc.Driver”);

(2)加載Oracle數據庫驅動

Class.forName(“oracle.jdbc.driver.OracleDriver”);

(二)通過DriverManager獲取數據庫連接

1、獲取數據庫連接語法

Connection conn = DriverManager.getConnection(String url, String user, String pwd);

  • url:連接數據庫的URL
  • user:登錄數據庫的用戶名
  • pwd:登錄數據庫的密碼

以MySQL數據庫爲例說明url語法:

jdbc:mysql://hostname:port/databasename

  • jdbc:mysql是固定的寫法,mysql指的是MySQL數據庫
  • hostname指主機的名稱(使用主機的IP地址也行)
  • port指的是連接數據庫的端口號(MySQL端口號默認爲3306)
  • databasename指的是MySQL中相應數據庫的名稱

2、獲取數據庫連接示例

final String URL = "jdbc:mysql://localhost:3306/student";
final String USERNAME = "root";
final String PASSWORD = "root";
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

(三)通過Connection對象獲取Statement對象

1、創建Statement對象的方式

  • createStatement():創建基本的Statement對象。
  • prepareStatement(String sql):根據傳遞的SQL語句創建PreparedStatement對象。
  • prepareCall(String sql):根據傳入的SQL語句創建CallableStatement對象。

2、創建Statement對象的示例

  • 創建基本的Statement對象
Statement stmt = conn.createStatement(); 
  • 創建PreparedStatement對象
String strSQL = "select * from t_user where username = ? and password = ?";
PreparedStatement pstmt = conn.prepareStatement(strSQL);

(四)使用Statement執行SQL語句

1、執行SQL方式

  • execute(String sql):用於執行任意的SQL語句。
  • executeQuery(String sql):用於執行查詢語句,返回ResultSet結果集對象。
  • executeUpdate(String sql):主要用於執行DML(數據操作語言)和DDL(數據定義語言)語句。執行DML語句(INSERT、UPDATE或DELETE)時,會返回受SQL語句影響的行數,執行DDL(CREATE、ALTER)語句返回0。

2、執行SQL語句示例

String strSQL = "select * from t_user";
ResultSet rs = stmt.executeQuery(strSQL);

(五)操作結果集ResultSet

1、操作結果集說明

如果執行的SQL語句是查詢語句,執行結果將返回一個ResultSet對象,該對象裏保存了SQL語句查詢的結果。程序可以通過操作該ResultSet對象來取出查詢結果。

2、操作結果集示例

// 執行SQL查詢,返回結果集                                         
ResultSet rs = stmt.executeQuery(strSQL);                   
// 遍歷結果集,顯示錶記錄                                           
while (rs.next()) {                                         
    // 創建用戶實體對象                                             
    User user = new User();                                 
    // 設置實體屬性                                               
    user.setId(rs.getInt("id"));                            
    user.setUsername(rs.getString("username"));             
    user.setTelephone(rs.getString("telephone"));           
    user.setRegisterTime(rs.getTimestamp("register_time")); 
    // 輸出用戶實體對象                                             
    System.out.println(user);                               
}                                                           

(六)關閉連接,釋放資源

每次操作數據庫結束後都要關閉數據庫連接,釋放資源,以重複利用資源。

  • 通常資源的關閉順序與打開順序相反,順序是ResultSet、Statement(或PreparedStatement)和Connection。
  • 爲了保證在異常情況下也能關閉資源,需要在try…catch的finally代碼塊中統一關閉資源。

四、案例演示:利用JDBC操作數據庫與表

(一)啓動MySQL服務

在這裏插入圖片描述

(二)在Navicat Prmium裏創建MySQL連接

1、啓動Navicat Prmium

Navicat Prmium

2、創建MySQL連接

在這裏插入圖片描述
在這裏插入圖片描述

(三)創建數據庫

創建數據庫student,設置字符集爲utf8:
在這裏插入圖片描述
在這裏插入圖片描述

(四)創建數據表

1、在數據庫裏創建數據表

在這裏插入圖片描述
在這裏插入圖片描述

2、在數據表裏添加記錄

在這裏插入圖片描述
在這裏插入圖片描述

3、轉儲數據庫的SQL腳本

在這裏插入圖片描述
SQL腳本student.sql:

/*
 Navicat Premium Data Transfer

 Source Server         : java_mysql
 Source Server Type    : MySQL
 Source Server Version : 50562
 Source Host           : localhost:3306
 Source Schema         : student

 Target Server Type    : MySQL
 Target Server Version : 50562
 File Encoding         : 65001

 Date: 02/06/2020 16:19:42
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶名',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用戶密碼',
  `telephone` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '聯繫電話',
  `register_time` timestamp DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '註冊時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', '12345', '15895956780', '2019-05-22 08:42:15');
INSERT INTO `t_user` VALUES (2, '李剛', '11111', '13956567834', '2019-06-06 10:20:05');
INSERT INTO `t_user` VALUES (3, '段譽', '22222', '15890345678', '2019-05-29 08:29:07');
INSERT INTO `t_user` VALUES (4, '王語嫣', '33333', '13967678904', '2019-05-13 16:52:26');
INSERT INTO `t_user` VALUES (5, '喬峯', '44444', '15890897865', '2019-05-17 08:29:11');
INSERT INTO `t_user` VALUES (6, '虛竹', '55555', '15894567890', '2019-06-06 09:27:41');

SET FOREIGN_KEY_CHECKS = 1;

(五)創建數據庫連接管理類

  • 在net.hw.lesson31包裏創建ConnectionManager
    在這裏插入圖片描述
package net.hw.lesson31;

import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 功能:數據庫連接管理類
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class ConnectionManager {
    /**
     * 數據庫驅動程序
     */
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    /**
     * 數據庫統一資源定位符
     */
    private static final String URL = "jdbc:mysql://localhost:3306/student";
    /**
     * 數據庫用戶名
     */
    private static final String USERNAME = "root";
    /**
     * 數據庫密碼
     */
    private static final String PASSWORD = "root";

    /**
     * 私有化構造方法,拒絕實例化
     */
    private ConnectionManager() {
    }

    /**
     * 獲取數據庫連接方法
     *
     * @return 數據庫連接
     */
    public static Connection getConnection() {
        // 定義數據庫連接
        Connection conn = null;
        try {
            // 安裝數據庫驅動程序
            Class.forName(DRIVER);
            // 獲取數據庫連接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (ClassNotFoundException e) {
            System.err.println("錯誤提示:數據庫驅動程序未找到!");
        } catch (SQLException e) {
            System.err.println("溫馨提示:數據庫連接失敗!");
        }
        // 返回數據庫連接
        return conn;
    }

    /**
     * 關閉數據連接方法
     *
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        // 判斷數據庫連接是否爲空
        if (conn != null) {
            try {
                // 判斷數據庫連接是否關閉
                if (!conn.isClosed()) {
                    // 關閉數據庫連接
                    conn.close();
                }
            } catch (SQLException e) {
                System.err.println("溫馨提示:數據庫連接關閉失敗!");
            }
        }
    }

    /**
     * 測試數據庫連接是否成功
     *
     * @param args
     */
    public static void main(String[] args) {
        // 獲取數據庫連接
        Connection conn = getConnection();
        // 判斷是否連接成功
        if (conn != null) {
            JOptionPane.showMessageDialog(null, "恭喜,數據庫連接成功!");
        } else {
            JOptionPane.showMessageDialog(null, "遺憾,數據庫連接失敗!");
        }
        // 關閉數據庫連接
        closeConnection(conn);
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 在項目根目錄創建一個lib子目錄,將數據庫驅動程序jar包拷貝進來

mysql-connector-java-5.1.48.jar下載鏈接:https://pan.baidu.com/s/1_oUTUju2CfzNZ-JQHlyFew 提取碼:wu27
在這裏插入圖片描述

  • mysql-connector-java-5.1.48.jar作爲庫(Library)添加到項目裏
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 再運行程序,查看結果
    在這裏插入圖片描述

(六)創建用戶實體類

  • 創建用戶實體類User,用於封裝用戶表一條記錄數據
  • 用戶表的一個字段對應用戶實體類的一個屬性,注意類型匹配問題
  • 注意時間戳類不要導錯了(import java.sql.Timestamp;
    在這裏插入圖片描述
package net.hw.lesson31;

import java.sql.Timestamp;

/**
 * 功能:用戶實體類
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String telephone;
    private Timestamp registerTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public Timestamp getRegisterTime() {
        return registerTime;
    }

    public void setRegisterTime(Timestamp registerTime) {
        this.registerTime = registerTime;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", telephone='" + telephone + '\'' +
                ", registerTime=" + registerTime +
                '}';
    }
}

(七)創建顯示全部用戶記錄類

  • 創建DisplayAllUsers(使用普通語句對象)
    在這裏插入圖片描述
package net.hw.lesson31;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 功能:顯示用戶表記錄
 * 全部或部分記錄
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class DisplayAllUsers {
    public static void main(String[] args) {
        // 1. 獲取數據庫連接
        Connection conn = ConnectionManager.getConnection();
        try {
            // 2. 定義SQL語句字符串
            String strSQL = "select * from t_user";
            // 3. 創建語句對象
            Statement stmt = conn.createStatement();
            // 4. 執行SQL查詢,返回結果集
            ResultSet rs = stmt.executeQuery(strSQL);
            // 5. 遍歷結果集,顯示錶記錄
            while (rs.next()) {
                // 創建用戶實體對象
                User user = new User();
                // 設置實體屬性
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setTelephone(rs.getString("telephone"));
                user.setRegisterTime(rs.getTimestamp("register_time"));
                // 輸出用戶實體對象
                System.out.println(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述

課堂練習:按編號查找用戶記錄

  • 創建FindUserById
    在這裏插入圖片描述
  • 運行程序,查看結果
    在這裏插入圖片描述
    在這裏插入圖片描述

(八)創建用戶登錄類

  • 創建Login(使用預備語句對象)
    在這裏插入圖片描述
package net.hw.lesson31;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * 功能:用戶登錄程序
 *      連接數據庫,判斷是否是合法用戶
 *      然後給予用戶相應的提示
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class Login {
    public static void main(String[] args) {
        // 聲明部分
        String username;
        String password;
        Scanner sc = new Scanner(System.in);

        // 輸入部分
        System.out.print("輸入用戶名:");
        username = sc.next();
        System.out.print("輸入密碼:");
        password = sc.next();

        // 處理部分
        // 1. 獲取數據庫連接
        Connection conn = ConnectionManager.getConnection();
        try {
            // 2. 定義SQL字符串
            String strSQL = "select * from t_user where username = ? and password = ?";
            // 3. 創建預備語句對象
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 4. 設置佔位符的值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            // 5. 執行SQL語句,返回結果集
            ResultSet rs = pstmt.executeQuery();
            // 6. 判斷結果集是否爲空
            if (rs.next()) {
                System.out.println("恭喜,登錄成功!");
            } else {
                System.err.println("遺憾,登錄失敗!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 再運行程序,查看結果
    在這裏插入圖片描述

(九)創建添加用戶記錄類

  • 創建AddUser
    在這裏插入圖片描述
package net.hw.lesson12;

import net.hw.lesson31.ConnectionManager;
import net.hw.lesson31.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Scanner;

/**
 * 功能:添加用戶記錄
 * 作者:華衛
 * 日期:2020年06月06日
 */
public class AddUser {
    public static void main(String[] args) {
        // 聲明部分
        String username, password, telephone;
        Scanner sc = new Scanner(System.in);

        // 輸入部分
        System.out.print("用戶名:");
        username = sc.next();
        System.out.print("密碼:");
        password = sc.next();
        System.out.print("電話:");
        telephone = sc.next();

        // 處理部分
        // 1. 創建用戶實體對象
        User user = new User();
        // 2. 設置實體屬性
        user.setUsername(username);
        user.setPassword(password);
        user.setTelephone(telephone);
        user.setRegisterTime(new Timestamp(new Date().getTime()));
        // 3. 獲取數據庫連接
        Connection conn = ConnectionManager.getConnection();
        // 4. 定義SQL字符串
        String strSQL = "insert into t_user (username, password, telephone, register_time) values (?, ?, ?, ?)";
        try {
            // 5. 創建預備語句對象
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 6. 設置佔位符的值
            pstmt.setString(1, user.getUsername());
            pstmt.setString(2, user.getPassword());
            pstmt.setString(3, user.getTelephone());
            pstmt.setTimestamp(4, user.getRegisterTime());
            // 7. 執行SQL,返回添加的記錄數
            int count = pstmt.executeUpdate();
            // 8. 判斷是否添加成功
            if (count > 0) {
                // 提示用戶添加成功
                System.out.println("恭喜,用戶記錄添加成功!");
            } else {
                // 提示用戶添加失敗
                System.out.println("遺憾,用戶記錄添加失敗!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 運行DisplayAllUsers程序,查看結果
    在這裏插入圖片描述
  • 打開NaviCat,查看用戶表
    在這裏插入圖片描述

(十)創建更新用戶記錄類

  • 創建UpdateUser
    在這裏插入圖片描述
package net.hw.lesson31;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * 功能:更新用戶記錄
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class UpdateUser {
    public static void main(String[] args) {
        // 聲明部分
        int id;
        String username, password;
        Scanner sc = new Scanner(System.in);

        // 輸入部分
        System.out.print("待編輯記錄的id:");
        id = sc.nextInt();
        System.out.print("新用戶名:");
        username = sc.next();
        System.out.print("新密碼:");
        password = sc.next();

        // 處理部分
        // 1. 獲取數據庫連接
        Connection conn = ConnectionManager.getConnection();
        // 2. 定義SQL字符串
        String strSQL = "update t_user set username = ?, password = ? where id = ?";
        try {
            // 3. 創建預備語句
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 4. 設置佔位符的值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            pstmt.setInt(3, id);
            // 5. 執行SQL,返回更新成功的記錄數
            int count = pstmt.executeUpdate();
            // 6. 判斷是否更新成功
            if (count > 0) {
                // 提示用戶更新成功
                System.out.println("恭喜,用戶記錄更新成功!");
            } else {
                // 提示用戶更新失敗
                System.out.println("遺憾,用戶記錄更新失敗!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
    }
}
  • 查看用戶表
    在這裏插入圖片描述
  • 運行程序,修改第7條記錄的用戶名與密碼
    在這裏插入圖片描述
  • 運行FindUserById程序,查看結果
    在這裏插入圖片描述
  • 在NaviCat裏查看用戶表
    在這裏插入圖片描述

(十一)創建刪除用戶記錄類

  • 創建DeleteUserById
    在這裏插入圖片描述
package net.hw.lesson31;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * 功能:按編號刪除用戶記錄
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class DeleteUserById {
    public static void main(String[] args) {
        // 聲明部分
        int id;
        Scanner sc = new Scanner(System.in);

        // 輸入部分
        System.out.print("待刪記錄的id:");
        id = sc.nextInt();

        // 處理部分
        // 1. 獲取數據庫連接
        Connection conn = ConnectionManager.getConnection();
        // 2. 定義SQL字符串
        String strSQL = "delete from t_user where id = ?";
        try {
            // 3. 創建預備語句
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 4. 設置佔位符的值
            pstmt.setInt(1, id);
            // 5. 執行SQL,返回刪除的記錄數
            int count = pstmt.executeUpdate();
            // 6. 判斷是否刪除成功
            if (count > 0) {
                // 提示用戶刪除成功
                System.out.println("恭喜,用戶記錄刪除成功!");
            } else {
                // 提示用戶刪除失敗
                System.out.println("遺憾,用戶記錄刪除失敗!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
    因爲編號爲10的記錄根本不存在,所以刪除必然失敗。
  • 再運行程序,查看結果
    在這裏插入圖片描述
  • 運行DisplayAllUsers程序,查看結果
    在這裏插入圖片描述
    可以看到,編號爲2的用戶記錄確實被刪除掉了。
  • 打開NaviCat,查看用戶表
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章