小明:最近我在做一个研究生管理系统,里面需要处理学生的信息。你觉得应该怎么做呢?
小李:你这个系统是用什么语言写的?前端还是后端?
小明:我打算用Java,后端用Spring Boot,前端用Vue。不过对于学生信息管理这块,我还真不太清楚怎么下手。
小李:那我们先从数据库设计开始吧。学生信息通常包括学号、姓名、性别、出生日期、专业、导师等字段。
小明:对,这些都得有。那数据库应该怎么建表?
小李:可以用MySQL或者PostgreSQL。表名可以叫student,字段如下:
CREATE TABLE student (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') NOT NULL,
birth_date DATE NOT NULL,
major VARCHAR(100) NOT NULL,
advisor_id BIGINT,
FOREIGN KEY (advisor_id) REFERENCES teacher(id)
);
小明:这样设计挺合理的。那在Spring Boot中如何操作数据库呢?
小李:你可以使用Spring Data JPA来简化数据库操作。创建一个Student实体类,然后定义一个Repository接口。
小明:能给我看看代码吗?
小李:当然可以。首先,Student实体类如下:
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "student_id", unique = true, nullable = false)
private String studentId;
@Column(name = "name", nullable = false)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = "gender", nullable = false)
private Gender gender;
@Column(name = "birth_date", nullable = false)
private LocalDate birthDate;
@Column(name = "major", nullable = false)
private String major;
@ManyToOne
@JoinColumn(name = "advisor_id")
private Teacher advisor;
// getters and setters
}
小明:这个看起来不错。那数据访问层呢?
小李:你可以创建一个StudentRepository接口,继承JpaRepository:
public interface StudentRepository extends JpaRepository{ Optional findByStudentId(String studentId); }
小明:这样就可以通过学号查询学生了。那服务层怎么写?
小李:服务层主要负责业务逻辑,比如添加学生、更新信息、删除学生等。例如:
@Service
public class StudentService {
@Autowired
private StudentRepository studentRepository;
public Student createStudent(Student student) {
return studentRepository.save(student);
}
public List getAllStudents() {
return studentRepository.findAll();
}
public Student getStudentById(Long id) {
return studentRepository.findById(id).orElseThrow(() -> new RuntimeException("Student not found"));
}
public Student updateStudent(Long id, Student updatedStudent) {
Student existingStudent = studentRepository.findById(id).orElseThrow(() -> new RuntimeException("Student not found"));
existingStudent.setStudentId(updatedStudent.getStudentId());
existingStudent.setName(updatedStudent.getName());
existingStudent.setGender(updatedStudent.getGender());
existingStudent.setBirthDate(updatedStudent.getBirthDate());
existingStudent.setMajor(updatedStudent.getMajor());
existingStudent.setAdvisor(updatedStudent.getAdvisor());
return studentRepository.save(existingStudent);
}
public void deleteStudent(Long id) {
studentRepository.deleteById(id);
}
}
小明:这服务层确实很清晰。那前端怎么和后端交互呢?
小李:前端可以用Vue.js调用REST API。例如,添加学生的POST请求:
axios.post('/api/students', {
studentId: '2023001',
name: '张三',
gender: '男',
birthDate: '2000-01-01',
major: '计算机科学',
advisorId: 1
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
小明:明白了。那在后端,控制器应该怎么写呢?
小李:控制器负责接收HTTP请求,并调用服务层的方法。例如:
@RestController
@RequestMapping("/api/students")
public class StudentController {
@Autowired
private StudentService studentService;
@PostMapping
public ResponseEntity createStudent(@RequestBody Student student) {
Student createdStudent = studentService.createStudent(student);
return new ResponseEntity<>(createdStudent, HttpStatus.CREATED);
}
@GetMapping
public ResponseEntity> getAllStudents() {
List students = studentService.getAllStudents();
return ResponseEntity.ok(students);
}
@GetMapping("/{id}")
public ResponseEntity getStudentById(@PathVariable Long id) {
Student student = studentService.getStudentById(id);
return ResponseEntity.ok(student);
}
@PutMapping("/{id}")
public ResponseEntity updateStudent(@PathVariable Long id, @RequestBody Student student) {
Student updatedStudent = studentService.updateStudent(id, student);
return ResponseEntity.ok(updatedStudent);
}
@DeleteMapping("/{id}")
public ResponseEntity deleteStudent(@PathVariable Long id) {
studentService.deleteStudent(id);
return ResponseEntity.noContent().build();
}
}
小明:这样整个流程就完整了。那有没有可能扩展一下,比如支持分页查询?
小李:当然可以。Spring Data JPA本身就支持分页,只需要在Repository中定义方法并传入Pageable参数即可。
小明:听起来不错。那现在我是不是可以开始编写代码了?
小李:是的。你可以先搭建Spring Boot项目,配置好数据库连接,然后按照上面的结构逐步实现各个模块。
小明:谢谢你,我感觉思路清晰多了。

小李:不客气,有问题随时问我。祝你开发顺利!
