Làm ứng dụng Login sử dụng Java Swing + JDBC + MySQL

Đối với các ứng dụng đơn giản thì chúng ta có thể lưu trữ dữ liệu và truy xuất từ tập tin sử dụng Java IO là đã đủ. Thế nhưng đối với một ứng dụng phức tạp cần tổ chức dữ liệu để lưu trữ và truy xuất nhanh chóng thì chắc chắn chúng ta phải dùng đến database.

Chẳng đâu ra, nếu các bạn học Java và Java Swing ở trường thì đồ án có nguy cơ cao là bắt buộc sử dụng database để lưu trữ dữ liệu. Trước đây mình cũng đã từng làm những đồ án như vậy và cảm thấy rất khó khăn khi cấu hình project, nào là tải file jar, import vào các thứ. Rồi khi nộp đồ án quên nộp file jar (thư viện) ông thầy ổng không chạy được lại phải xách đít lên phúc khảo thế nhưng kết quả vẫn bị trừ điểm vì ẩu tả.

Thế nhưng, trong bài viết này mình sẽ hướng dẫn các bạn sử dụng maven để tải các gói jar tự động, không cần phải tự tải tay nữa. Thêm một ưu điểm khi sử dụng maven là khi nộp bài các bạn không cần phải nộp kèm các file jar nữa, thầy chỉ cần lấy mã nguồn về và chạy lệnh install thì các gói jar sẽ được lấy và import tự động vào.

Các công cụ cần thiết

Để hoàn thành bài này, mình sử dụng những công cụ sau:

  1. JDK 1.8
  2. MySQL Connector Java – 8.0.13
  3. Maven
  4. IntellIJ IDE

Maven project

Hiện nay các IDE nỗi tiếng như Eclipse và IntellIJ đều đã hỗ trợ tạo project maven một cách nhanh chóng. Nếu các bạn chưa biết các tạo project maven trong Eclipse và IntellIJ thì có thể tham khảo tại đây.

Mỗi project maven sẽ có một file POM.XML chứa các meta mô tả các thông tin cần thiết của dự án. Trong đó chúng ta sẽ khai báo các thư viện mà dự án sẽ sử dụng, khi chúng ta chạy lệnh maven install thì các gói jar sẽ được tự động tải về. Hoặc các IDE đã hỗ trợ sẵn UI các bạn chỉ cần nhấp chuột một cái là xong thôi.

Sau khi tạo maven project xong, các bạn cần thêm MySQL Connector Java dependency vào file pom như sau

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>swing_connect_database</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

    </dependencies>

</project>

Database Setup

Tiếp theo để thao tác với database thì các bạn cần đảm bảo máy của mình đã cài đặt Mysql database. Tiến hành tạo một database mới theo lệnh sau:

create database swing_demo;

Tiếp theo khởi tạo Student database theo câu lệnh SQL sau:

CREATE TABLE student
( id int NOT NULL,
  name varchar(250) NOT NULL,
  password varchar(250)
);

Sau khi có database và Student table, tiến hành thêm một user vào để tí nữa chúng ta có thể triển khai ví dụ.

INSERT INTO student (id, name, password)
VALUES (1, 'deft', '123456');

Login – Java swing

Trong ứng dụng Login lần này chúng ta sẽ triển khai 3 màn hình:

  • Login
  • Change password
  • Home

Sau khi Login thành công, ứng dụng sẽ chuyển đến màn hình Home. tại màn hình Home chúng ta có thể thay đổi mật khẩu hoặc có thể Logout. Sau khi Logout thì ứng dụng sẽ quay lại màn hình Login.

Qua ứng dụng lần này, các bạn sẽ biết cách tạo ứng dụng Java Swing sử dụng JDBC để thao tác với database. Ngoài ra các bạn sẽ biết cách chuyển đổi qua lại giữa các màn hình trong ứng dụng.

DBConnectionFactory

Đây là class đầu tiên chúng ta cần xây dựng chứa các thông tin kết nối đến database và cung cấp 1 method tạo một connection dùng để thao tác với database.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnectionFactory {
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/swing_demo?serverTimezone=UTC";
    private static final String DATABASE_USER_NAME = "root";
    private static final String DATABASE_PASSWORD = "admin";

    public static Connection getConnection() throws SQLException {
       return DriverManager.getConnection(DATABASE_URL, DATABASE_USER_NAME, DATABASE_PASSWORD);
    }
}

Trong đó các bạn cần lưu ý cho mình

  • DATABASE_URL – đường dẫn đến database trong máy local
  • DATABASE_USER_NAME – Tên người dùng login vào mysql database, phụ thuộc vào bạn đặt thế nào trong lúc cài đặt.
  • DATABASE_PASSWORD – Mật khẩu dùng login vào mysql database, phụ thuộc vào bạn đặt thế nào trong lúc cài đặt.

Do vậy nếu bạn sao chép y chang thì có thể không chạy được vì user/password của mình khác nhau.

UserLogin

Màn hình đầu tiên chứa mẫu đăng nhập gồm user và password. Sau khi nhập xong người dùng có thể bấm vào Login để ứng dụng tiến hành kiểm tra. Nếu tồn tại một user-password tương ứng dưới database thì sẽ thông báo đăng nhập thành công và chuyển đến màn hình Home

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class UserLogin extends JFrame {
    private static final long serialVersionUID = 1L;


    private JTextField textField;
    private JPasswordField passwordField;
    private JButton btnNewButton;
    private JLabel label;
    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UserLogin frame = new UserLogin();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public UserLogin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(450, 190, 1014, 597);
        setResizable(false);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblNewLabel = new JLabel("Login");
        lblNewLabel.setForeground(Color.BLACK);
        lblNewLabel.setFont(new Font("Times New Roman", Font.PLAIN, 46));
        lblNewLabel.setBounds(423, 13, 273, 93);
        contentPane.add(lblNewLabel);

        textField = new JTextField();
        textField.setFont(new Font("Tahoma", Font.PLAIN, 32));
        textField.setBounds(481, 170, 281, 68);
        contentPane.add(textField);
        textField.setColumns(10);

        passwordField = new JPasswordField();
        passwordField.setFont(new Font("Tahoma", Font.PLAIN, 32));
        passwordField.setBounds(481, 286, 281, 68);
        contentPane.add(passwordField);

        JLabel lblUsername = new JLabel("Username");
        lblUsername.setBackground(Color.BLACK);
        lblUsername.setForeground(Color.BLACK);
        lblUsername.setFont(new Font("Tahoma", Font.PLAIN, 31));
        lblUsername.setBounds(250, 166, 193, 52);
        contentPane.add(lblUsername);

        JLabel lblPassword = new JLabel("Password");
        lblPassword.setForeground(Color.BLACK);
        lblPassword.setBackground(Color.CYAN);
        lblPassword.setFont(new Font("Tahoma", Font.PLAIN, 31));
        lblPassword.setBounds(250, 286, 193, 52);
        contentPane.add(lblPassword);

        btnNewButton = new JButton("Login");
        btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 26));
        btnNewButton.setBounds(545, 392, 162, 73);
        btnNewButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                String userName = textField.getText();
                String password = passwordField.getText();
                try {
                    Connection connection = DBConnectionFactory.getConnection();

                    PreparedStatement st = connection
                            .prepareStatement("Select name, password from student where name=? and password=?");

                    st.setString(1, userName);
                    st.setString(2, password);
                    ResultSet rs = st.executeQuery();
                    if (rs.next()) {
                        dispose();
                        UserHome ah = new UserHome(userName);
                        ah.setTitle("Chao mung");
                        ah.setVisible(true);
                        JOptionPane.showMessageDialog(btnNewButton, "Ban da dang nhap thanh cong");
                    } else {
                        JOptionPane.showMessageDialog(btnNewButton, "User hoac password sai!");
                    }
                } catch (SQLException sqlException) {
                    sqlException.printStackTrace();
                }
            }
        });

        contentPane.add(btnNewButton);

        label = new JLabel("");
        label.setBounds(0, 0, 1008, 562);
        contentPane.add(label);
    }
}

Hãy khoang nhé, các bạn thấy trong UserLogin class có sử dụng UserHome nên biên dịch lúc này sẽ bị lỗi.

UserHome

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

public class UserHome extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;

    public UserHome() {

    }

    /**
     * Create the frame.
     */
    public UserHome(final String userSes) {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(450, 190, 1014, 597);
        setResizable(false);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        final JButton btnNewButton = new JButton("Logout");
        btnNewButton.setForeground(new Color(0, 0, 0));
        btnNewButton.setBackground(UIManager.getColor("Button.disabledForeground"));
        btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 39));
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int a = JOptionPane.showConfirmDialog(btnNewButton, "Are you sure?");
                if (a == JOptionPane.YES_OPTION) {
                    dispose();
                    UserLogin obj = new UserLogin();
                    obj.setTitle("Student-Login");
                    obj.setVisible(true);
                }
                dispose();
                UserLogin obj = new UserLogin();

                obj.setTitle("Student-Login");
                obj.setVisible(true);

            }
        });
        btnNewButton.setBounds(247, 118, 491, 114);
        contentPane.add(btnNewButton);
        JButton button = new JButton("Change-password\r\n");
        button.setBackground(UIManager.getColor("Button.disabledForeground"));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ChangePassword bo = new ChangePassword(userSes);
                bo.setTitle("Change Password");
                bo.setVisible(true);

            }
        });
        button.setFont(new Font("Tahoma", Font.PLAIN, 35));
        button.setBounds(247, 320, 491, 114);
        contentPane.add(button);
    }
}

ChangePassword

Cuối cùng là màn hình Change password cho phép chúng ta thay đổi mật khẩu xuống database.

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ChangePassword extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField textField;
    private JLabel lblEnterNewPassword;

    /**
     * Create the frame.
     */
    public ChangePassword(final String name) {
        setBounds(450, 360, 1024, 234);
        setResizable(false);

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        textField = new JTextField();
        textField.setFont(new Font("Tahoma", Font.PLAIN, 34));
        textField.setBounds(373, 35, 609, 67);
        contentPane.add(textField);
        textField.setColumns(10);

        final JButton btnSearch = new JButton("Enter");
        btnSearch.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String pstr = textField.getText();
                try {
                    System.out.println("update password name " + name);
                    System.out.println("update password");

                    Connection con = DBConnectionFactory.getConnection();

                    PreparedStatement st = con
                            .prepareStatement("Update student set password=? where name=?");

                    st.setString(1, pstr);
                    st.setString(2, name);
                    st.executeUpdate();
                    JOptionPane.showMessageDialog(btnSearch, "Password has been successfully changed");

                } catch (SQLException sqlException) {
                    sqlException.printStackTrace();
                }

            }
        });
        btnSearch.setFont(new Font("Tahoma", Font.PLAIN, 29));
        btnSearch.setBackground(new Color(240, 240, 240));
        btnSearch.setBounds(438, 127, 170, 59);
        contentPane.add(btnSearch);

        lblEnterNewPassword = new JLabel("Enter New Password :");
        lblEnterNewPassword.setFont(new Font("Tahoma", Font.PLAIN, 30));
        lblEnterNewPassword.setBounds(45, 37, 326, 67);
        contentPane.add(lblEnterNewPassword);
    }
}

Demo

Sau khi hoàn thành ứng dụng, giờ đây các bạn có thể khởi chạy và đi qua từng bước như sau:

Bước 1: Login với user-pass là deft-123456 như đã thêm vào database trước đó.

Sau khi login thành công thông báo sẽ hiện lên

Bước 2: Chọn thay đổi password và nhập 123123

Chọn Enter và kiểm tra database

Cuối cùng khi các bạn chọn Logout thì ứng dụng sẽ quay trở lại màn hình Login.

Nguồn

https://www.javaguides.net/2019/07/login-application-using-java-swing-jdbc-mysql-example-tutorial.html

 

 

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x