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

目录

要求

思路

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简单数据库存储
工具类封装数据库连接封装成工具类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92079.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

译 | 在 Python 中从头开始构建 Qwen-3 MoE

文章出自&#xff1a;基于 2个Expert 的 MoE 架构分步指南 本篇适合 MoE 架构初学者。文章亮点在于详细拆解 Qwen 3 MoE 架构&#xff0c;并用简单代码从零实现 MoE 路由器、RMSNorm 等核心组件&#xff0c;便于理解内部原理。 该方法适用于需部署高性能、高效率大模型&#x…

Spring Boot + ShardingSphere 分库分表实战

&#x1f680;Spring Boot ShardingSphere 实战&#xff1a;分库分表&#xff0c;性能暴增的终极指南&#xff01; ✅ 适用场景&#xff1a;千万级大表、高并发、读写分离场景 ✅ 核心框架&#xff1a;Spring Boot 3.x ShardingSphere-JDBC 5.4.1 ✅ 数据库&#xff1a;MySQL…

MaxKB 使用 MCP 连接 Oracle (免安装 cx_Oracle 和 Oracle Instant Client)

一、背景 安装cx_Oracle包和Oracle Instant Client来操作数据库&#xff0c;比较繁琐同时容易冲突&#xff0c;不同的 Oracle 版本都需要安装不同的插件。这篇文章将介绍使用 MCP 协议的连接方法。 二、操作步骤 1、使用 1Panel 安装 DBhub a) 数据库类型选择 Oracle 类型。…

基于Python的超声波OFDM数字通信链路设计与实现

基于Python的超声波OFDM数字通信链路设计与实现 摘要 本文详细介绍了使用Python实现的超声波OFDM(正交频分复用)数字通信链路系统。该系统能够在标准音响设备上运行&#xff0c;利用高于15kHz的超声波频段进行数据传输&#xff0c;采用48kHz采样率。文章涵盖了从OFDM基本原理、…

滑动窗口相关题目

近些年来&#xff0c;我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨&#xff08;编号1-N&#xff09;&#xff0c;排成一排。一个月后&#xff0c;有M棵胡杨未能成活。现可补种胡杨K棵&#xff0c;请问如何补种&#xff08;只能补种&#xff0c;不能新种&#xff09;&#xf…

Java 工具类的“活化石”:Apache Commons 核心用法、性能陷阱与现代替代方案

在上一篇文章中&#xff0c;我们回顾了 Apache Commons 的经典组件。但作为 Java 世界中资历最老、影响最深远的工具库&#xff0c;它的价值远不止于此。许多开发者可能只使用了它 10% 的功能&#xff0c;却忽略了另外 80% 能极大提升代码质量的“隐藏宝石”。本文将提供一个更…

数据结构——图及其C++实现 多源最短路径 FloydWarshall算法

目录 一、前言 二、算法思想 三、代码实现 四、测试 五、源码 一、前言 前两篇学习的Dijkstra算法和Bellman-Ford算法都是用来求解图的单源最短路径&#xff0c;即从图中指定的一个源点出发到图中其他任意顶点的最短路径。Dijkstra算法不能求解带有负权重的图的最短路径&…

解决微软应用商店 (Microsoft store) 打不开,无网络连接的问题!

很多小伙伴都会遇见微软应用商店 (Microsoft store)打开后出现无网络的问题&#xff0c;一般出现这种问题基本都是因为你的电脑安装了某些银行的网银工具&#xff0c;因为网银工具为了安全会关闭Internet 选项中的最新版本的TLS协议&#xff0c;而微软商店又需要最新的TLS协议才…

Android—服务+通知=>前台服务

文章目录1、Android服务1.1、定义1.2、基本用法1.2.1、定义一个服务1.2.2、服务注册1.2.3、启动和停止服务1.2.4、活动和服务进行通信1.3、带绑定的服务示例1.3.1、定义服务类1.3.2、客户端&#xff08;Activity&#xff09;绑定与交互​1.3.3、AndroidManifest.xml 注册​1.3.…

从基础功能到自主决策, Agent 开发进阶路怎么走

Agent 开发进阶路线大纲基础功能实现核心模块构建环境感知&#xff1a;传感器数据处理&#xff08;视觉、语音、文本等输入&#xff09;基础动作控制&#xff1a;API调用、硬件驱动、简单反馈机制状态管理&#xff1a;有限状态机&#xff08;FSM&#xff09;或行为树&#xff0…

《动手学深度学习》读书笔记—9.6编码器-解码器架构

本文记录了自己在阅读《动手学深度学习》时的一些思考&#xff0c;仅用来作为作者本人的学习笔记&#xff0c;不存在商业用途。 正如我们在9.5机器翻译中所讨论的&#xff0c;机器翻译是序列转换模型的一个核心问题&#xff0c;其输入和输出都是长度可变的序列。为了处理这种类…

DocBench:面向大模型文档阅读系统的评估基准与数据集分析

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 一、数据集概述与核心目标 DocBench 是由研究团队于2024年提出的首个…

Python高级排序技术:非原生可比对象的自定义排序策略详解

引言&#xff1a;超越原生比较操作的排序挑战在Python数据处理中&#xff0c;我们经常需要处理不原生支持比较操作的对象。根据2024年《Python开发者生态系统报告》&#xff0c;在大型项目中&#xff0c;开发者平均需处理28%的自定义对象排序需求&#xff0c;这些对象包括&…

低代码系统的技术深度:超越“可视化操作”的架构与实现挑战

在很多非开发者眼中&#xff0c;低代码平台似乎只是简化流程、快速搭建页面的工具。然而&#xff0c;在真实的企业级应用中&#xff0c;低代码系统必须面对高并发请求、复杂业务规则、多角色权限、跨系统集成与持续演进等一系列工程挑战。高效交付&#xff08;Rapid Delivery&a…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 词云图-微博评论词云图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解词云图-微博评论词云图实现 视频在线地址&…

Webpack核心技能:Webpack安装配置与模块化

一、webpack 的安装和使用1. webpack 简介webpack 是基于模块化的打包 (构建)工具&#xff0c;它把一切视为模块&#xff08;包括 JS、CSS、图片等资源文件&#xff09;。工作原理&#xff1a;以开发时态的入口模块为起点递归分析所有依赖关系经过压缩、合并等处理最终生成运行…

数据结构---二级指针(应用场景)、内核链表、栈(系统栈、实现方式)、队列(实现方式、应用)

一、二级指针的应用场景1、在被调函数中&#xff0c;想要修改主调函数中的指针变量&#xff0c;需要传递该指针变量的地址&#xff0c;形参用二级指针接收。2、指针数组的数组名是一个二级指针&#xff0c;指针数组的数组名作为参数传递时&#xff0c;可用二级指针接收。指针数…

NodeJs学习日志(1):windows安装使用node.js 安装express,suquelize,sqlite,nodemon

windows安装使用node.js 安装express&#xff0c;suquelize&#xff0c;sqlite 系统是win10&#xff0c;默认已经安装好nodejs与npm包名作用expressWeb应用框架suquelize数据库ORMsqlite数据库nodemon代码热重载安装express 添加express生成器 npm add express-generator4安装e…

Cervantes:面向渗透测试人员和红队的开源协作平台

Cervantes 是一个专为渗透测试人员和红队打造的开源协作平台。它提供了一个集中式工作区&#xff0c;用于集中管理项目、客户端、漏洞和报告。通过简化数据组织和团队协调&#xff0c;它有助于减少规划和执行渗透测试所需的时间和复杂性。 作为 OWASP 旗下的开源解决方案&…

[Python 基础课程]猜数字游戏

使用 Python 实现一个猜数字游戏&#xff0c;先随机生成一个 1 到 100 之间的一个随机整数&#xff0c;让用户猜测这个数是什么&#xff0c;每次都提示用户猜大了还是猜小了&#xff0c;如果用户猜对了&#xff0c;提示用户猜对了&#xff0c;用了多少次&#xff0c;并且之前每…