目录
[1. 登录模块(LoginFrame.java)](#1. 登录模块(LoginFrame.java))
[2. 学生信息管理模块(StudentFrame.java)](#2. 学生信息管理模块(StudentFrame.java))
[3. 数据层(StudentDAO.java)](#3. 数据层(StudentDAO.java))
[4. 业务层(StudentService.java / UserService.java)](#4. 业务层(StudentService.java / UserService.java))
[5. 工具类(DBUtil.java)](#5. 工具类(DBUtil.java))
[Student.java (实体类)](#Student.java (实体类))
[DBUtil.java (数据库工具类)](#DBUtil.java (数据库工具类))
[StudentDAO.java (数据库操作)](#StudentDAO.java (数据库操作))
[UserService.java (简单登录校验)](#UserService.java (简单登录校验))
要求
制作一个用户登录,学生管理系统,要求界面如下:
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 (数据库配置)
数据库表格
sql
-- 创建学生表
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
java
# db.properties
url=jdbc:mysql://localhost:3306/studentdb?useSSL=false&serverTimezone=UTC
user=root
password=123456
Student.java (实体类)
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 (数据库工具类)
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 (数据库操作)
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 (简单登录校验)
java
package com.studentmanager.service;
public class UserService {
public boolean login(String username, String password) {
// 简单写死验证
return "admin".equals(username) && "123456".equals(password);
}
}
LoginFrame.java
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() {
@Override
public 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
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
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);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
return this;
}
}
ButtonEditor.java
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() {
@Override
public void actionPerformed(ActionEvent e) {
int row = table.getSelectedRow();
int id = (int) table.getValueAt(row, 0);
parentFrame.deleteStudent(id);
}
});
editButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int row = table.getSelectedRow();
int id = (int) table.getValueAt(row, 0);
parentFrame.updateStudent(id);
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
this.table = table;
return panel;
}
@Override
public Object getCellEditorValue() {
return null;
}
}
Main.java
java
package com.studentmanager;
import com.studentmanager.frame.LoginFrame;
public class Main {
public static void main(String[] args) {
new LoginFrame();
}
}
pom.xml
java
<?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 | 简单数据库存储 |
工具类封装 | 数据库连接封装成工具类 |