完整的登陆学生管理系统(配置数据库)

目录

要求

思路

[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))

项目结构

数据库表格

如何操作

代码

db.properties

[Student.java (实体类)](#Student.java (实体类))

[DBUtil.java (数据库工具类)](#DBUtil.java (数据库工具类))

[StudentDAO.java (数据库操作)](#StudentDAO.java (数据库操作))

[UserService.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 (数据库配置)

数据库表格

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 简单数据库存储
工具类封装 数据库连接封装成工具类
相关推荐
牧羊狼的狼33 分钟前
React 中的 HOC 和 Hooks
前端·javascript·react.js·hooks·高阶组件·hoc
AD钙奶-lalala1 小时前
Mac OS上搭建 http server
java
知识分享小能手2 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one2 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
魔云连洲2 小时前
深入解析:Vue与React的异步批处理更新机制
前端·vue.js·react.js
mCell3 小时前
JavaScript 的多线程能力:Worker
前端·javascript·浏览器
言之。4 小时前
Django中的软删除
数据库·django·sqlite
超级无敌攻城狮4 小时前
3 分钟学会!波浪文字动画超详细教程,从 0 到 1 实现「思考中 / 加载中」高级效果
前端
excel5 小时前
用 TensorFlow.js Node 实现猫图像识别(教学版逐步分解)
前端
阿里嘎多哈基米5 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列