【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;
    }

    @Override
    public 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框架等更复杂的项目打下了良好的基础。

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

相关推荐
一只小bit27 分钟前
C++之初识模版
开发语言·c++
P7进阶路1 小时前
Tomcat异常日志中文乱码怎么解决
java·tomcat·firefox
王磊鑫1 小时前
C语言小项目——通讯录
c语言·开发语言
钢铁男儿1 小时前
C# 委托和事件(事件)
开发语言·c#
Ai 编码助手1 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花1 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
喜-喜1 小时前
C# HTTP/HTTPS 请求测试小工具
开发语言·http·c#
ℳ₯㎕ddzོꦿ࿐1 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb1 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天2 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python