Java講課筆記32:利用JDBC實現系統登錄功能

零、本講學習目標

1、學會分析“用戶登錄”任務結合JDBC技術改寫的實現思路

2、根據思路獨立完成連接數據庫版本的“用戶登錄”任務

一、圖形界面“用戶登錄”實現思路

  • 第30講的用戶登錄程序,實現了圖形用戶界面,但是用於判斷用戶是否合法的用戶名與密碼是在程序裏寫死了的,並不是連接數據庫之後通過查詢用戶表來判斷是否存在用戶記錄。
  • 創建用戶數據訪問對象類UserDao,提供一個登錄方法:boolean login(String username, String password),如果輸入的用戶名和密碼能在用戶表裏查詢到相應記錄,則返回true,否則返回false
  • 利用login()方法來改寫LoginFrame類的登錄按鈕單擊事件處理方法
  • 爲了封裝用戶表記錄數據,要創建用戶實體類User
  • 爲了更好地獲取和關閉數據庫連接,要創建數據庫連接管理類ConnectionManager

二、圖形界面“用戶登錄”實現步驟

1、創建用戶實體類

  • 創建用戶實體類User
    在這裏插入圖片描述
package net.hw.lesson32;

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 +
                '}';
    }
}

3、創建數據庫連接管理類

  • 創建數據庫連接管理類ConnectionManager
    在這裏插入圖片描述
package net.hw.lesson32;

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);
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述

3、創建用戶數據訪問對象類

  • 創建用戶數據訪問對象類UserDao
    在這裏插入圖片描述
package net.hw.lesson32;

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

/**
 * 功能:用戶數據訪問對象
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class UserDao {
    public boolean login(String username, String password) {
        // 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()) {
                return true;
            }           
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 關閉數據庫連接
            ConnectionManager.closeConnection(conn);
        }
        return false;
    }
}

4、創建測試用戶數據訪問對象類

  • 創建測試用戶數據訪問對象類TestUserDao
    在這裏插入圖片描述
package net.hw.lesson32;

import java.util.Scanner;

/**
 * 功能:測試用戶數據訪問對象類
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class TestUserDao {
    public static void main(String[] args) {
        // 聲明部分
        String username;
        String password;
        Scanner sc = new Scanner(System.in);
        UserDao userDao = new UserDao();

        // 輸入部分
        System.out.print("輸入用戶名:");
        username = sc.next();
        System.out.print("輸入密碼:");
        password = sc.next();
        
        // 處理部分
        if (userDao.login(username, password)) {
            System.out.println("恭喜,登錄成功!");
        } else {
            System.err.println("遺憾,登錄失敗!");
        }
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 再運行程序,查看結果
    在這裏插入圖片描述

5、創建用戶登錄窗口類

  • 創建用戶登錄窗口類LoginFrame
    在這裏插入圖片描述
    在這裏插入圖片描述
package net.hw.lesson32;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * 功能:用戶登錄
 * 作者:華衛
 * 日期:2020年06月02日
 */
public class LoginFrame extends JFrame {
    /**
     * 構造方法
     *
     * @param title
     * @throws HeadlessException
     */
    public LoginFrame(String title) throws HeadlessException {
        super(title); // 調用父類構造方法傳入標題參數
        initGUI(); // 調用初始化圖形用戶界面方法
    }

    /**
     * 初始化圖形用戶界面方法
     */
    private void initGUI() {
        // 創建三個面板
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        // 獲取內容面板
        JPanel panel = (JPanel) getContentPane();
        // 設置面板panel的佈局爲表格佈局
        panel.setLayout(new GridLayout(3, 1));
        // 將三個小面板添加到面板panel裏
        panel.add(panel1);
        panel.add(panel2);
        panel.add(panel3);

        /* 第一個面板裏要添加用戶名標籤與文本框 */
        // 創建用戶名標籤
        JLabel lblUsername = new JLabel("用戶名:");
        // 創建用戶名文本框
        JTextField txtUsername = new JTextField(15);
        // 將標籤與文本框添加到第一個面板
        panel1.add(lblUsername);
        panel1.add(txtUsername);

        /* 第二個面板裏要添加密碼標籤與文本框 */
        // 創建密碼標籤
        JLabel lblPassword = new JLabel("密    碼:");
        // 創建密碼文本框
        JPasswordField txtPassword = new JPasswordField(15);
        // 將標籤與文本框添加到第二個面板
        panel2.add(lblPassword);
        panel2.add(txtPassword);

        /* 第三個面板裏要添加兩個按鈕 */
        // 創建登錄按鈕
        JButton btnLogin = new JButton("登錄");
        // 創建取消按鈕
        JButton btnCancel = new JButton("取消");
        // 將兩個按鈕添加到第三個面板
        panel3.add(btnLogin);
        panel3.add(btnCancel);

        // 設置窗口邊界
        setBounds(200, 200, 300, 200);
        // 設置屏幕居中
        setLocationRelativeTo(null);
        // 設置窗口緊湊
        pack();
        // 設置窗口可見
        setVisible(true);
        // 設置默認關閉方式
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 給【取消】按鈕註冊動作監聽器
        btnCancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 退出應用程序
                System.exit(0);
            }
        });

        // 給【登錄】按鈕註冊動作監聽器
        btnLogin.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 獲取用戶輸入的用戶名與密碼
                String username = txtUsername.getText().toString();
                String password = new String(txtPassword.getPassword());
                // 創建用戶數據訪問對象
                UserDao userDao = new UserDao();
                // 判斷用戶輸入的用戶名與密碼是否正確
                if (userDao.login(username, password)) {
                    JOptionPane.showMessageDialog(LoginFrame.this,
                            "歡迎登錄系統!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
                    LoginFrame.this.dispose(); // 關閉登錄窗口

                } else {
                    JOptionPane.showMessageDialog(LoginFrame.this,
                            "用戶名或密碼有錯誤!", "提示信息", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }

    /**
     * 主方法
     *
     * @param args
     */
    public static void main(String[] args) {
        // 實例化登錄窗口對象
        LoginFrame loginFrame = new LoginFrame("登錄窗口");
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述

三、課後作業:完成用戶註冊窗口程序

在這裏插入圖片描述

  • 在UserDao類裏添加添加用戶記錄的方法public int insert(User user)
  • 單擊【註冊】按鈕,利用窗口輸入的數據創建用戶對象,再調用UserDao對象的insert()方法,插入新註冊的用戶
  • 註冊成功,彈出消息框“恭喜,註冊成功!”,關閉窗口
  • 註冊失敗,彈出消息框“遺憾,註冊失敗”
  • 單擊【取消】按鈕,關閉窗口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章