小明:嘿,李老师,最近我在研究一个研究生管理系统,听说这个系统挺复杂的,您能给我讲讲它的源码结构吗?
李老师:当然可以。研究生管理系统通常是一个基于Web的多层架构应用,前端使用HTML、CSS和JavaScript,后端可能用Java或Python,数据库一般是MySQL或PostgreSQL。你对哪部分特别感兴趣?
小明:我对后端代码比较好奇,特别是Java相关的。您能给我举个例子吗?比如学生信息管理模块的源码是怎么写的?
李老师:好的,我们以学生信息管理为例。首先,我们需要一个实体类来表示学生信息。在Java中,这通常是一个POJO(Plain Old Java Object)类,包含基本属性如学号、姓名、性别、专业等。
public class Student {
private String studentId;
private String name;
private String gender;
private String major;
// 构造函数
public Student() {}
public Student(String studentId, String name, String gender, String major) {
this.studentId = studentId;
this.name = name;
this.gender = gender;
this.major = major;
}
// Getter 和 Setter 方法
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
小明:哇,原来如此!那这些数据是如何存储到数据库里的呢?是不是需要一个DAO层?
李老师:没错,DAO(Data Access Object)层负责与数据库交互。我们可以使用JDBC或者更高级的框架如Hibernate或MyBatis来简化数据库操作。
public interface StudentDao {
void addStudent(Student student);
Student getStudentById(String id);
List
void updateStudent(Student student);
void deleteStudent(String id);
}
public class StudentDaoImpl implements StudentDao {
private Connection connection;
public StudentDaoImpl(Connection connection) {
this.connection = connection;
}
@Override
public void addStudent(Student student) {
String sql = "INSERT INTO students (student_id, name, gender, major) VALUES (?, ?, ?, ?)";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, student.getStudentId());
stmt.setString(2, student.getName());
stmt.setString(3, student.getGender());
stmt.setString(4, student.getMajor());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public Student getStudentById(String id) {
String sql = "SELECT * FROM students WHERE student_id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
Student student = new Student();
student.setStudentId(rs.getString("student_id"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setMajor(rs.getString("major"));
return student;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List
List
String sql = "SELECT * FROM students";
try (Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
Student student = new Student();
student.setStudentId(rs.getString("student_id"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setMajor(rs.getString("major"));
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
@Override
public void updateStudent(Student student) {
String sql = "UPDATE students SET name = ?, gender = ?, major = ? WHERE student_id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, student.getName());
stmt.setString(2, student.getGender());
stmt.setString(3, student.getMajor());
stmt.setString(4, student.getStudentId());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void deleteStudent(String id) {
String sql = "DELETE FROM students WHERE student_id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, id);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
小明:看来DAO层是连接数据库的关键部分。那业务逻辑层又是怎么处理的呢?
李老师:业务逻辑层通常由Service类来实现,它调用DAO方法完成具体的业务操作。例如,添加学生时,可能会先检查学号是否重复,再执行插入操作。
public class StudentService {
private StudentDao studentDao;
public StudentService(StudentDao studentDao) {
this.studentDao = studentDao;
}
public void addStudent(Student student) {
if (studentDao.getStudentById(student.getStudentId()) != null) {
throw new IllegalArgumentException("学号已存在");
}
studentDao.addStudent(student);
}
public Student getStudentById(String id) {
return studentDao.getStudentById(id);
}
public List
return studentDao.getAllStudents();
}
public void updateStudent(Student student) {
studentDao.updateStudent(student);
}
public void deleteStudent(String id) {
studentDao.deleteStudent(id);
}
}
小明:明白了!那前端是怎么和后端进行交互的呢?是不是用Servlet或者Spring MVC?
李老师:没错,通常我们会使用Spring MVC框架来构建Web应用。前端通过HTTP请求调用Controller,Controller调用Service,Service再调用DAO,最后返回结果给前端。
@Controller
@RequestMapping("/students")
public class StudentController {
private StudentService studentService;
public StudentController(StudentService studentService) {
this.studentService = studentService;
}
@GetMapping("/")
public String listStudents(Model model) {
model.addAttribute("students", studentService.getAllStudents());
return "student/list";
}
@GetMapping("/add")
public String showAddForm(Model model) {
model.addAttribute("student", new Student());
return "student/add";
}
@PostMapping("/add")
public String addStudent(@ModelAttribute("student") Student student) {
studentService.addStudent(student);
return "redirect:/students/";
}
@GetMapping("/edit/{id}")
public String showEditForm(@PathVariable("id") String id, Model model) {
Student student = studentService.getStudentById(id);
model.addAttribute("student", student);
return "student/edit";
}
@PostMapping("/edit/{id}")
public String updateStudent(@PathVariable("id") String id, @ModelAttribute("student") Student student) {
student.setStudentId(id);
studentService.updateStudent(student);
return "redirect:/students/";
}
@GetMapping("/delete/{id}")
public String deleteStudent(@PathVariable("id") String id) {

studentService.deleteStudent(id);
return "redirect:/students/";
}
}
小明:这个Controller看起来很规范!那数据库的设计又是什么样的呢?
李老师:数据库表设计是整个系统的基础。以学生表为例,通常会有学号、姓名、性别、专业、入学日期等字段。
CREATE TABLE students (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(100),
gender VARCHAR(10),
major VARCHAR(100),
enrollment_date DATE
);
小明:这样设计确实很清晰。那如果我要扩展功能,比如添加课程管理模块,应该怎么处理呢?
李老师:扩展功能通常需要新增实体类、DAO接口、Service类以及Controller,并修改数据库结构。比如,课程表可能包括课程编号、名称、学分、教师等信息。
CREATE TABLE courses (
course_id VARCHAR(20) PRIMARY KEY,
course_name VARCHAR(100),
credit INT,
teacher VARCHAR(100)
);
小明:明白了!看来这个系统的可扩展性还是很强的。
李老师:没错,良好的架构设计和模块化编程让系统更容易维护和升级。如果你有兴趣,还可以学习Spring Boot、Spring Security等更高级的技术。
小明:谢谢您,李老师!今天收获很大,我回去好好研究一下这些代码。
李老师:不客气,有问题随时问我。祝你学习顺利!
