Mysql入門【JDBC】

Li_CSDN_Li發表於2020-11-22

回顧

表連線的分類

表連線分類語法
內連線隱式SELECT 欄位 FROM 左表, 右表 WHERE 條件;
顯式SELECT 欄位 FROM 左表, INNER JOIN 右表 ON 條件;
外連線左外SELECT 欄位 FROM 左表 LEFT OUTER JOIN 右表 ON 條件;
右外SELECT 欄位 FROM 左表 RIGHT OUTER JOIN 右表 ON 條件;

子查詢的三種情況

子查詢的結果使用運算子
單行單列作為條件
多行單列作為條件 in
多行多列作為虛擬表

手動提交事務

功能MySQL語句
開啟事務start transaction;
提交事務commit;
回滾事務rollback;

事務的四大特性

事務特性
原子性
一致性
隔離性
永續性

學習目標

  1. 能夠理解JDBC的概念
  2. 能夠使用Connection介面
  3. 能夠使用Statement介面
  4. 能夠使用ResultSet介面
  5. 能夠使用JDBC實現對單表資料增、刪、改、查
  6. 能夠使用JDBC操作事務
  7. 能夠編寫JDBC工具類
  8. 能夠完成JDBC實現登入案例

1. JDBC的概念

目標

  1. 能夠掌握JDBC的概念
  2. 能夠理解JDBC的作用

講解

客戶端操作MySQL資料庫的方式

  1. 使用第三方客戶端來訪問MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
  2. 使用MySQL自帶的命令列方式
  3. 通過Java來訪問MySQL資料庫,今天要學習的內容

什麼是JDBCJava Data Base Connectivity:(Java資料庫連線) JDBC是Java訪問資料庫的標準規範
JDBC的作用:Java通過JDBC就可以運算元據庫

JDBC的由來

  1. 直接寫程式碼運算元據庫
    在這裡插入圖片描述

    直接寫程式碼運算元據庫存在的問題:

    1. 不知道MySQL資料庫的操作方式,解析方式
    2. 程式碼繁瑣,寫起來麻煩
    3. MySQL和Oracle等其他資料庫的操作方式和解析方式不同,每個資料庫都要寫一套程式碼
    4. MySQL和Oracle等其他資料庫相互切換麻煩
  2. JDBC規範定義介面,具體的實現由各大資料庫廠商來實現
    JDBC是Java訪問資料庫的標準規範。真正怎麼運算元據庫還需要具體的實現類,也就是資料庫驅動。每個資料庫廠商根據自家資料庫的通訊格式編寫好自己資料庫的驅動。所以我們只需要會呼叫JDBC介面中的方法即可。資料庫驅動由資料庫廠商提供。
    在這裡插入圖片描述

JDBC的好處

  1. 我們只需要會呼叫JDBC介面中的方法即可,使用簡單
  2. 使用同一套Java程式碼,進行少量的修改就可以訪問其他JDBC支援的資料庫

小結

  1. 說出JDBC的概念?
    Java資料庫連線(Java運算元據庫的標準規範)
  2. 說出JDBC的作用?
    Java通過JDBC就可以運算元據庫

2. JDBC核心API的介紹

目標

能夠理解JDBC四個核心物件

講解

JDBC會用到的包

  1. java.sql:JDBC訪問資料庫的基礎包,在JavaSE中的包。如:java.sql.Connection
  2. javax.sql: JDBC訪問資料庫的擴充套件包
  3. 資料庫的驅動,各大資料庫廠商來實現。如:MySQL的驅動:com.mysql.jdbc.Driver

JDBC四個核心物件

這幾個類都是在java.sql包中

  1. DriverManager: 用於註冊驅動
  2. Connection: 表示與資料庫建立的連線
  3. Statement: 執行SQL語句的物件
  4. ResultSet: 結果集或一張虛擬表
    在這裡插入圖片描述

JDBC訪問資料庫的步驟

  1. 由DriverManager註冊驅動程式

  2. 建立連線物件Connection

  3. 由客戶端傳送SQL語句給伺服器執行,SQL語句封裝成Statement物件

  4. 查詢到的結果集封裝成ResultSet物件

  5. 在客戶端可以從ResultSet中取出資料

  6. 釋放資源,關閉連線物件

小結

JDBC四個核心物件?

  1. DriverManager: 用於註冊驅動

  2. Connection: 表示與資料庫建立的連線

  3. Statement: 執行SQL語句的物件

  4. ResultSet: 結果集或一張虛擬表

3. JDBC註冊驅動

Connection表示Java程式與資料庫之間的連線,只有拿到Connection才能運算元據庫。

JDBC獲取連線步驟

1.匯入mysql驅動Jar包
2.註冊驅動
3.獲取連線

目標

能夠匯入mysql驅動Jar包

能夠通過JDBC註冊資料庫驅動

講解

匯入驅動Jar包

在這裡插入圖片描述

右鍵jar包--------->Add As Library

註冊驅動

我們Java程式需要通過資料庫驅動才能連線到資料庫,因此需要註冊驅動。
MySQL的驅動的入口類是:com.mysql.jdbc.Driver
在這裡插入圖片描述

API介紹

java.sql.DriverManager類用於註冊驅動。提供如下方法註冊驅動

static void registerDriver(Driver driver) 
向 DriverManager 註冊給定驅動程式。 
註冊驅動的兩種方式
1. 靜態方法註冊

DriverManager.registerDriver(驅動物件); 傳入對應引數即可

【案例程式碼】

public class Demo01 {
	public static void main(String[] args) throws Exception {
		// 註冊驅動
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
	}
}

通過查詢com.mysql.jdbc.Driver原始碼,我們發現Driver類“主動”將自己進行註冊

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            // 自己自動註冊
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    public Driver() throws SQLException {
    }
}

在這裡插入圖片描述

注意:使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());,存在兩方面不足

  1. 硬編碼,後期不易於程式擴充套件和維護
  2. 驅動被註冊兩次
2.直接載入類檔案

使用Class.forName("com.mysql.jdbc.Driver");載入驅動,這樣驅動只會註冊一次

public class Demo01 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver"); // 後期可以將"com.mysql.jdbc.Driver"字串寫在檔案中.
	}
}

演示:Class.forName("包名.類名");會走這個類的靜態程式碼塊
在這裡插入圖片描述

通常開發我們使用Class.forName() 載入驅動。Class.forName("com.mysql.jdbc.Driver");會走Driver類的靜態程式碼塊。在靜態程式碼塊中註冊一次驅動。
在這裡插入圖片描述

總結:註冊MySQL驅動使用Class.forName("com.mysql.jdbc.Driver");

小結

  1. 匯入mysql驅動Jar包

  2. 通過JDBC註冊資料庫驅動?

    Class.forName("com.mysql.jdbc.Driver");//好處,靈活,只會載入一次
    

4. 獲取連線

學習目標

能夠通過JDBC獲取資料庫連線

講解

API介紹

java.sql.DriverManager類中有如下方法獲取資料庫連線

static Connection getConnection(String url, String user, String password) 
連線到給定資料庫 URL ,並返回連線。 

引數說明

  1. String url:連線資料庫的URL,用於說明連線資料庫的位置
  2. String user:資料庫的賬號
  3. String password:資料庫的密碼

連線資料庫的URL地址格式:協議名:子協議://伺服器名或IP地址:埠號/資料庫名?引數=引數值
在這裡插入圖片描述

MySQL寫法:jdbc:mysql://localhost:3306/test
如果是本地伺服器,埠號是預設的3306,則可以簡寫:jdbc:mysql:///test

注意事項

如果資料出現亂碼需要加上引數: ?characterEncoding=utf8,表示讓資料庫以UTF-8編碼來處理資料。
如: jdbc:mysql://localhost:3306/test?characterEncoding=utf8

使用步驟

1.DriverManager.getConnection(url, user, password); 傳入對應引數即可

案例程式碼

public class Demo01 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		// 連線到MySQL
		// url: 連線資料庫的URL
		// user: 資料庫的賬號
		// password: 資料庫的密碼
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day24", "root", "root");
		System.out.println(conn);
	}
}

案例效果

1.連線成功
在這裡插入圖片描述

2.連線失敗
在這裡插入圖片描述

小結

  1. JDBC獲取資料庫連線使用哪個API?

    DriverManager.getConnection(資料庫url, 賬號, 密碼)
    
  2. 通過JDBC連線mysql的URL寫法?

    jdbc:mysql://localhost:3306/資料庫
    

5. JDBC實現對單表資料增、刪、改

目標

通過JDBC實現對單表資料增、刪、改

講解

準備資料

-- 建立分類表
CREATE TABLE category (
  cid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(100)
);
-- 初始化資料
INSERT INTO category (cname) VALUES('家電');
INSERT INTO category (cname) VALUES('服飾');
INSERT INTO category (cname) VALUES('化妝品');

JDBC實現對單表資料增、刪、改

我們要對資料庫進行增、刪、改、查,需要使用Statement物件來執行SQL語句。

API介紹

獲取Statement物件

java.sql.Connection介面中有如下方法獲取到Statement物件

Statement createStatement() 
建立一個 Statement 物件來將 SQL 語句傳送到資料庫

Statement的API介紹

  1. boolean execute(String sql)
    此方法可以執行任意sql語句。返回boolean值,表示是否返回ResultSet結果集。僅當執行select語句,且有返回結果時返回true, 其它語句都返回false;
    
  2. int executeUpdate(String sql)
    根據執行的DML(INSERT、UPDATE、DELETE)語句,返回受影響的行數
    
  3. ResultSet executeQuery(String sql)
    根據查詢語句返回結果集,只能執行SELECT語句
    

    注意:在MySQL中,只要不是查詢就是修改。
    executeUpdate:用於執行增刪改
    executeQuery:用於執行查詢

使用步驟

  1. 註冊驅動
  2. 獲取連線
  3. 獲取Statement物件
  4. 使用Statement物件執行SQL語句
  5. 釋放資源

案例程式碼

public class Demo03 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
		System.out.println(conn);

		// 從連線中拿到一個Statement物件
		Statement stmt = conn.createStatement();

		// 1.插入記錄
		String sql = "INSERT INTO category (cname) VALUES ('手機');";
		int i = stmt.executeUpdate(sql);
		System.out.println("影響的行數:" + i);

		// 2.修改記錄
		sql = "UPDATE category SET cname='汽車' WHERE cid=4;";
		i = stmt.executeUpdate(sql);
		System.out.println("影響的行數:" + i);

		// 3.刪除記錄
		sql = "DELETE FROM category WHERE cid=1;";
		i = stmt.executeUpdate(sql);
		System.out.println("影響的行數:" + i);
		
		// 釋放資源
		stmt.close();
		conn.close();
	}
}

案例效果

在這裡插入圖片描述

6. JDBC實現對單表資料查詢

目標

能夠掌握JDBC實現對單表資料查詢

講解

ResultSet用於儲存執行查詢SQL語句的結果。
我們不能一次性取出所有的資料,需要一行一行的取出。

ResultSet的原理

  1. ResultSet內部有一個指標,剛開始記錄開始位置
  2. 呼叫next方法, ResultSet內部指標會移動到下一行資料
  3. 我們可以通過ResultSet得到一行資料 getXxx得到某列資料
    在這裡插入圖片描述

ResultSet獲取資料的API

其實ResultSet獲取資料的API是有規律的get後面加資料型別。我們統稱getXXX()
在這裡插入圖片描述

使用JDBC查詢資料庫中的資料的步驟

  1. 註冊驅動
  2. 獲取連線
  3. 獲取到Statement
  4. 使用Statement執行SQL
  5. ResultSet處理結果
  6. 關閉資源

案例程式碼

public class Demo04 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		
		Connection conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
		Statement stmt = conn.createStatement();
		
		String sql = "SELECT * FROM category;";
		ResultSet rs = stmt.executeQuery(sql);
		
		// 內部有一個指標,只能取指標指向的那條記錄
		while (rs.next()) { // 指標移動一行,有資料才返回true
			// 取出資料
			int cid = rs.getInt("cid");
			String cname = rs.getString("cname");
			
			System.out.println(cid + " == " + cname);
		}
		
		// 關閉資源
		rs.close();
		stmt.close();
		conn.close();
	}
}

注意:

  1. 如果游標在第一行之前,使用rs.getXXX()獲取列值,報錯:Before start of result set
  2. 如果游標在最後一行之後,使用rs.getXXX()獲取列值,報錯:After end of result set

案例效果

在這裡插入圖片描述

小結

其實我們使用JDBC運算元據庫的步驟都是固定的。不同的地方是在編寫SQL語句

  1. 註冊驅動

    Class.forName("com.mysql.jdbc.Driver")
    
  2. 獲取連線

    Connection conn =DriverManager.getConnection(String url,String user,String password)
    
  3. 獲取到Statement

    Statement state = conn.createStatement();
    
  4. 使用Statement執行SQL

    public boolean execute(String sql):執行任何的sql語句
    public int executeUpdate(String sql) :執行 Insert delete update
    public ResultSet executeQuery(String sql): 執行 select
    
  5. ResultSet處理結果

    ResultSet rs = state.executeQuery("select * from category");
    while(rs.next()){= rs.getXxx(列名);= rs.getXxx(列索引); // 索引從1開始
    }
    
  6. 關閉資源

    rs.close();
    state.close();
    conn.close();
    

ResultSet如何獲取資料?

  1. 呼叫next方法, ResultSet內部指標會移動到下一行資料
  2. 我們可以通過ResultSet得到一行資料 getXxx得到某列資料

7. JDBC事務

目標

能夠掌握JDBC操作事務

講解

之前我們是使用MySQL的命令來操作事務。接下來我們使用JDBC來操作銀行轉賬的事務。

準備資料

CREATE TABLE account (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	balance DOUBLE
);
-- 新增資料
INSERT INTO account (NAME, balance) VALUES ('張三', 1000), ('李四', 1000);

API介紹

Connection介面中與事務有關的方法

  1. void setAutoCommit(boolean autoCommit) throws SQLException;
    false:開啟事務, ture:關閉事務
    
    java-->setAutoCommit(false) 
      <==> 
    sql->start transaction;
    
  2. void commit() throws SQLException;
    提交事務
    
    <==>
    commit;
    
  3. void rollback() throws SQLException;
    回滾事務
    
    <==>
    roallback;
    

使用步驟

  1. 註冊驅動
  2. 獲取連線
  3. 開啟事務
  4. 獲取到Statement
  5. 使用Statement執行SQL
  6. 提交或回滾事務
  7. 關閉資源

案例程式碼

public class Demo05 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			// 拿到連線
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
			
			// 開啟事務
			conn.setAutoCommit(false);
			
			Statement pstmt = conn.createStatement();
			
			// 張三減500
			String sql = "UPDATE account SET balance = balance - 500 WHERE id=1;";
			pstmt.executeUpdate(sql);
			// 模擬異常
			// int i = 10 / 0;
			
			// 李四加500
			sql = "UPDATE account SET balance = balance + 500 WHERE id=2;";
			pstmt.executeUpdate(sql);
			
			pstmt.close();
			// 成功,提交事務
			System.out.println("成功,提交事務");
			conn.commit();
		} catch (Exception e) {
			// 失敗,回滾事務
			try {
				System.out.println("出了異常,回滾事務");
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

案例效果

在這裡插入圖片描述

小結

JDBC中與事務相關的API?Connection介面中setAutoCommit,commit,rollback

JDBC操作事務的步驟?

  1. 註冊驅動
  2. 獲取連線
  3. 獲取到Statement
  4. 開啟事務
  5. 使用Statement執行SQL
  6. 提交或回滾事務
  7. 關閉資源

8. 編寫JDBC工具類

目標

能夠編寫JDBC獲取連線與關閉連線工具類

講解

​ 需求: 建立一張員工表,包含id,name,age,address欄位.定義新增員工,修改員工,刪除員工方法運算元據庫。

​ 通過上面案例需求我們會發現每次去執行SQL語句都需要註冊驅動,獲取連線,得到Statement,以及釋放資源。發現很多重複的勞動,我們可以將重複的程式碼定義到某個類的方法中。直接呼叫方法,可以簡化程式碼。
​ 那麼我們接下來定義一個JDBCUtils類。把註冊驅動,獲取連線,得到Statement,以及釋放資源的程式碼放到這個類的方法中。以後直接呼叫方法即可。

編寫步驟

  1. 將固定字串定義為常量
  2. 在靜態程式碼塊中註冊驅動(只註冊一次)
  3. 提供一個獲取連線的方法static Connection getConneciton();
  4. 定義關閉資源的方法close(AutoCloseable... resource)

案例程式碼

JDBCUtils.java

import java.io.IOException;
import java.sql.*;

public class JDBCUtils {
    // 1.將固定字串定義為常量
    private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql:///day04";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    // 2.在靜態程式碼塊中註冊驅動(只註冊一次)
    // 當這個類載入到記憶體的時候就走這個靜態程式碼塊,再去觸發Driver類中的靜態程式碼塊,主動註冊
    static {
        try {
            Class.forName(DRIVER_CLASS);
        } catch (ClassNotFoundException e) {
        }
    }

    // 3.提供一個獲取連線的方法static Connection getConneciton();
    // 我們面向JDBC程式設計
    public static Connection getConnection() throws SQLException, IOException {
        //有兩種方式:如下

        //第一種方式:
        // 可以將使用者名稱【user=root】和密碼【password=root】放到配置檔案jdbc.properties,
        //配置檔案可以放到src目錄中,用以下載入方式

       /* InputStream is = JDBCUtils.class.getResourceAsStream("/jdbc.properties");
        Properties pp = new Properties();
        pp.load(is);
        Connection conn = DriverManager.getConnection(URL, pp);
        */

        // 第二種方式:
        // 直接使用靜態常量定義的使用者名稱和密碼
        Connection conn = DriverManager.getConnection(URL, USER,PASSWORD);

        return conn;
    }

    //4.定義關閉資源方法
    //Connection,Statement,ResultSet 都實現了AutoCloseable介面
    public static void close(AutoCloseable... resource) {
        for (AutoCloseable r : resource) {
            try {
                if (r != null) {
                    r.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}

Demo06.java

public class Demo06 {
	public static void main(String[] args) throws Exception {
		createTable();
//		addEmployee();
//		updateEmployee();
//		deleteEmployee();
	}
	
	// 刪除員工
	public static void deleteEmployee() throws Exception {
		Connection conn = JDBCUtils.getConnection();
		Statement stmt = conn.createStatement();
		
		// 刪除id為3的員工
		String sql = "DELETE FROM employee WHERE id=3;";
		
		int i = stmt.executeUpdate(sql);
		System.out.println("影響的行數: " + i);
		
//		stmt.close();
//		conn.close();
//		JDBCUtils.close(conn, stmt, null);
		JDBCUtils.close(conn, stmt);
	}
	
	// 修改員工
	public static void updateEmployee() throws Exception {
		Connection conn = JDBCUtils.getConnection();
		Statement stmt = conn.createStatement();
		
		// 將id為3的員工姓名改成田七,地址改成天津
		String sql = "UPDATE employee SET address='天津', name='田七' WHERE id=3;";
		
		int i = stmt.executeUpdate(sql);
		System.out.println("影響的行數: " + i);
		
//		stmt.close();
//		conn.close();
//		JDBCUtils.close(conn, stmt, null);
		JDBCUtils.close(conn, stmt);
	}
	
	// 定義新增員工
	public static void addEmployee() throws Exception {
		Connection conn = JDBCUtils.getConnection();
		Statement stmt = conn.createStatement();
		
		// 新增4個員工
		String sql = "INSERT INTO employee VALUES (NULL, '張三4', 20, '北京'),"
				+ " (NULL, '李四4', 21, '南京'),"
				+ " (NULL, '王五4', 18, '東京'),"
				+ " (NULL, '趙六4', 17, '西安');";
		
		int i = stmt.executeUpdate(sql);
		System.out.println("影響的行數: " + i);
		
//		stmt.close();
//		conn.close();
//		JDBCUtils.close(conn, stmt, null);
		JDBCUtils.close(conn, stmt);
	}

	// 建立表
	public static void createTable() throws Exception {
		Connection conn = JDBCUtils.getConnection();
		Statement stmt = conn.createStatement();
		
		String sql = "CREATE TABLE IF NOT EXISTS employee ("
				+ " id INT PRIMARY KEY AUTO_INCREMENT,"
				+ " name VARCHAR(20) UNIQUE NOT NULL,"
				+ " age INT,"
				+ " address VARCHAR(50)"
				+ ");";
		
		int i = stmt.executeUpdate(sql);
		System.out.println("ok");
		
//		stmt.close();
//		conn.close();
//		JDBCUtils.close(conn, stmt, null);
		JDBCUtils.close(conn, stmt);
	}
}

案例效果

在這裡插入圖片描述

9. JDBC實現登入案例

目標

模擬使用者輸入賬號和密碼登入網站

  1. 輸入正確的賬號,密碼,顯示登入成功
    在這裡插入圖片描述

  2. 輸入錯誤的賬號,密碼,顯示登入失敗
    在這裡插入圖片描述

講解

案例分析

  1. 使用資料庫儲存使用者的賬號和密碼
  2. 讓使用者輸入賬號和密碼
  3. 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
  4. 如果查詢到資料,說明登入成功
  5. 如果查詢不到資料,說明登入失敗

實現步驟

  1. 建立一個使用者表儲存使用者的賬號和密碼,並新增一些資料,SQL語句如下:

    CREATE TABLE USER (
      id INT AUTO_INCREMENT PRIMARY KEY,
      NAME VARCHAR(50),
      PASSWORD VARCHAR(50)
    );
    INSERT INTO USER (NAME, PASSWORD) VALUES('admin', '123'), ('test', '123'), ('gm', '123');
    
  2. 編寫程式碼讓使用者輸入賬號和密碼

    public class Demo07 {
       public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       System.out.println("請輸入賬號: ");
       String name = sc.nextLine();
       System.out.println("請輸入密碼: ");
       String password = sc.nextLine();
    }
    
  3. 使用SQL根據使用者的賬號和密碼去資料庫查詢資料

    public class Demo07 {
       public static void main(String[] args) throws Exception {
       // 讓使用者輸入賬號和密碼
       Scanner sc = new Scanner(System.in);
       System.out.println("請輸入賬號: ");
       String name = sc.nextLine();
       System.out.println("請輸入密碼: ");
       String password = sc.nextLine();
       
       // 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
       Connection conn = JDBCUtils.getConnection();
       Statement stmt = conn.createStatement();
       String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';";
       }
    }
    
  4. 如果查詢到資料,說明登入成功,如果查詢不到資料,說明登入失敗

    public class Demo07 {
    public static void main(String[] args) throws Exception {
       // 讓使用者輸入賬號和密碼
       Scanner sc = new Scanner(System.in);
       System.out.println("請輸入賬號: ");
       String name = sc.nextLine();
       System.out.println("請輸入密碼: ");
       String password = sc.nextLine();
       
       // 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
       Connection conn = JDBCUtils.getConnection();
       Statement stmt = conn.createStatement();
       String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';";
       
       // 如果查詢到資料,說明登入成功,如果查詢不到資料,說明登入失敗
       ResultSet rs = stmt.executeQuery(sql);
    
       if (rs.next()) {
          //能進來查詢到了資料.
          String name2 = rs.getString("name");
          System.out.println("歡迎您," + name2);
       } else {
          //查詢不到資料,說明登入失敗
          System.out.println("賬號或密碼錯誤...");
       }
    
       JDBCUtils.close(conn, stmt, rs);
       }
    }
    

小結

登入案例步驟

  1. 使用資料庫儲存使用者的賬號和密碼
  2. 讓使用者輸入賬號和密碼
  3. 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
  4. 如果查詢到資料,說明登入成功
  5. 如果查詢不到資料,說明登入失敗

相關文章