Tạo Ứng Dụng Quản Lý Sinh Viên Với JDBC Như Thế Nào?

Tạo Ứng Dụng Quản Lý Sinh Viên Với JDBC Như Thế Nào?

JDBC là một API tiêu chuẩn được dùng để kết nối với các cơ sở dữ liệu. Bài viết này sẽ hướng dẫn các bạn đang học lập trình cách sử dụng JDBC qua một ví dụ đơn giản: tạo một ứng dụng quản lý sinh viên sử dụng ngôn ngữ Java, các bạn xem chi tiết ở bên dưới nhé.

JDBC là gì?

Một cách đơn giản và ít phức tạp nhất, JDBC (Java Database Connectivity) là công cụ hoạt động như một driver giúp chúng ta kết nối cơ sở dữ liệu trong ứng dụng Java, giúp ứng dụng Java thực hiện kết nối và làm việc với cơ sở dữ liệu. Nó cho phép ta thực hiện các thao tác truy xuất, cập nhật dữ liệu hoặc nhiều thứ khác thông qua việc sử dụng các câu lệnh SQL. 

Thành phần cơ bản phải nắm rõ

  1. DriverManager: dùng để quản lý danh sách các Driver (database drivers). 
  2. Driver: dùng để liên kết ứng dụng java với cơ sở dữ liệu.
  3. Connection: tất cả các thông tin liên lạc với cơ sở dữ liệu điều thông qua đối tượng Connection.
  4. Statement: Thành phần này gói gọn một câu lệnh SQL để gửi tới cơ sở dữ liệu và thực hiện.
  5. ResultSet: Sau khi thực hiện StatementResultSet đại diện cho tập hợp các bản ghi lấy do thực hiện truy vấn.

 

 

Mô hình trực quan mối quan hệ, tính năng cũng như cách thức hoạt động

Sử dụng JDBC như thế nào

Config cho SQL Server

Để phần mềm (Java) của bạn có thể kết nối được với cơ sở dữ liệu, việc đầu tiên các bạn cần phải xác định hình thức kết nối và cổng kết nối cho database, ở đây mình sử dụng Database SQL Server (SQLJDBC) của Microsoft, cách bạn có thể tải về tại link bên dưới bài viết này. Ở ví dụ này, các bạn chỉ cần tạo database, mọi thông số như port các bạn có thể để mặc định (Port:1443) và bỏ qua bước này, hoặc các bạn đã thông hiểu sâu về SQL Server có thể tùy chỉnh lại config cho các instance của Server như hình dưới

Cài đặt cổng kết nối như trong hình vẽ, hãy nhớ số TCP Dynamic Ports, sau này sẽ dùng nhiều

Kích hoạt các Protocol như trong hình (nếu gặp lỗi)

Tạo database

Tiếp theo, đảm bảo bạn đã tạo một cơ sở dữ liệu trên SQL Server, chú ý khi tạo bạn hãy ghi nhớ tên của database cũng như tên của các đối tượng bạn tạo bên trong database này. Bên dưới là một database mẫu đơn giản mình đã tạo sẵn bằng SQL, các bạn có thể tải về ở cuối bài viết.

Cài đặt driver

Cuối cùng, hãy chắc chắn rằng thư viện điều khiển Database SQL Server (SQLJDBC) đã được thêm vào Java project của các bạn, các bạn tải về thư viện ở bên dưới bài viết và làm như trong ảnh, trong trường hợp project của các bạn đã có sẵn thư viện SQLJDBC thì hãy bỏ qua bước này.

Thêm thư viện sqljdbc phiên bản mới nhất để có thể sử dụng các thành phần của JDBC (Đã được nêu ở mục giới thiệu)

Lập trình ứng dụng quản lý sinh viên

 

DatabaseInfo: Lưu trữ thông tin cơ bản của database

StudentManager: Lưu trữ các hàm thao tác cơ bản để quản lí các sinh viên trong cơ sở dữ liệu

GUI: Giao diện đồ họa của phần mềm

Validation (Chức năng phụ): Kiểm tra dữ liệu để tránh lỗi xảy ra trong cơ sở dữ liệu (trùng khóa chính, out of range, ...)

BƯỚC 1: Đầu tiên chúng ta tạo các thông tin cơ bản như sau, các bạn chú ý phần dbURL, tại đây hãy điền đúng port và tên database đã cài đặt ở phần 1 để có thể kết nối. Lưu ý có hai loại đăng nhập vào SQL Server: SQL authentication và Windows authentication, các bạn tham khảo 1 trong 2 cách (khuyến khích dùng cách 1).

public class DatabaseInfo {

    public static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

//localhost:<PORT>  databaseName=<Tên của database vừa tạo>
    public static String dbURL = "jdbc:sqlserver://localhost:8888;databaseName=University";

//Username và Password chừa trống, trong phần mềm sẽ nhập sau
    public static String dbUser = "";
    public static String dbPass = "";
}

 SQL authentication

public class DatabaseInfo {

    public static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

//localhost:<PORT>  databaseName=<Tên của database vừa tạo>
    public static String dbURL = "jdbc:sqlserver://localhost:8888;databaseName=University;integratedSecurity=true";

// Vẫn chừa trống, mặc dù không dùng
    public static String dbUser = "";
    public static String dbPass = "";
}

Windows authentication

Lưu ý: SQL Server xác thực đăng nhập với 2 cơ chế: SQL authenticationWindows authentication

  • SQL authentication: bạn cần phải cung cấp tên đăng nhập và mật khẩu và cả 2 đều được lưu trong SQL Server. 
  • Windows authentication: tài khoản hiện tại đang muốn đăng nhập vào Windows sẽ được dùng

Để tìm hiểu kỹ hơn về các khái niệm bảo mật trong database, các bạn có thể đón xem các blog sau này của mình. Ở ví dụ bên dưới, phần mềm quản lý sinh viên sẽ kết nối với hệ cơ sở dữ liệu qua hình thức SQL authentication.

BƯỚC 2: Khởi tạo kết nối, trả về một đối tượng Connection, hàm này các bạn có thể bỏ ở bất cứ nơi nào thuận tiện cho việc gọi kết nối sau này

    public Connection getConnect() throws ClassNotFoundException, SQLException {
	Class.forName(DatabaseInfo.driverName);
	connection = DriverManager.getConnection(DatabaseInfo.dbURL, DatabaseInfo.dbUser, DatabaseInfo.dbPass);
	return connection;
    }

BƯỚC 3: Các hàm thao tác căn bản trong class StudentManagement 

  • Lấy toàn bộ sinh viên trong database
    public Vector<Vector<String>> getAll() throws ClassNotFoundException, SQLException {
    	Vector<Vector<String>> data = new Vector<>();
    
    	// Kết nối database
    	connection = getConnect();
    
    	// Tạo câu lệnh SQL (Cách 1: dùng Statement)
    	Statement stmt = connection.createStatement();
    	ResultSet rs = stmt.executeQuery("Select * from Students");
    	while (rs.next()) {
    
    	    // Lấy dữ liệu từ ResultSet
    	    String Sno = rs.getString(1);
    	    String Sname = rs.getString(2);
    	    String Sgender = rs.getString(3);
    	    String Sclass = rs.getString(4);
    	    String Saddress = rs.getString(5);
    	    String Semail = rs.getString(6);
    
    	    // Ghi vào vector
    	    Vector<String> temp = new Vector<>();
    	    temp.add(Sno);
    	    temp.add(Sname);
    	    temp.add(Sgender);
    	    temp.add(Sclass);
    	    temp.add(Saddress);
    	    temp.add(Semail);
    
    	    // Thêm dữ liệu vào data vector chính
    	    data.add(temp);
    	}
    	return data;
        }​
  • Thêm một sinh viên mới vào database
    public void addNew(String Sno, String Sname, String Sgender, String Sclass, String Sadress, String Semail)
                        throws ClassNotFoundException, SQLException {
    	// Kết nối database
    	connection = getConnect();
    
    	// Tạo câu lệnh SQL (Cách 2: sử dụng PreparedStatement)
    	String sql = "INSERT INTO Students(Sno,Sname,Sgender,Sclass,Sadress,Semail) VALUES(?,?,?,?,?,?)";
    	PreparedStatement stmt = connection.prepareStatement(sql);
    	stmt.setString(1, Sno);
    	stmt.setString(2, Sname);
    	stmt.setString(3, Sgender);
    	stmt.setString(4, Sclass);
    	stmt.setString(5, Sadress);
    	stmt.setString(6, Semail);
    
    	// Thực hiện lệnh SQL
    	stmt.executeUpdate();
    
    	// Đóng kết nối
    	connection.close();
        }​
  • Xóa một sinh viên khỏi database
    public int delete(String Sno) throws SQLException, ClassNotFoundException {
    	int deleteStatus = 0;
    
    	// Kết nối database
    	connection = getConnect();
    
    	// Xóa sinh viên
    	String sql = "DELETE FROM STUDENTS WHERE Sno='" + Sno + "'";
    	Statement stm1 = connection.createStatement();
    	deleteStatus = stm1.executeUpdate(sql);
    
    	// Trả về kết quả int (có xóa thành công hay không)
    	connection.close();
    	return deleteStatus;
        }​
  • Đây là các chức năng chính bắt buộc phải có để có thể quản lý sinh viên, ngoài ra các bạn có thể sáng tạo thêm các chức năng mới như: Tính điểm trung bình, Lấy sinh viên cao điểm nhất, lấy sinh viên theo ID, theo tên, ... Ở đây mình sẽ không đi quá sâu vào hướng dẫn, mình sẽ chủ yếu hướng dẫn cách sử dụng JDBC hiệu quả nhất.

BƯỚC 4: Tạo giao diện đồ họa bằng JFrame

Như bài viết trước, ở đây mình không hướng dẫn sâu về cách hoạt động cũng như tạ JFrame, đây là các thành phần và chức năng chính trong phần mềm của mình, các bạn có thể tham khảo và tùy biến theo sở thích 

  • scrollPane: chứa table, table này chính là danh sách sinh viên lấy ra từ database
  • updateAndAdd: cung cấp giao diện để điền thông tin
  • btnLoad,btnPrint: Các chức năng cơ bản, tải cơ sở dữ liệu và in ra tệp PDF

Bước 5: Tạo đối tượng StudentManager để truy cập các hàm tại bước 3, LOAD dữ liệu vào phần mềm

StudentManager manager = new StudentManager();

Tạo đối tượng manager

public void actionPerformed(ActionEvent arg0) {
		    try {
			// Tạo giao diện cho người dùng nhập username và password của database
			JPanel inputPane = new JPanel();
			inputPane.setLayout(new GridLayout(0, 2, 2, 2));
			JLabel label1 = new JLabel("Type database username: ");
			label1.setFont(new Font("Tahoma", Font.BOLD, 18));
			JLabel label2 = new JLabel("Type database password: ");
			label2.setFont(new Font("Tahoma", Font.BOLD, 18));

			// Tạo nơi điền username và password
			JTextField userName = new JTextField();
			JTextField passWord = new JTextField();
			inputPane.add(label1);
			inputPane.add(userName);
			inputPane.add(label2);
			inputPane.add(passWord);
			if (JOptionPane.showConfirmDialog(contentPane, inputPane,
			                "To connect database, please type infomation below !", JOptionPane.YES_NO_OPTION,
			                JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) {

			    // Lấy username và password
			    String user = userName.getText();
			    String pass = passWord.getText();
			    if ((user.isEmpty()) || (pass.isEmpty())) throw new Exception("Input was not correct");
			    DatabaseInfo.dbUser = user;
			    DatabaseInfo.dbPass = pass;
			} else throw new Exception("Canceled by user");

			// Tải dữ liệu từ database vào phần mềm
			data = manager.getAll();

			// Thiết kế bảng dữ liệu để hiển thị
			header = new Vector<String>();
			header.add("ID");
			header.add("Name");
			header.add("Gender");
			header.add("Class");
			header.add("Adress");
			header.add("Email");
			((DefaultTableModel) (table.getModel())).setDataVector(data, header);

			// Kích hoạt các chức năng Add, Delete, tắt phần thông báo
			btnAdd.setEnabled(true);
			btnDelete.setEnabled(true);
			infomationPanel.setVisible(false);

			// Thông báo thành công
			JOptionPane.showMessageDialog(contentPane, "Load sucess!");

		    } catch (Exception e) {
			JOptionPane.showMessageDialog(contentPane, "Load failure!\nDetails: " + e);
		    }
		}

Action Listener cho nút LOAD

BƯỚC 6: ADDDELETE trên phần mềm, đồng nghĩa với dữ liệu trên cơ sở dữ liệu cũng sẽ thay đổi, bước này rất dễ sinh lỗi nếu các bạn không có một đối tượng Validation để kiểm tra dữ liệu nhập vào, các bạn có thể tham khảo code bên dưới, mình có chú dẫn từng dòng rất dễ hiểu.

protected void btnAddActionPerformed(ActionEvent arg0) {
	try {
	    //Lấy dữ liệu nhập trên phần mềm
	    String Sno = textField.getText();
	    String Sname = textField_1.getText();
	    String Sgender = getGender();
	    String Sclass = textField_2.getText();
	    String Sadress = textField_3.getText();
	    String Semail = textField_4.getText();

	    // Kiểm tra dữ liệu nhập vào, kiểm tra trùng khóa chính trong database
	    if (manager.checkStudent(Sno)) throw new Exception("This student ID is already exits in database!");
	    if (!Validation.checkIdFormat(Sno)) throw new Exception("Id of student can not contain space!");
	    if (!Validation.checkNameFormat(Sname)) throw new Exception("Name of student can not contain special(s) character!");
	    if (!Validation.checkIdFormat(Sclass)) throw new Exception("Name of class can not contain special(s) character!");
	    if (!Validation.checkNameFormat(Sadress)) throw new Exception("Adress can not contain special(s) character!");

	    // Thêm dữ liệu vào database
	    manager.addNew(Sno, Sname, Sgender, Sclass, Sadress, Semail);

	    // Cập nhật hiển thị database cho phần mềm
	    data = manager.getAll();
	    ((DefaultTableModel) (table.getModel())).setDataVector(data, header);

	    // Thông báo thành công
	    JOptionPane.showMessageDialog(contentPane, "Add Success!", "Sucess", JOptionPane.INFORMATION_MESSAGE);
	} catch (Exception e1) {
	    JOptionPane.showMessageDialog(contentPane, "Add new failure\nDetails: " + e1, "Error", JOptionPane.ERROR_MESSAGE);
	}
    }

Action Listener cho nút ADD

    protected void btnDeleteActionPerformed(ActionEvent e) {
	try {
	    String Sno = textField.getText();

	    // Kiểm tra sinh viên có trong database hay không
	    if (!manager.checkStudent(Sno)) throw new Exception("This student ID is not exits in database, So can delete!");
	    manager.delete(Sno);

	    // Cập nhật lại dữ liệu hiển thị trên phần mềm
	    data = manager.getAll();
	    ((DefaultTableModel) (table.getModel())).setDataVector(data, header);

	    // Thông báo xóa thành công
	    JOptionPane.showMessageDialog(contentPane, "Delete Success!", "Sucess", JOptionPane.INFORMATION_MESSAGE);
	} catch (Exception e1) {
	    JOptionPane.showMessageDialog(contentPane, "Delete failure\nDetails:" + e1, "Error", JOptionPane.ERROR_MESSAGE);
	}
    }

Action Listener cho nút DELETE

(Các chức năng bổ sung như tìm kiếm sinh viên, tính điểm trung bình các bạn cũng làm tương tự)

BƯỚC 7: In dữ liệu ra file PDF

 protected void btnPrintActionPerformed(ActionEvent e) {
	try {
	    // Kiểm tra database trước khi in
	    if (data.isEmpty()) throw new Exception("Make sure your load the database in order to print!");

	    // In vào file PDF, tiêu đề là University
	    MessageFormat header = new MessageFormat("University");
	    MessageFormat footer = new MessageFormat("");
	    table.print(JTable.PrintMode.FIT_WIDTH, header, footer);
	} catch (Exception e1) {
	    JOptionPane.showMessageDialog(contentPane, "Print failure\nDetails: " + e1);
	}
    }

Chạy phần mềm

Điền tên đăng nhập và mật khẩu, nếu các bạn dùng Windows authentication, hãy điền bất kỳ ký tự nào tại username và password.

Bắt buộc điền thông tin trước khi kết nối database 

Kết nối thành công

Thao tác đơn giản

Thêm một sinh viên thành công

Nhờ có Validation, mọi dữ liệu nhập vào đều được đảm bảo đúng tiêu chuẩn, tránh lỗi database

Xóa một đối tượng ra khỏi cơ sở dữ liệu thành công

Lưu trữ cơ sở dữ liệu vào file PDF tiện cho việc in ấn sau này

Một danh sách sinh viên đã được lưu trữ thành công

Tổng kết

Hiện nay, công nghệ JDBC đang rất được ưa chuộng, nhờ nó mà các phần mềm Java có thể kết nối một cách dễ dàng với hệ cơ sở dữ liệu. Các phần mềm game có thể lưu danh sách người chơi, các phần mềm quản lý nhân sự có thể dễ dàng quản lý các nhân viên của họ bằng việc sử dụng phần mềm thay vì thao tác trực tiếp trên cơ sở dữ liệu ở máy chủ.

Qua đây chỉ là một ví dụ nhỏ giúp các bạn hình dung được cách thức hoạt động của JDBC thông qua ứng dụng đơn giản này, trên thực tế để quản lý sinh viên thì cần nhiều tính năng hơn, các bạn hãy thử sức mình và sáng tạo thêm nhé. Mong các bạn luôn ủng hộ mình để mình tiếp tục ra thêm nhiều blog chất lượng khác, nếu các bạn thấy hay có thể chia sẻ cho nhiều người cùng đọc. Cuối cùng, cảm ơn các bạn đã đọc hết bài viết này.

Tải driver JDBC (SQLJDBC) cho SQL Servertại đây

Project tham khảo (Esclipse_Java Project)tại đây

Database sử dụng trong bài viết (SQL)tại đây