目錄
要求
思路
1. 登錄模塊(LoginFrame.java)
2. 學生信息管理模塊(StudentFrame.java)
3. 數據層(StudentDAO.java)
4. 業務層(StudentService.java / UserService.java)
5. 工具類(DBUtil.java)
項目結構
數據庫表格
如何操作
代碼
db.properties
Student.java (實體類)
DBUtil.java (數據庫工具類)
StudentDAO.java (數據庫操作)
UserService.java (簡單登錄校驗)
LoginFrame.java
StudentFrame.java
ButtonRenderer.java
ButtonEditor.java
Main.java
pom.xml
展示
知識點表格
要求
制作一個用戶登錄,學生管理系統,要求界面如下:
1.LoginFrame:用戶登錄窗口。
2.StudentFrame:學生信息管理窗口(查詢、添加、刪除、修改)。
思路
1. 登錄模塊(LoginFrame.java)
Swing界面:用戶名、密碼輸入框 + 登錄按鈕。
校驗用戶名密碼。
登錄成功后跳轉到 StudentFrame。
2. 學生信息管理模塊(StudentFrame.java)
查詢學生(姓名模糊查詢)。
列表展示(JTable)。
刪除、修改按鈕。
添加學生按鈕。
3. 數據層(StudentDAO.java)
數據庫CRUD操作(增刪改查)。
4. 業務層(StudentService.java / UserService.java)
調用DAO進行數據處理。
登錄校驗、學生信息管理。
5. 工具類(DBUtil.java)
數據庫連接管理(JDBC封裝)。
項目結構
StudentManager/
├── src/
│ ? ├── com.studentmanager/
│ ? │ ? ├── frame/
│ ? │ ? │ ? ├── LoginFrame.java
│ ? │ ? │ ? ├── StudentFrame.java│? ?│?? │? ?├── ButtonRenderer.java??
│? ? │? │?? └── ButtonEditor.java? ?
│ ? │ ? ├── entity/
│ ? │ ? │ ? ├── Student.java
│ ? │ ? ├── service/
│ ? │ ? │ ? ├── UserService.java
│ ? │ ? │ ? ├── StudentService.java
│ ? │ ? ├── dao/
│ ? │ ? │ ? ├── StudentDAO.java
│ ? │ ? ├── util/
│ ? │ ? │ ? ├── DBUtil.java
│ ? │ ? ├── Main.java
├── resources/
? ? └── db.properties ?(數據庫配置)
數據庫表格
-- 創建學生表
create table student (id int primary key auto_increment,name varchar(50),address varchar(100)
);-- 創建用戶表
create table user (username varchar(50) primary key,password varchar(50)
);-- 插入管理員用戶
insert into user values ('admin', '123456');
如何操作
1.在 IDEA 創建 Maven 項目(普通 Java 項目也行)。
2.建立以上目錄結構。
3.先寫實體類(Student、User)。
4.寫 DBUtil 封裝 JDBC 連接。
5.寫 DAO 層操作數據庫。
6.寫 Service 層處理業務。
7.先實現 LoginFrame,登錄后顯示 StudentFrame。
8.實現 JTable 的查詢、刪除、修改、添加功能。
9.最后測試運行。
代碼
db.properties
# db.properties
url=jdbc:mysql://localhost:3306/studentdb?useSSL=false&serverTimezone=UTC
user=root
password=123456
Student.java (實體類)
package com.studentmanager.entity;public class Student {private int id;private String name;private String address;public Student(int id, String name, String address) {this.id = id;this.name = name;this.address = address;}public int getId() { return id; }public String getName() { return name; }public String getAddress() { return address; }
}
DBUtil.java (數據庫工具類)
package com.studentmanager.util;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;public class DBUtil {private static String URL;private static String USER;private static String PASSWORD;static {try (InputStream input = DBUtil.class.getClassLoader().getResourceAsStream("db.properties")) {Properties prop = new Properties();prop.load(input);URL = prop.getProperty("url");USER = prop.getProperty("user");PASSWORD = prop.getProperty("password");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("讀取數據庫配置文件失敗", e);}}public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USER, PASSWORD);}
}
StudentDAO.java (數據庫操作)
package com.studentmanager.dao;import com.studentmanager.entity.Student;
import com.studentmanager.util.DBUtil;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class StudentDAO {public List<Student> queryStudents(String name) {List<Student> list = new ArrayList<>();String sql = "SELECT * FROM student WHERE name LIKE ?";try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)) {ps.setString(1, "%" + name + "%");ResultSet rs = ps.executeQuery();while (rs.next()) {list.add(new Student(rs.getInt("id"), rs.getString("name"), rs.getString("address")));}} catch (SQLException e) {e.printStackTrace();}return list;}public void deleteStudent(int id) {String sql = "DELETE FROM student WHERE id=?";try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)) {ps.setInt(1, id);ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}public void updateStudent(Student student) {String sql = "UPDATE student SET name=?, address=? WHERE id=?";try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)) {ps.setString(1, student.getName());ps.setString(2, student.getAddress());ps.setInt(3, student.getId());ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}public void addStudent(Student student) {String sql = "INSERT INTO student (name, address) VALUES (?, ?)";try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)) {ps.setString(1, student.getName());ps.setString(2, student.getAddress());ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}
}
UserService.java (簡單登錄校驗)
package com.studentmanager.service;public class UserService {public boolean login(String username, String password) {// 簡單寫死驗證return "admin".equals(username) && "123456".equals(password);}
}
LoginFrame.java
package com.studentmanager.frame;import com.studentmanager.service.UserService;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class LoginFrame extends JFrame {private JTextField usernameField;private JPasswordField passwordField;public LoginFrame() {setTitle("用戶登錄");setSize(300, 200);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(null);JLabel userLabel = new JLabel("用戶名:");userLabel.setBounds(30, 30, 60, 25);add(userLabel);usernameField = new JTextField();usernameField.setBounds(100, 30, 150, 25);add(usernameField);JLabel passLabel = new JLabel("密碼:");passLabel.setBounds(30, 70, 60, 25);add(passLabel);passwordField = new JPasswordField();passwordField.setBounds(100, 70, 150, 25);add(passwordField);JButton loginButton = new JButton("登錄");loginButton.setBounds(100, 110, 80, 25);add(loginButton);loginButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {UserService userService = new UserService();String username = usernameField.getText();String password = new String(passwordField.getPassword());if (userService.login(username, password)) {dispose();new StudentFrame();} else {JOptionPane.showMessageDialog(null, "用戶名或密碼錯誤!");}}});setVisible(true);}
}
StudentFrame.java
package com.studentmanager.frame;import com.studentmanager.dao.StudentDAO;
import com.studentmanager.entity.Student;import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;public class StudentFrame extends JFrame {private JTable table;private JTextField searchField;private StudentDAO dao = new StudentDAO();public StudentFrame() {setTitle("學生管理");setSize(600, 400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(null);JLabel nameLabel = new JLabel("姓名:");nameLabel.setBounds(20, 20, 50, 25);add(nameLabel);searchField = new JTextField();searchField.setBounds(70, 20, 150, 25);add(searchField);JButton searchButton = new JButton("查詢");searchButton.setBounds(230, 20, 80, 25);add(searchButton);searchButton.addActionListener(e -> refreshTable());String[] columns = {"編號", "姓名", "地址", "操作"};table = new JTable(new DefaultTableModel(columns, 0));JScrollPane scrollPane = new JScrollPane(table);scrollPane.setBounds(20, 60, 550, 200);add(scrollPane);JButton addButton = new JButton("添加");addButton.setBounds(20, 280, 80, 25);add(addButton);addButton.addActionListener(e -> {String name = JOptionPane.showInputDialog("請輸入姓名");String address = JOptionPane.showInputDialog("請輸入地址");dao.addStudent(new Student(0, name, address));refreshTable();});table.getColumnModel().getColumn(3).setCellRenderer(new ButtonRenderer());table.getColumnModel().getColumn(3).setCellEditor(new ButtonEditor(new JCheckBox(), this));refreshTable();setVisible(true);}public void refreshTable() {String name = searchField.getText();List<Student> list = dao.queryStudents(name);DefaultTableModel model = (DefaultTableModel) table.getModel();model.setRowCount(0);for (Student s : list) {model.addRow(new Object[]{s.getId(), s.getName(), s.getAddress(), "刪除 / 修改"});}}public void deleteStudent(int id) {dao.deleteStudent(id);refreshTable();}public void updateStudent(int id) {String name = JOptionPane.showInputDialog("修改姓名");String address = JOptionPane.showInputDialog("修改地址");dao.updateStudent(new Student(id, name, address));refreshTable();}
}
ButtonRenderer.java
package com.studentmanager.frame;import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;public class ButtonRenderer extends JPanel implements TableCellRenderer {private JButton deleteButton;private JButton editButton;public ButtonRenderer() {setLayout(new FlowLayout(FlowLayout.CENTER, 5, 0));deleteButton = new JButton("刪除");editButton = new JButton("修改");add(deleteButton);add(editButton);}@Overridepublic Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) {return this;}
}
ButtonEditor.java
package com.studentmanager.frame;import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class ButtonEditor extends AbstractCellEditor implements TableCellEditor {private JPanel panel;private JButton deleteButton;private JButton editButton;private JTable table;private StudentFrame parentFrame;public ButtonEditor(JCheckBox checkBox, StudentFrame parentFrame) {this.parentFrame = parentFrame;panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));deleteButton = new JButton("刪除");editButton = new JButton("修改");panel.add(deleteButton);panel.add(editButton);deleteButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int row = table.getSelectedRow();int id = (int) table.getValueAt(row, 0);parentFrame.deleteStudent(id);}});editButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int row = table.getSelectedRow();int id = (int) table.getValueAt(row, 0);parentFrame.updateStudent(id);}});}@Overridepublic Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected, int row, int column) {this.table = table;return panel;}@Overridepublic Object getCellEditorValue() {return null;}
}
Main.java
package com.studentmanager;import com.studentmanager.frame.LoginFrame;public class Main {public static void main(String[] args) {new LoginFrame();}
}
pom.xml
<?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><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies><groupId>org.example</groupId><artifactId>StudentManager</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
展示
知識點表格
知識點 | 說明 |
---|---|
Java Swing | 圖形界面編程 |
JDBC | 數據庫連接與操作 |
MVC 分層 | 控制層(Frame)、業務層(Service)、數據層(DAO) |
事件監聽 | ActionListener、事件處理 |
JTable | 表格組件實現學生信息展示 |
Model數據綁定 | JTable表格數據與List的綁定 |
布局管理器 | BorderLayout、FlowLayout、GridLayout 等 |
MySQL/SQLite | 簡單數據庫存儲 |
工具類封裝 | 數據庫連接封裝成工具類 |