SpringBoot 学生管理系统实战
搭建一个基础的学生管理系统,重点在于 SpringBoot 的配置以及 Controller 层如何结合原生 JDBC 进行数据交互。虽然现代开发更倾向于使用 MyBatis 或 JPA,但理解底层连接管理依然很有必要。
项目结构概览
系统主要包含前端界面展示、后端接口处理以及文件上传功能。以下是关键界面的示意:





基础配置
在 application.properties 中,我们需要指定服务端口、上下文路径以及数据库连接信息。注意这里直接使用了 MySQL 驱动类名,实际项目中建议根据版本调整。
server.port=8090
server.servlet.context-path=/student
spring.datasource.url=jdbc:mysql://localhost:3306/stutest?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.jdbc.Driver
upload.file.path=d:/upload
Controller 层实现
Controller 负责接收请求并返回 JSON 数据。在这个示例中,我们直接在 Service 层之外通过 DBUtil 获取连接,手动编写 SQL。这种方式适合快速原型,但在生产环境中建议封装为 Repository 或 Mapper。
package com.cskfz.student.controller;
import com.cskfz.student.entity.Student;
import com.cskfz.student.pojo.ActionResult;
import com.cskfz.student.utils.DBUtil;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.beans.factory.annotation.Value;
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.*;
org.springframework.web.multipart.MultipartFile;
javax.servlet.http.HttpServletRequest;
java.io.File;
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
java.util.*;
{
DBUtil dbUtil;
String savePath;
ActionResult {
;
;
;
List<Student> list = <>();
;
{
Integer.parseInt(map.get());
Integer.parseInt(map.get());
(page - ) * rows;
conn = dbUtil.getConnection();
stmt = conn.prepareStatement();
rs = stmt.executeQuery();
rs.next();
Map<String, Object> data = <>();
data.put(, rs.getInt());
stmt = conn.prepareStatement();
stmt.setInt(, begin);
stmt.setInt(, rows);
rs = stmt.executeQuery();
(rs.next()) {
list.add( (
rs.getInt(),
rs.getString(),
.equals(rs.getString()),
rs.getDate(),
rs.getString()
));
}
data.put(, list);
result = ActionResult.ok(data);
} (Exception e) {
e.printStackTrace();
} {
closeResource(conn, stmt, rs);
}
result;
}
ActionResult {
;
;
;
;
{
conn = dbUtil.getConnection();
stmt = conn.prepareStatement();
stmt.setInt(, sid);
rs = stmt.executeQuery();
(rs.next()) {
result = ActionResult.ok( (
rs.getInt(),
rs.getString(),
.equals(rs.getString()),
rs.getDate(),
rs.getString()
));
}
} (Exception e) {
e.printStackTrace();
} {
closeResource(conn, stmt, rs);
}
result;
}
ActionResult {
;
;
;
req.getParameter();
req.getParameter();
req.getParameter();
.equals(genderStr) ? : ;
req.getParameter();
req.getParameter();
{
conn = dbUtil.getConnection();
(sno == || sno.equals()) {
stmt = conn.prepareStatement();
stmt.setString(, sname);
stmt.setString(, gender);
stmt.setString(, birth);
stmt.setString(, filePath);
} {
stmt = conn.prepareStatement();
stmt.setString(, sname);
stmt.setString(, gender);
stmt.setString(, birth);
stmt.setString(, filePath);
stmt.setInt(, Integer.parseInt(sno));
}
stmt.executeUpdate();
result = ActionResult.ok();
} (Exception e) {
e.printStackTrace();
} {
closeResource(conn, stmt, );
}
result;
}
ActionResult {
;
;
;
{
conn = dbUtil.getConnection();
stmt = conn.prepareStatement();
stmt.setInt(, sid);
stmt.executeUpdate();
result = ActionResult.ok();
} (Exception e) {
e.printStackTrace();
} {
closeResource(conn, stmt, );
}
result;
}
ActionResult {
;
{
(!file.isEmpty()) {
file.getOriginalFilename();
filename.substring(filename.lastIndexOf());
UUID.randomUUID().toString().replace(, );
uuid + extName;
(savePath + + newName);
dest.getParentFile().mkdirs();
file.transferTo(dest);
result = ActionResult.ok( + newName);
}
} (Exception e) {
e.printStackTrace();
}
result;
}
{
(rs != ) {
{ rs.close(); } (SQLException e) { e.printStackTrace(); }
}
(stmt != ) {
{ stmt.close(); } (SQLException e) { e.printStackTrace(); }
}
(conn != ) {
{ conn.close(); } (SQLException e) { e.printStackTrace(); }
}
}
}

