【JAVA】Java项目实战—Java 数据库应用项目:学生信息管理系统

本项目将实现一个简单的学生信息管理系统,功能包括学生信息的录入、查询、修改和删除。通过本项目,读者将深入理解Java与数据库交互的基本原理,掌握JDBC(Java Database Connectivity)技术,以及如何构建一个简单的CRUD(创建、读取、更新、删除)应用。

1. 理论知识

1.1 Java与数据库的关系

Java通过JDBC与各种数据库进行交互。JDBC是Java提供的一个API,允许Java程序通过标准的方式连接到不同的数据库。通过JDBC,开发者可以执行SQL语句,获取结果集,并处理数据库中的数据。

1.2 数据库基本概念

  • 数据库(Database):一个有组织的数据集合,通常存储在计算机系统中。

  • 表(Table):数据库中的数据以表格的形式存储,每个表由行和列组成。

  • 记录(Record):表中的一行,表示一个具体的数据项。

  • 字段(Field):表中的一列,表示数据的某个属性。

1.3 JDBC的基本流程

  1. 加载数据库驱动:通过Class.forName()方法加载数据库驱动。

  2. 建立连接:使用DriverManager.getConnection()方法与数据库建立连接。

  3. 创建语句对象:使用Connection.createStatement()Connection.prepareStatement()创建SQL语句对象。

  4. 执行SQL语句:通过语句对象执行SQL语句。

  5. 处理结果:对查询结果进行处理。

  6. 关闭连接:释放资源,关闭连接。

##2. 项目结构

我们的学生信息管理系统将包括以下几个主要部分:

  • Student类:表示学生信息的模型。

  • StudentDAO类:数据访问对象,负责与数据库交互。

  • Main类:程序入口,提供用户界面,处理用户输入。

3. 具体实现

3.1 创建数据库和表

首先,我们需要在数据库中创建一个表来存储学生信息。以下是一个简单的SQL语句,用于创建students表:

CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),age INT,gender VARCHAR(10)
);

3.2 Student类

Student类用于表示学生的信息,包含学生的基本属性。

public class Student {private int id;private String name;private int age;private String gender;// 构造方法public Student(int id, String name, int age, String gender) {this.id = id;this.name = name;this.age = age;this.gender = gender;}// Getter和Setter方法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;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

3.3 StudentDAO类

StudentDAO类负责与数据库进行交互,包含CRUD操作的方法。

import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class StudentDAO {private Connection connection;// 构造方法,初始化数据库连接public StudentDAO() {try {// 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 建立连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "password");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}// 添加学生public void addStudent(Student student) {String sql = "INSERT INTO students (name, age, gender) VALUES (?, ?, ?)";try (PreparedStatement pstmt = connection.prepareStatement(sql)) {pstmt.setString(1, student.getName());pstmt.setInt(2, student.getAge());pstmt.setString(3, student.getGender());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 查询所有学生public List<Student> getAllStudents() {List<Student> students = new ArrayList<>();String sql = "SELECT * FROM students";try (Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {Student student = new Student(rs.getInt("id"), rs.getString("name"), rs.getInt("age"), rs.getString("gender"));students.add(student);}} catch (SQLException e) {e.printStackTrace();}return students;}// 更新学生信息public void updateStudent(Student student) {String sql = "UPDATE students SET name = ?, age = ?, gender = ? WHERE id = ?";try (PreparedStatement pstmt = connection.prepareStatement(sql)) {pstmt.setString(1, student.getName());pstmt.setInt(2, student.getAge());pstmt.setString(3, student.getGender());pstmt.setInt(4, student.getId());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 删除学生public void deleteStudent(int id) {String sql = "DELETE FROM students WHERE id = ?";try (PreparedStatement pstmt = connection.prepareStatement(sql)) {pstmt.setInt(1, id);pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 关闭连接public void close() {try {if (connection != null && !connection.isClosed()) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

3.4 Main类

Main类是程序的入口,提供简单的用户界面,允许用户进行操作。

import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {StudentDAO studentDAO = new StudentDAO();Scanner scanner = new Scanner(System.in);int choice;do {System.out.println("学生信息管理系统");System.out.println("1. 添加学生");System.out.println("2. 查询所有学生");System.out.println("3. 更新学生信息");System.out.println("4. 删除学生");System.out.println("5. 退出");System.out.print("请输入您的选择: ");choice = scanner.nextInt();scanner.nextLine(); // 消耗换行符switch (choice) {case 1:// 添加学生System.out.print("请输入学生姓名: ");String name = scanner.nextLine();System.out.print("请输入学生年龄: ");int age = scanner.nextInt();scanner.nextLine(); // 消耗换行符System.out.print("请输入学生性别: ");String gender = scanner.nextLine();Student student = new Student(0, name, age, gender);studentDAO.addStudent(student);System.out.println("学生添加成功!");break;case 2:// 查询所有学生List<Student> students = studentDAO.getAllStudents();System.out.println("所有学生信息:");for (Student s : students) {System.out.println(s);}break;case 3:// 更新学生信息System.out.print("请输入要更新的学生ID: ");int id = scanner.nextInt();scanner.nextLine(); // 消耗换行符System.out.print("请输入新的学生姓名: ");String newName = scanner.nextLine();System.out.print("请输入新的学生年龄: ");int newAge = scanner.nextInt();scanner.nextLine(); // 消耗换行符System.out.print("请输入新的学生性别: ");String newGender = scanner.nextLine();Student updatedStudent = new Student(id, newName, newAge, newGender);studentDAO.updateStudent(updatedStudent);System.out.println("学生信息更新成功!");break;case 4:// 删除学生System.out.print("请输入要删除的学生ID: ");int deleteId = scanner.nextInt();studentDAO.deleteStudent(deleteId);System.out.println("学生删除成功!");break;case 5:// 退出studentDAO.close();System.out.println("退出系统。");break;default:System.out.println("无效的选择,请重新输入。");}} while (choice != 5);scanner.close();}
}

4. 代码注释和解释

4.1 Student类

  • 属性id, name, age, gender分别表示学生的ID、姓名、年龄和性别。

  • 构造方法:用于初始化学生对象。

  • Getter和Setter:用于获取和设置学生的属性。

  • toString方法:重写了toString方法,方便打印学生信息。

4.2 StudentDAO类

  • 构造方法:加载数据库驱动并建立连接。

  • addStudent:使用PreparedStatement执行插入操作,防止SQL注入。

  • getAllStudents:查询所有学生,返回一个学生列表。

  • updateStudent:更新学生信息,使用PreparedStatement执行更新操作。

  • deleteStudent:根据ID删除学生。

  • close:关闭数据库连接,释放资源。

4.3 Main类

  • 用户界面:通过控制台输入,提供简单的菜单选项。

  • 选择操作:根据用户的选择调用相应的DAO方法,执行CRUD操作。

5. 总结

通过本项目的实现,读者不仅掌握了Java与数据库交互的基本知识,还了解了如何构建一个简单的CRUD应用。这个学生信息管理系统是一个基础的项目,但它为进一步学习Java EE、Spring框架等更复杂的项目打下了良好的基础。

在实际应用中,数据库操作的性能和安全性至关重要,因此在开发中应考虑使用连接池、事务管理、数据验证等技术,以提高应用的健壮性和安全性。

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

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

相关文章

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

Android UI:ViewTree:源码分析:事件处理:显示事件

文章目录 概述测量:measure和onMeasure​​​​​​​ View.MeasureSpecViewViewGroupLinearLayoutRelativeLayout布局:layout和onLayout ViewViewGroupLinearLayoutRelativeLayout绘制:dispatchDraw、draw和onDraw ViewViewGroupLinearLayoutRelativeLayout总结概述 显示事…

Angular由一个bug说起之十二:网页页面持续占用CPU过高

随着网络日益发达&#xff0c;网页的内容也更加丰富&#xff0c;形式也更加多样化。而随之而来的性能问题也不容小觑。这篇文章我会根据我在实践中遇到的一个问题来总结&#xff0c;我在面对性能问题的一些解决步骤&#xff0c;希望能对大家有所启发。 查找问题原因 我接触的…

游戏引擎学习第44天

仓库: https://gitee.com/mrxiao_com/2d_game 向量数学的重要性 矢量数学非常重要&#xff0c;因为 它在某种程度上类似于将C和C视为高于汇编语言的语言&#xff0c;从而使得我们能够以略高的层次思考问题&#xff0c;同时保留大部分性能好处和直接访问的类型。这种思维方式就…

Android中bindService和startService启动服务有何区别

Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式&#xff0c;它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比&#xff1a; 1. bindService方式 bindService 是一种绑定方式&am…

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif &#xff0c;/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…

【NLP高频面题 - 词嵌入篇】为什么说Word2vec的词向量是静态的?

【NLP高频面题 - 词嵌入篇】为什么说Word2vec的词向量是静态的&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&#xf…

PyTorch基本使用-张量的基本运算及函数计算

文章目录 1. 张量数值计算1. 1 张量基本运算1.2 点乘运算1.3 矩阵运算 2. 张量运算函数 1. 张量数值计算 1. 1 张量基本运算 加减乘除取负号&#xff1a; add、sub、mul、div、neg add_ 、sub_、 mul_ 、div_、 neg_ (其中带下划线的版本会修改原数据) data torch.randin…

如何使用 Python 实现 UDP 通信?

1. UDP通信基础 UDP&#xff08;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种不可靠的数据传输服务&#xff0c;但具有较低的延迟和较小的开销。在Python中&#xff0c;可以使用socket模块来实现UDP通信。 2. 实现UDP服务端 import socketd…

【保姆级】Mac如何安装+切换Java环境

本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…

Android -- WebView之loadData加载html字符串显示网页

目录 前言1. loadUrl 加载网页地址2. loadData 加载Html字符来显示网页3. loadDataWithBaseURL4. 总结 前言 最近在给一个老项目做64位so文件的适配&#xff0c;当应用发布到应用市场上后&#xff0c;用户反馈64位手机上的网页加载不出内容&#xff0c;但32位的手机上是正常…

WebSocket解读

WebSocket是一种网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信&#xff0c;即服务器和客户端可以同时发送和接收数据。这种协议非常适合需要实时数据交换的应用场景&#xff0c;如在线聊天、实时数据更新、协同办公等。 WebSocket的工作原理 握手阶段&#x…

Docker在Ubuntu和CentOS系统下的安装

目录 1. 各版本平台支持情况2. 在Ubuntu系统下安装docker3. 常见报错4. Docker的镜像源修改5. Docker目录修改6. 在CentOS系统下安装docker 1. 各版本平台支持情况 &#xff08;1&#xff09;平台支持情况如下&#xff1a; Server 版本 桌面版本 2. 在Ubuntu系统下安装docker…

Ansible-Playbook基础学习

一.Ansible Playbook基本介绍 1.Playbook 介绍 Ansible Playbook 是 Ansible 的核心组件之一&#xff0c;它是一个用于配置管理、应用部署和任务自动化的文本文件&#xff0c;使用 YML格式编写。YML 的语法简洁明了&#xff0c;易于阅读和编写&#xff0c;使得用户可以方便地…

基于PHP课堂签到系统的设计与实现

摘 要 随着教育业的迅速发展和学生人数的不断增加&#xff0c;导致在班级登记制度中传统的“点到”方式不能适应学校的实际需要。从而需要设计一个好的课堂签到系统将会对课堂签到管理工作带来事半功倍的效果。文章着重介绍了基于实践应用的班级签到系统的开发流程&#xff0c…

MTK android12 user版本默认开启root权限,添加su

1、需求 &#xff1a; 客户要求在user版中默认开启root权限&#xff0c;添加su。2、实现&#xff1a; From cc066de135c93975d4a50b71c63447c50065195b Mon Sep 17 00:00:00 2001 From: ***** Date: Wed, 11 Dec 2024 16:33:36 0800 Subject: [PATCH] ?UTF-8?q?[root]user…

openjdk17 jvm加载class文件,解析字段和方法,C++源码展示

##构造方法ClassFileParser&#xff0c;parse_stream解析文件流 ClassFileParser::ClassFileParser(ClassFileStream* stream,Symbol* name,ClassLoaderData* loader_data,const ClassLoadInfo* cl_info,Publicity pub_level,TRAPS) :_stream(stream),_class_name(NULL),_load…

蓝桥杯我来了

最近蓝桥杯报名快要截止了&#xff0c;我们学校开始收费了&#xff0c;我们学校没有校赛&#xff0c;一旦报名缴费就是省赛&#xff0c;虽然一早就在官网上报名了&#xff0c;但是一直在纠结&#xff0c;和家人沟通&#xff0c;和朋友交流&#xff0c;其实只是想寻求外界的支持…

Nginx 缓存那些事儿:原理、配置和最佳实践

Nginx 缓存那些事儿&#xff1a;原理、配置和最佳实践 在当今的互联网世界&#xff0c;网站的访问量和数据处理量不断攀升&#xff0c;如何确保用户能够快速、稳定地访问我们的网站&#xff0c;已经成为每个运维工程师面临的挑战。幸运的是&#xff0c;Nginx 作为一款高性能的…

【智体OS】官方上新发布智体电视:基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视

【智体OS】官方上新发布智体电视&#xff1a;基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;…