Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求

1.1实验目的

  1.         ·  掌握Java GUI编程技术,了解Swing框架的使用。
    1.         ·  掌握MySQL数据库的基本操作,了解如何在Java中连接和操作数据库。
      1.         ·  掌握用户权限管理的基本概念和实现方法。
        1.         ·  提升综合运用所学知识设计和实现一个完整应用系统的能力。

1.2实验要求

  1.         ·  设计并实现一个学生管理系统,包含学生信息的录入、修改、删除、查询和统计功能。
  2.         ·  实现用户权限管理,只有经过身份验证的用户才能进行操作。
  3.         ·  提供友好的人机界面,包括登录界面和功能菜单。
  4.         ·  使用MySQL数据库存储和管理学生信息。
  5.         ·  界面美观,操作简便。

二、系统设计

2.1系统总体设计

主要功能模块:

  • 用户登录与注册
  • 学生信息管理(录入、修改、删除、查询)
  • 信息统计
  • 用户权限管理

2.2 系统详细设计

2.2.1 数据库设计

使用MySQL数据库,包含两个主要表:

  • users 表:存储用户信息(用户ID、用户名、密码等)。
  • students 表:存储学生信息(学生ID、姓名、年龄、性别、班级等)。

    2.2.2 用户界面设计

    使用Java Swing框架,设计主要界面如下:

  • 1.登录界面
  • 包含用户名和密码输入框,登录按钮。

  • 2.主界面
  • 包含功能菜单(信息录入、信息修改、信息删除、信息查询、信息统计),显示学生信息的表格。

3.信息录入界面

包含学生信息输入框(姓名、年龄、性别、班级),提交按钮。

4.信息修改界面:

显示所有学生信息的表格,点击某一条记录弹出详细信息修改窗口

5.信息删除界面

显示所有学生信息的表格,选择并删除指定记录。

6.信息查询界面

包含查询输入框和按钮,显示查询结果的表格。

7.信息统计界面

显示学生人数统计信息。

2.2.3 控制器设计

控制器负责处理用户操作,并与模型进行交互,实现各项功能:

1.登录功能

验证用户身份。

如果如果输入的账号密码在数据库的user表中存在,就可以登录进去

反之

2.注册功能

添加用户

会将注册成功的用户直接添加到数据库的表格中

3.信息录入功能

获取用户输入并存储到数据库。

4.信息修改功能

获取用户选择的记录,弹出修改窗口,更新数据库。

5.信息删除功能

获取用户选择的记录,删除数据库中的记录。

6.信息查询功能

根据用户输入的关键词查询数据库,更新表格显示。

7.信息统计功能

查询数据库中的学生人数,并显示结果。

三、实验结果

·  实现了学生管理系统的主要功能,包括用户登录、学生信息录入、修改、删除、查询和统计。

·  界面美观友好,操作简便。

·  系统能够根据用户输入的关键词查询学生信息,并在表格中显示结果。

·  系统在操作过程中能够正确处理用户输入,并与数据库进行交互,确保数据的一致性和完整性。

四、总结分析

通过本次实验,掌握了Java GUI编程和MySQL数据库操作的基本技能,了解了如何将两者结合起来实现一个完整的应用系统。在实现过程中,遇到了一些问题,比如界面布局调整、事件处理等,通过查阅资料和调试,最终得以解决。整体来说,本次实验达到了预期的目的和要求,提高了综合运用所学知识解决实际问题的能力。

五、附录代码

Student类

public class Student {private int id;private String name;private int age;private String gender;private String studentClass;public Student(int id, String name, int age, String gender,String studentClass) {this.id = id;this.name = name;this.age = age;this.gender = gender;this.studentClass=studentClass;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getStudentClass() {return studentClass;}public void setStudentClass(String studentClass) {this.studentClass = studentClass;}
}

Database类

public class Database {private Connection connection;public Connection getConnection() {return connection;}public List<Student> getAllStudents() {List<Student> students = new ArrayList<>();String query = "SELECT * FROM students";try {PreparedStatement preparedStatement = connection.prepareStatement(query);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");String studentClass = resultSet.getString("class");students.add(new Student(id, name, age, gender, studentClass));}} catch (SQLException e) {e.printStackTrace();}return students;}public int getStudentCount() {String query = "SELECT COUNT(*) AS count FROM students";try {PreparedStatement preparedStatement = connection.prepareStatement(query);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()) {return resultSet.getInt("count");}} catch (SQLException e) {e.printStackTrace();}return 0;}// 连接数据库public Database() {try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/studentdb", "root", "a123");} catch (Exception e) {e.printStackTrace();}}// 关闭数据库连接public void close() {try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}// 添加学生信息public void addStudent(Student student) {String query = "INSERT INTO students (id, name, age, gender, class) VALUES (?, ?, ?, ?, ?)";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setInt(1, student.getId());preparedStatement.setString(2, student.getName());preparedStatement.setInt(3, student.getAge());preparedStatement.setString(4, student.getGender());preparedStatement.setString(5, student.getStudentClass());preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 删除学生信息public void deleteStudent(int studentId) {String query = "DELETE FROM students WHERE id = ?";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setInt(1, studentId);preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 查询学生信息public Student getStudent(int id) {String query = "SELECT * FROM students WHERE id = ?";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setInt(1, id);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()) {String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");String studentClass = resultSet.getString("class");return new Student(id, name, age, gender, studentClass);}} catch (SQLException e) {e.printStackTrace();}return null;}// 修改学生信息public void updateStudent(Student student) {String query = "UPDATE students SET name = ?, age = ?, gender = ?, class = ? WHERE id = ?";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setString(1, student.getName());preparedStatement.setInt(2, student.getAge());preparedStatement.setString(3, student.getGender());preparedStatement.setString(4, student.getStudentClass());preparedStatement.setInt(5, student.getId());preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 用户登录public boolean authenticateUser(String username, String password) {String query = "SELECT * FROM users WHERE username = ? AND password = ?";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setString(1, username);preparedStatement.setString(2, password);ResultSet resultSet = preparedStatement.executeQuery();return resultSet.next();} catch (SQLException e) {e.printStackTrace();}return false;}//用户注册public boolean registerUser(String username, String password) {String query = "INSERT INTO users (username, password, role) VALUES (?, ?, 'admin')";try {PreparedStatement preparedStatement = connection.prepareStatement(query);preparedStatement.setString(1, username);preparedStatement.setString(2, password);int rowsInserted = preparedStatement.executeUpdate();return rowsInserted > 0;} catch (SQLException e) {e.printStackTrace();}return false;}}

LoginGUI类:

public class LoginGUI extends JFrame {private JLabel usernameLabel, passwordLabel;private JTextField usernameField;private JPasswordField passwordField;private JButton loginButton;private Database db;private JButton registerButton;Font font = new Font("Serif", Font.BOLD, 20);public LoginGUI() {db = new Database();setTitle("学生管理系统 - 登录");setSize(600, 400);setDefaultCloseOperation(EXIT_ON_CLOSE);setLayout(null);int i=110,j=50;usernameLabel = new JLabel("用户名:");usernameLabel.setBounds(35+i, 30+j, 80, 25);add(usernameLabel);usernameLabel.setFont(font);usernameField = new JTextField(20);usernameField.setBounds(110+i, 30+j, 200, 25);add(usernameField);passwordLabel = new JLabel("密码:");passwordLabel.setBounds(55+i, 70+j, 80, 25);add(passwordLabel);passwordLabel.setFont(font);passwordField = new JPasswordField(20);passwordField.setBounds(110+i, 70+j, 200, 25);add(passwordField);loginButton = new JButton("Login");loginButton.setBounds(130+i, 110+j, 150, 30);add(loginButton);loginButton.setFont(font);loginButton.setBackground(new Color(110, 150, 250));loginButton.setForeground(Color.WHITE);loginButton.setBorder(null);registerButton = new JButton("注册");registerButton.setBounds(130+i, 150+j, 150, 30);add(registerButton);registerButton.setFont(font);registerButton.setBorder(null);ImageIcon image = new ImageIcon("image/m_Loginimage.jpg");// 创建一个标签来展示图片JLabel label = new JLabel(image);// 将标签的布局设置为null,这样我们可以手动设置图片的位置label.setLayout(null);// 设置标签的大小,使其覆盖整个窗口label.setBounds(0, 0, 600, 400);// 将标签添加到窗口的内容面板中this.getContentPane().add(label);// 设置窗口的其他属性,如大小、位置等this.setSize(image.getIconWidth(), image.getIconHeight());this.setVisible(true);loginButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String username = usernameField.getText();String password = new String(passwordField.getPassword());if (db.authenticateUser(username, password)) {new MainGUI();dispose();} else {JOptionPane.showMessageDialog(null, "用户名或密码错误");}}});registerButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new RegisterDialog(LoginGUI.this);}});setVisible(true);setLocationRelativeTo(null);}public static void main(String[] args) {new LoginGUI();}
}

RegisterDialog类:

public class RegisterDialog extends JDialog {private JTextField usernameField;private JPasswordField passwordField;private JButton registerButton;private Database db;public RegisterDialog(JFrame parent) {super(parent, "注册", true);db = new Database();setSize(300, 200);setLocationRelativeTo(parent);setLayout(null);JLabel usernameLabel = new JLabel("用户名:");usernameLabel.setBounds(30, 30, 80, 25);add(usernameLabel);usernameField = new JTextField(20);usernameField.setBounds(110, 30, 150, 25);add(usernameField);JLabel passwordLabel = new JLabel("密码:");passwordLabel.setBounds(30, 70, 80, 25);add(passwordLabel);passwordField = new JPasswordField(20);passwordField.setBounds(110, 70, 150, 25);add(passwordField);registerButton = new JButton("注册");registerButton.setBounds(110, 110, 80, 25);add(registerButton);registerButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String username = usernameField.getText();String password = new String(passwordField.getPassword());if (username.isEmpty() || password.isEmpty()) {JOptionPane.showMessageDialog(RegisterDialog.this, "请输入用户名和密码");} else {boolean success = db.registerUser(username, password);if (success) {JOptionPane.showMessageDialog(RegisterDialog.this, "注册成功");dispose();} else {JOptionPane.showMessageDialog(RegisterDialog.this, "注册失败,请重试");}}}});setVisible(true);}
}

MainGUI类:

public class MainGUI extends JFrame {private JMenuBar menuBar;private JMenu fileMenu, editMenu;private JMenuItem addMenuItem, editMenuItem, deleteMenuItem, searchMenuItem, statsMenuItem, logoutMenuItem;private JTable table;private DefaultTableModel tableModel;private JScrollPane scrollPane;private Database db;private void loadStudentData(DefaultTableModel tableModel) {tableModel.setRowCount(0); // 清空表格数据List<Student> students = db.getAllStudents();for (Student student : students) {Object[] row = {student.getId(), student.getName(), student.getAge(), student.getGender(), student.getStudentClass()};tableModel.addRow(row);}}private void showEditStudentWindow(DefaultTableModel tableModel) {JFrame editFrame = new JFrame("修改学生信息");editFrame.setSize(600, 400);editFrame.setLocationRelativeTo(null);editFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);JPanel editPanel = new JPanel(new BorderLayout());JTable editTable = new JTable();editTable.setModel(tableModel);JScrollPane scrollPane = new JScrollPane(editTable);editPanel.add(scrollPane, BorderLayout.CENTER);JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));JTextField searchField = new JTextField(15);JButton searchButton = new JButton("查询");searchButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String keyword = searchField.getText();if (!keyword.isEmpty()) {List<Student> searchResult = searchStudents(keyword);updateTable(tableModel, searchResult);} else {loadStudentData(tableModel);}}});searchPanel.add(new JLabel("关键词:"));searchPanel.add(searchField);searchPanel.add(searchButton);editPanel.add(searchPanel, BorderLayout.SOUTH);editTable.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {int selectedRow = editTable.getSelectedRow();int studentId = (int) editTable.getValueAt(selectedRow, 0);Student student = db.getStudent(studentId);if (student != null) {showEditStudentDetailWindow(student, tableModel);}}});editFrame.add(editPanel);editFrame.setVisible(true);}

六、创建数据库说明

JDK:17

数据库需要自己创建:

创建方法:点击右上角有一个数据库

点击+号新建

找到MySQL

点击驱动程序,然后在左边这一列找到mysql

点击右边这个版本,找到8.0以上的版本,然后会自动下载

然后再点击上面的数据源

密码自己设置,其他按照下面的来,然后点击确定

先点击刚刚创建的数据源,然后再点击查询控制台也就是下面那个QL的图标,打开默认控制台就行了

然后输入代码

CREATE DATABASE studentdb;
USE studentdb;CREATE TABLE students ( 
id INT AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(100) NOT NULL, age INT NOT NULL,
gender VARCHAR(10) NOT NULL,
class VARCHAR(50) NOT NULL 
);CREATE TABLE users ( 
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE, 
password VARCHAR(100) NOT NULL 
);

以下是数据创建(把之前的SQL代码删除在输入下面的)

INSERT INTO students (name, age, gender, class) VALUES
('Alice', 20, 'Female', 'Class 1'),
('Bob', 21, 'Male', 'Class 1'),
('Charlie', 22, 'Male', 'Class 2'),
('Diana', 20, 'Female', 'Class 2'),
('Eve', 23, 'Female', 'Class 3'),
('Frank', 21, 'Male', 'Class 3');

下面这个是账号和密码,需要写进数据库才能登录

INSERT INTO users (username, password) VALUES
('admin', 'admin123'),
('user1', 'password1');
比如账号是admin,密码是admin123

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

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

相关文章

windows机器免密登录linux主机

1. 正常连接需要输入密码 ssh root1.1.1.1 2. 在Windows上生成SSH密钥对&#xff08;如果你还没有的话&#xff09;&#xff1a; ssh-keygen 3. scp将id_rsa.pub传输到对应的主机 4.对应机器上查看 5.从windows上免密登录

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

树(相关知识点)

目录 结点的度&#xff1a;某一个结点所含有字数的个数 叶节点&#xff1a;最后一个结点 非终端节点:不是叶结点 兄弟结点&#xff1a;亲兄弟结点 树的度&#xff1a;最大节点的度 层次&#xff1a;根为第一层&#xff0c;根的子结点为第二层&#xff0c;以此类推 森林&am…

微软拼音输入法不显示选字框问题

问题展示&#xff1a;不显示选字框 解决方式 打开兼容性即可&#xff08;估计是升级带来的bug&#xff09;

Android使用http加载自建服务器静态网页

最终效果如下图&#xff0c;成功加载了电脑端的静态网页内容&#xff0c;这是一个xml文件。 电脑端搭建http服务器 使用“Apache Http Server”&#xff0c;下载地址是&#xff1a;https://httpd.apache.org/download.cgi。具体操作步骤&#xff0c;参考&#xff1a;Apache …

深度学习与CV入门

文章目录 前言历史 前言 历史 tensorflow可以安装Tensorboard第三方库用于展示效果 TensorFlow工作流程&#xff1a;p6-4:20 使用tf.data加载数据。使用tf.data实例化读取训练数据和测试数据模型的建立与调试:使用动态图模式Eager Execution和著名的神经网络高层API框架Ker…

关于忠诚:忠于自己的良知、理想、信念

关于忠诚&#xff1a; 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事&#xff0c;会纠结离开还是留下&#xff0c;这里我们要深知忠诚的定义&#xff0c;我们不是忠诚于某个人、某件事、或者某个机构&#xff0c;而是忠诚于自己的良知&#xff0c;忠诚于自己的理想和…

1.1 常用文件管理命令

文章目录 前言正式学习文件系统常用的指令总结 前言 现在自己想做一个简单的编译器&#xff0c;但是安装环境就感觉非常难受&#xff0c;反正 linux 也是必须要学的&#xff0c;虽然&#xff0c;非常紧迫&#xff0c;但是很多事情着急也没有用&#xff0c;所以&#xff0c;现在…

ctfshow-web入门-文件上传(web151-web160)

目录 1、web151 2、web152 3、web153 4、web154 5、web155 6、web156 7、web157 8、web158 9、web159 10、web160 1、web151 试了下前端只能传 png 后缀的 将一句话木马改成 png 后缀&#xff0c;上传后用 burpsuite 抓包 绕过前端检测后&#xff0c;改回 php 后缀&am…

阶段三:项目开发---搭建项目前后端系统基础架构:任务11:搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 任务指导 1、讲框架的选择和原理 …

《梦醒蝶飞:释放Excel函数与公式的力量》9.4 NPV函数

9.4 NPV函数 NPV函数是Excel中用于计算净现值的函数。净现值&#xff08;Net Present Value, NPV&#xff09;是财务管理和投资决策中常用的指标&#xff0c;用于评估投资项目的价值。NPV表示的是未来一系列现金流的现值总和减去初始投资后的余额。 9.4.1 函数简介 NPV函数通…

微信小程序订单发货管理接入

订单发货管理接入指引&#xff1a;https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetannouncement&key11671435333v04b2&version1&langzh_CN&platform2https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetann…

32位Arm嵌入式开发Ubuntu环境设置

32位Arm嵌入式开发Ubuntu环境设置 今天在调试一块32位ARM A7开发板时老是不成功&#xff0c;我装的是Ubuntu22.04版&#xff0c;在终端下运行工具链里的gdb程序居然报了一大堆错误&#xff0c;缺这个缺那个&#xff0c;按照提示装了一遍&#xff0c;再运行发现需要Python2.7环境…

【机器学习】基于密度的聚类算法:DBSCAN详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 基于密度的聚类算法&#xff1a;DBSCAN详解引言DBSCAN的基本概念点的分类聚类过…

QThread moveToThread的妙用

官方文档描述 总结就是移动到线程的对象不能有父对象&#xff0c;执行start即起一个线程&#xff0c;示例是将myObject移动到主线程中。QT中这种方式起一个线程是非常简单的。 示例描述以及代码 描述往Communicate线程中频繁添加任务&#xff0c;等任务结束的时候统计计算的结…

001,函数指针是一种特殊的指针,它指向的是一个函数地址,可以存储函数并作为参数传递,也可以用于动态绑定和回调函数

函数指针是一种特殊的指针 001&#xff0c;函数指针是一种特殊的指针&#xff0c;它指向的是一个函数地址&#xff0c;可以存储函数并作为参数传递&#xff0c;也可以用于动态绑定和回调函数 文章目录 函数指针是一种特殊的指针前言总结 前言 这是ai回答的标准答案 下面我们…

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…

[LoaderRunner] 关于LoaderRunner的基本使用

LoadRunner环境搭建 LoadRunner运行的环境参考以下文档&#xff1a;Docs 介绍LoadRunner LoadRunner是什么 LoadRunner是性能测试工具&#xff0c;对软件或者系统的性能进行评估 为什么使用LoadRunner LoadRunner具有以下的优势&#xff1a; LoadRunner相比于其他的测试工具…

Python视觉轨迹几何惯性单元超维计算结构算法

&#x1f3af;要点 &#x1f3af;视觉轨迹几何惯性单元超维计算结构算法 | &#x1f3af;超维计算结构视觉场景理解 | &#x1f3af;超维计算结构算法解瑞文矩阵 | &#x1f3af;超维矢量计算递归神经算法 &#x1f36a;语言内容分比 &#x1f347;Python蒙特卡罗惯性导航 蒙…

“来来来,借一步说话”,让前端抓狂的可视化大屏界面。

可视化大屏的前端开发难度要远远高于普通前端&#xff0c;尤其是当设计师搞出一些花哨的效果&#xff0c;很容易让UI和前端陷入口水大战中。 可视化大屏的前端开发相比普通前端开发的难度要高&#xff0c;主要是因为以下几个方面&#xff1a; 1. 数据量大&#xff1a; 可视化…