完整的登陸學生管理系統(配置數據庫)

目錄

要求

思路

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
英文地址,請注明出處:http://en.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;并且之前每…