ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Java+MySQL学生信息管理系统实战:从建库到部署的完整CRUD指南

2026/10/8 11:33:41 拓冰建站 浏览量
Java+MySQL学生信息管理系统实战:从建库到部署的完整CRUD指南 简介本资源为基于JavaMySQL实现的学生信息管理系统课程设计项目面向计算机相关专业学生及Java Web初学者可用于课程设计、毕业设计参考或Servlet技术练手。项目在IntelliJ IDEA 2020.3.3下开发采用JavaBean、Servlet、DAO分层架构通过Servlet处理请求并配置过滤器控制权限数据持久化使用MySQL。功能覆盖学生、教师、管理员三类角色学生可查询成绩、课程平均分、班级开课与教学计划教师可录入与查询成绩、查看任课情况管理员负责学生、教师、课程、成绩、学院、专业及班级信息管理。压缩包共551个文件约17.88MB包含129个png界面截图、112个js脚本、52个html与44个css页面样式、36个jsp视图、32个java源码及28个xml配置等另附jar依赖与说明文档目录结构完整。目前已有568人学习下载适合需要完整分层架构范例与数据库设计思路的读者参考。1. 学生信息管理系统为什么 JavaMySQL 这套组合至今仍是 Web 项目实战的首选如果你正在找一个能写进简历、能跑通增删改查、能讲清楚前后端数据流转的 Web 项目学生信息管理系统几乎是绕不开的选题。它不花哨但覆盖了 Java Web 开发最核心的链路浏览器发请求、后端接收参数、业务层处理逻辑、持久层读写 MySQL、再把结果渲染回页面。把这套流程走通一遍比看十篇 Java 基础教程都管用。我见过太多人卡在“环境配好了但项目跑不起来”这一步。Java 环境配置、MySQL 安装、Tomcat 部署、JDBC 连接任何一个环节出问题都会让整个项目变成黑匣子。这篇笔记就按实际落地的顺序把基于 JavaMySQL 实现学生信息管理系统的完整路径拆开先讲清楚技术选型的理由再给出可复现的建库建表语句和核心代码最后把那些让人翻车的坑一个个标出来。适合正在做课程设计的学生也适合想用这个项目练手 Java Web 的初级工程师。2. 技术选型与开发环境搭建从 JDK 到 MySQL 的完整链路2.1 为什么是 JavaMySQL 而不是其他组合学生信息管理系统的本质是“表单列表数据库”的典型 CRUD 应用。选 Java 做后端核心原因是生态成熟Servlet、JSP、Spring Boot、MyBatis 这些技术栈的文档和社区答案足够多遇到问题能搜到解决方案。MySQL 作为关系型数据库建表、索引、事务这些概念在学生信息管理场景里都能用上而且安装配置教程遍地都是mysql安装教程8.0 这类关键词一搜就有详细步骤。另一个现实考量是招聘市场。java工程师 岗位的需求量一直稳定面试里问的 java基础、面向对象编程java、mysql锁的分类 这些知识点都能在这个项目里找到落地的影子。你把这个项目吃透面试时聊 JDBC 连接池、聊事务边界、聊索引优化都有具体场景可以展开比空谈理论有说服力。技术栈建议用 Spring Boot MyBatis-Plus MySQL 8.0 Thymeleaf 或 Vue。Spring Boot 省去了 Tomcat 配置和 web.xml 的繁琐MyBatis-Plus 能根据 java实体类生成创建表的 sql语句减少手写 SQL 的工作量。前端用 Thymeleaf 做服务端渲染最快想练前后端分离就用 VueAxios。2.2 开发环境搭建的四个关键步骤第一步安装 JDK。建议 JDK 17 或 JDK 8这两个版本在企业里用得最多。安装后配置 JAVA_HOME 和 PATH命令行执行java -version能输出版本号就算成功。java启动失败怎么解决 这类问题多半是环境变量没配对或者多个 JDK 版本冲突。第二步安装 MySQL。Windows 上推荐用 MySQL Installer 安装选 MySQL Server 8.0 版本。安装过程中会要求设置 root 密码这个密码记牢后面配置数据源要用。安装完成后用mysql -u root -p测试连接。mysql在windows10上怎么安装 的详细过程网上很多核心就是选对安装类型、配好端口和密码。第三步创建数据库和表。用 Navicat 或者命令行都行下面给出建库建表的 SQL。-- 创建数据库字符集用 utf8mb4 支持中文和特殊符号 CREATE DATABASE student_manage DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE student_manage; -- 学生信息表 CREATE TABLE student ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键ID, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, gender TINYINT DEFAULT 1 COMMENT 性别 1男 2女, age INT COMMENT 年龄, class_name VARCHAR(50) COMMENT 班级, major VARCHAR(100) COMMENT 专业, phone VARCHAR(20) COMMENT 联系电话, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生信息表; -- 用户表用于登录 CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名, password VARCHAR(100) NOT NULL COMMENT 密码, role VARCHAR(20) DEFAULT admin COMMENT 角色 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系统用户表; -- 插入默认管理员账号密码是 123456 的 MD5 值 INSERT INTO sys_user (username, password, role) VALUES (admin, e10adc3949ba59abbe56e057f20f883e, admin);建表时注意几个参数utf8mb4字符集必须指定否则中文姓名可能乱码student_no加唯一索引防止学号重复录入create_time和update_time用数据库自动维护减少业务代码的负担。第四步初始化 Spring Boot 项目。用 IDEA 的 Spring Initializr 创建项目勾选 Spring Web、MyBatis-Plus、MySQL Driver、Lombok。然后在application.yml里配置数据源。spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/student_manage?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 thymeleaf: cache: false mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: autoserverTimezone必须设成Asia/Shanghai否则插入时间会差 8 小时。map-underscore-to-camel-case开启后数据库的student_no会自动映射到 Java 的studentNo省去手写 ResultMap。3. 核心功能实现学生信息的增删改查与分页3.1 实体类与 Mapper 层的写法实体类用 Lombok 的Data注解自动生成 getter/setter字段名和数据库列名按驼峰对应。Data TableName(student) public class Student { TableId(type IdType.AUTO) private Long id; private String studentNo; private String name; private Integer gender; private Integer age; private String className; private String major; private String phone; private LocalDateTime createTime; private LocalDateTime updateTime; }Mapper 接口继承 MyBatis-Plus 的BaseMapper基础的增删改查方法直接就有了不需要写 XML。Mapper public interface StudentMapper extends BaseMapperStudent { // 自定义分页查询按姓名或学号模糊搜索 IPageStudent selectStudentPage(PageStudent page, Param(keyword) String keyword); }对应的 XML 写一个模糊查询即可。select idselectStudentPage resultTypecom.example.entity.Student SELECT * FROM student where if testkeyword ! null and keyword ! AND (name LIKE CONCAT(%, #{keyword}, %) OR student_no LIKE CONCAT(%, #{keyword}, %)) /if /where ORDER BY create_time DESC /select这里用where标签自动处理 AND 前缀避免WHERE AND的语法错误。模糊查询用CONCAT拼接不要用${}直接拼字符串否则会有 SQL 注入风险。3.2 Service 层的事务控制与分页逻辑Service 层负责业务逻辑组装和事务边界。新增和修改操作加Transactional注解保证数据一致性。Service public class StudentServiceImpl implements StudentService { Autowired private StudentMapper studentMapper; Override Transactional(rollbackFor Exception.class) public boolean addStudent(Student student) { // 检查学号是否重复 Long count studentMapper.selectCount( new LambdaQueryWrapperStudent().eq(Student::getStudentNo, student.getStudentNo()) ); if (count 0) { throw new RuntimeException(学号已存在); } return studentMapper.insert(student) 0; } Override public IPageStudent getStudentPage(int pageNum, int pageSize, String keyword) { PageStudent page new Page(pageNum, pageSize); return studentMapper.selectStudentPage(page, keyword); } Override Transactional(rollbackFor Exception.class) public boolean deleteStudent(Long id) { return studentMapper.deleteById(id) 0; } }Transactional的rollbackFor设成Exception.class这样受检异常也会触发回滚。分页用 MyBatis-Plus 的Page对象传入页码和每页条数底层会自动拼LIMIT语句。mysql排序 在分页里很关键ORDER BY create_time DESC保证最新录入的学生排在前面。3.3 Controller 层与页面数据绑定Controller 接收前端请求调用 Service 后把数据塞进 Model返回视图。Controller RequestMapping(/student) public class StudentController { Autowired private StudentService studentService; GetMapping(/list) public String list(RequestParam(defaultValue 1) int pageNum, RequestParam(defaultValue 10) int pageSize, RequestParam(required false) String keyword, Model model) { IPageStudent page studentService.getStudentPage(pageNum, pageSize, keyword); model.addAttribute(page, page); model.addAttribute(keyword, keyword); return student/list; } PostMapping(/add) ResponseBody public Result add(RequestBody Student student) { try { studentService.addStudent(student); return Result.success(添加成功); } catch (Exception e) { return Result.error(e.getMessage()); } } DeleteMapping(/delete/{id}) ResponseBody public Result delete(PathVariable Long id) { studentService.deleteStudent(id); return Result.success(删除成功); } }RequestBody接收 JSON 格式的请求体前端用 Axios 发 POST 请求时Content-Type要设成application/json。PathVariable从 URL 路径里取参数删除接口用 RESTful 风格更清晰。4. 避坑与排查学生信息管理系统落地时最容易翻车的五个地方4.1 中文乱码从数据库到页面的全链路排查现象学生姓名在页面上显示成问号或者乱码。原因字符集不统一。数据库建库时没指定utf8mb4或者 JDBC URL 里没加characterEncodingutf8或者 Tomcat 的默认编码不是 UTF-8。解决三步统一字符集。第一建库建表用utf8mb4第二JDBC URL 加useUnicodetruecharacterEncodingutf8第三Spring Boot 的application.yml里加server.servlet.encoding.charsetutf-8和forcetrue。如果是老项目用 JSP页面头部加% page contentTypetext/html;charsetUTF-8 %。4.2 学号重复插入导致主键冲突现象添加学生时报Duplicate entry 2024001 for key student_no。原因学号字段加了唯一索引但业务代码没做重复校验或者并发情况下两个请求同时通过了校验。解决Service 层先selectCount查一遍有记录就抛异常。更稳妥的做法是用数据库的唯一约束兜底捕获DuplicateKeyException后返回友好提示。高并发场景可以用分布式锁或者INSERT ... ON DUPLICATE KEY UPDATE但学生管理系统一般用不上。4.3 分页查询总数不对现象页面显示总共 100 条但翻到第 3 页就没数据了。原因MyBatis-Plus 的分页插件没配置导致LIMIT语句没生效或者Page对象的searchCount被设成了 false。解决在配置类里注册MybatisPlusInterceptor和PaginationInnerInterceptor。Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }DbType.MYSQL指定数据库类型分页插件会根据类型生成对应的LIMIT语法。忘了配这个分页就是假的。4.4 时间字段差 8 小时现象新增学生后create_time显示的时间比实际时间早 8 小时。原因JDBC 连接的时区没设对MySQL 默认用 UTC 时间。解决JDBC URL 里加serverTimezoneAsia/Shanghai。如果用的是 MySQL 8.0 的驱动驱动类名要写com.mysql.cj.jdbc.Driver旧版的com.mysql.jdbc.Driver会报错。4.5 删除后主键不连续现象删了 id 为 3 的学生再新增一个id 变成 4 而不是 3。原因MySQL 的AUTO_INCREMENT计数器不会因为删除而回退这是正常行为。解决不需要解决。主键只保证唯一不保证连续。如果业务上非要连续编号那应该用学号字段而不是主键 id。别在这上面浪费时间。5. 进阶技巧用 MyBatis-Plus 代码生成器减少重复劳动5.1 代码生成器的配置与使用手写实体类、Mapper、Service、Controller 是体力活。MyBatis-Plus 的代码生成器能根据数据库表自动生成这四层代码省下大量时间。下面是一个可复用的配置。public class CodeGenerator { public static void main(String[] args) { FastAutoGenerator.create( jdbc:mysql://localhost:3306/student_manage?serverTimezoneAsia/Shanghai, root, 你的密码) .globalConfig(builder - { builder.author(yourname) .outputDir(System.getProperty(user.dir) /src/main/java) .disableOpenDir(); }) .packageConfig(builder - { builder.parent(com.example) .entity(entity) .mapper(mapper) .service(service) .controller(controller); }) .strategyConfig(builder - { builder.addInclude(student, sys_user) .entityBuilder() .enableLombok() .logicDeleteColumnName(deleted) .controllerBuilder() .enableRestStyle(); }) .execute(); } }addInclude指定要生成的表名enableLombok让实体类用Data注解enableRestStyle生成RestController风格的控制器。生成后的代码直接能用只需要在业务逻辑上做调整。5.2 逻辑删除与物理删除的选择学生信息属于业务数据建议用逻辑删除而不是物理删除。在表里加一个deleted字段默认 0删除时更新为 1。MyBatis-Plus 的TableLogic注解能自动处理查询过滤。TableLogic private Integer deleted;配置后deleteById会自动变成UPDATE student SET deleted1 WHERE id?查询时自动加WHERE deleted0。这样数据可恢复也避免了外键关联断裂的问题。物理删除只在数据确实不需要保留时用比如日志表。5.3 接口测试与数据验证写完接口别急着写前端先用 Postman 或者 curl 把每个接口跑一遍。重点验证新增时学号重复是否返回错误提示、分页参数边界pageNum0 或 pageSize1000是否处理、删除不存在的 id 是否报错。这些边界情况在答辩或者代码审查时经常被问到。# 测试新增接口 curl -X POST http://localhost:8080/student/add \ -H Content-Type: application/json \ -d {studentNo:2024001,name:张三,gender:1,age:20,className:计算机1班,major:计算机科学与技术} # 测试分页查询 curl http://localhost:8080/student/list?pageNum1pageSize5keyword张接口调通后再写前端页面能避免前后端联调时互相甩锅。我一般会先把所有接口用 Postman 跑一遍确认返回结构符合预期再动手写页面。这个习惯帮我省了很多后悔药。5.4 项目部署前的检查清单部署到服务器之前把这几项过一遍数据库连接池的maximum-pool-size设成 10 到 20 之间别用默认值日志级别从 DEBUG 改成 INFO减少磁盘写入静态资源加缓存头减少重复请求application.yml里的数据库密码用环境变量注入别硬编码在配置文件里。学生信息管理系统这个项目技术栈不复杂但能把 Java Web 的完整链路走通。从建库建表到接口测试从分页查询到逻辑删除每个环节都有具体的参数和坑。把这套流程跑一遍再遇到类似的 CRUD 项目基本就是换个表名和字段的事。希望帮到你。本文还有配套的精品资源点击获取