本项目将实现一个简单的学生信息管理系统,功能包括学生信息的录入、查询、修改和删除。通过本项目,读者将深入理解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的基本流程
-
加载数据库驱动 :通过
Class.forName()
方法加载数据库驱动。 -
建立连接 :使用
DriverManager.getConnection()
方法与数据库建立连接。 -
创建语句对象 :使用
Connection.createStatement()
或Connection.prepareStatement()
创建SQL语句对象。 -
执行SQL语句:通过语句对象执行SQL语句。
-
处理结果:对查询结果进行处理。
-
关闭连接:释放资源,关闭连接。
##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框架等更复杂的项目打下了良好的基础。
在实际应用中,数据库操作的性能和安全性至关重要,因此在开发中应考虑使用连接池、事务管理、数据验证等技术,以提高应用的健壮性和安全性。