2026/6/10 10:28:59
网站建设
项目流程
怎么查网站做站点地图,承接各类网站建设,云虚拟主机怎么做2个网站,永顺县建设局网站开篇#xff1a;本文能帮你解决什么问题#xff1f;
作为计算机应用技术专业的学生#xff0c;Spring Boot 课程的核心是 “学用结合”—— 但很多初学者会陷入 “懂知识点却做不出项目” 的困境#xff1a;配置文件不会写、数据库整合报错、接口调试无头绪。
本文面向 S…开篇本文能帮你解决什么问题作为计算机应用技术专业的学生Spring Boot 课程的核心是 “学用结合”—— 但很多初学者会陷入 “懂知识点却做不出项目” 的困境配置文件不会写、数据库整合报错、接口调试无头绪。本文面向Spring Boot 入门者 / 课程学习者以 “图书管理系统” 为实战载体从环境搭建到完整项目落地拆解 “自动配置、配置文件、Web 开发、数据访问” 等课程核心知识点提供 “理论 代码 排错” 全流程指南。跟着做你能收获一套可运行的图书管理系统支持图书增删改查、分页查询掌握 Spring Boot 核心功能的实际应用场景解决 “配置繁琐、依赖冲突、数据库连接失败” 等高频问题理解 “分层架构” 在实际项目中的设计思路。适合用于课程作业参考、Spring Boot 实战练习新手也能零门槛上手一、先搞懂为什么用 Spring Boot 做图书管理系统在动手前我们先明确核心逻辑图书管理系统需要 “快速开发、简单配置、稳定运行”而 Spring Boot 的三大核心特性恰好匹配需求自动配置无需手动编写 XML引入依赖后自动配置 Tomcat、数据源等减少 80% 冗余配置起步依赖通过spring-boot-starter-web、mybatis-spring-boot-starter等整合所需技术栈避免依赖冲突嵌入式容器项目打包后可直接运行无需额外部署 Tomcat方便测试和交付。简单说用 Spring Boot 开发图书管理系统能让我们聚焦 “业务逻辑”而非 “环境配置”—— 这也是企业开发的核心思路。二、环境搭建零报错起步附排错技巧1. 前置环境要求JDK8 或 11推荐 8兼容性更好构建工具Maven 3.6开发工具IDEA 2020数据库MySQL 8.0测试工具Postman接口调试。2. 两种搭建方式选一种即可方式 1Spring Initializr 快速搭建推荐打开 IDEA → New Project → 选择 “Spring Initializr”配置项目信息Group如 com.study、Artifactbook-manage、Java Version 选 8勾选依赖WebSpring Web、MyBatis Framework、MySQL Driver、Lombok简化代码点击 FinishIDEA 自动下载依赖并生成项目结构。方式 2手动创建 Maven 项目理解底层新建 Maven 项目在pom.xml中添加父依赖和起步依赖xml!-- 父依赖统一管理版本 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.15/version !-- 适配JDK8的稳定版本 -- relativePath/ /parent !-- 起步依赖 -- dependencies !-- Web开发依赖内置Tomcat、Spring MVC -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis整合依赖 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.1/version /dependency !-- MySQL驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- Lombok简化get/set/构造方法 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies在src/main/java/com/study/bookmanage下创建启动类BookManageApplication.javajava运行package com.study.bookmanage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class BookManageApplication { public static void main(String[] args) { SpringApplication.run(BookManageApplication.class, args); } }3. 项目结构解析核心目录plaintextsrc/main/java └── com.study.bookmanage ├── BookManageApplication.java // 启动类必须在最外层保证包扫描 ├── controller // 控制器接收请求、返回响应 ├── service // 服务层业务逻辑处理 ├── mapper // Mapper接口数据访问 └── entity // 实体类对应数据库表 src/main/resources ├── application.yml // 配置文件核心配置 ├── static/ // 静态资源如CSS/JS本文暂不用 └── templates/ // 模板页面本文用RESTful接口暂不用4. 常见报错与排错Maven 依赖下载失败打开 IDEA → File → Settings → Build → Maven配置国内镜像阿里云然后点击 Maven → Reload Project启动类报错 “找不到主类”检查启动类的包路径是否正确必须在业务代码包的最外层MySQL 连接失败确认 MySQL 服务已启动且配置文件中的 url、账号、密码正确。三、核心配置application.yml 编写关键在src/main/resources下创建application.yml层级清晰推荐优先使用配置数据库、MyBatis、服务器端口等核心信息yaml# 服务器配置 server: port: 8080 # 项目运行端口 # 数据库配置MySQL 8.0 spring: datasource: url: jdbc:mysql://localhost:3306/book_manage?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root # 你的MySQL用户名 password: 123456 # 你的MySQL密码 driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis配置 mybatis: mapper-locations: classpath:mapper/*.xml # Mapper.xml文件路径 type-aliases-package: com.study.bookmanage.entity # 实体类别名包简化XML中的类名 configuration: map-underscore-to-camel-case: true # 下划线转驼峰如数据库字段book_name → 实体类bookName log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志方便调试四、数据库设计图书表创建在 MySQL 中创建数据库book_manage并创建book表存储图书信息sqlCREATE DATABASE IF NOT EXISTS book_manage DEFAULT CHARACTER SET utf8mb4; USE book_manage; -- 图书表 CREATE TABLE IF NOT EXISTS book ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 图书ID主键, book_name VARCHAR(100) NOT NULL COMMENT 图书名称, author VARCHAR(50) NOT NULL COMMENT 作者, publish_house VARCHAR(100) COMMENT 出版社, publish_date DATE COMMENT 出版日期, price DECIMAL(10,2) COMMENT 价格, stock INT DEFAULT 0 COMMENT 库存数量 ) COMMENT 图书信息表;五、核心功能实现分层开发重点遵循 “Controller → Service → Mapper → Entity” 分层架构每一层职责清晰便于维护。1. 实体类Entity映射数据库表在entity包下创建Book.java用 Lombok 简化 get/set/toStringjava运行package com.study.bookmanage.entity; import lombok.Data; import java.math.BigDecimal; import java.util.Date; Data // Lombok注解自动生成get/set/构造方法/toString public class Book { private Integer id; // 图书ID private String bookName; // 图书名称对应数据库book_name下划线转驼峰 private String author; // 作者 private String publishHouse; // 出版社对应publish_house private Date publishDate; // 出版日期对应publish_date private BigDecimal price; // 价格 private Integer stock; // 库存 }2. Mapper 接口数据访问层在mapper包下创建BookMapper.java定义数据操作方法java运行package com.study.bookmanage.mapper; import com.study.bookmanage.entity.Book; import org.apache.ibatis.annotations.Mapper; import java.util.List; Mapper // 标识为MyBatis Mapper接口Spring Boot自动扫描 public interface BookMapper { // 1. 添加图书 int addBook(Book book); // 2. 根据ID删除图书 int deleteBookById(Integer id); // 3. 根据ID修改图书 int updateBook(Book book); // 4. 根据ID查询图书 Book getBookById(Integer id); // 5. 查询所有图书支持分页参数为页码pageNum和每页条数pageSize ListBook getAllBooks(Integer pageNum, Integer pageSize); // 6. 查询图书总数用于分页计算 int getBookCount(); }3. Mapper.xml编写 SQL 语句在src/main/resources下创建mapper文件夹新建BookMapper.xml实现 Mapper 接口的 SQL 逻辑xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd !-- 对应Mapper接口的全路径 -- mapper namespacecom.study.bookmanage.mapper.BookMapper !-- 添加图书 -- insert idaddBook parameterTypeBook INSERT INTO book (book_name, author, publish_house, publish_date, price, stock) VALUES (#{bookName}, #{author}, #{publishHouse}, #{publishDate}, #{price}, #{stock}) /insert !-- 根据ID删除图书 -- delete iddeleteBookById parameterTypeInteger DELETE FROM book WHERE id #{id} /delete !-- 根据ID修改图书 -- update idupdateBook parameterTypeBook UPDATE book set if testbookName ! null and bookName ! book_name #{bookName},/if if testauthor ! null and author ! author #{author},/if if testpublishHouse ! null and publishHouse ! publish_house #{publishHouse},/if if testpublishDate ! nullpublish_date #{publishDate},/if if testprice ! nullprice #{price},/if if teststock ! nullstock #{stock}/if /set WHERE id #{id} /update !-- 根据ID查询图书 -- select idgetBookById parameterTypeInteger resultTypeBook SELECT * FROM book WHERE id #{id} /select !-- 查询所有图书分页 -- select idgetAllBooks resultTypeBook SELECT * FROM book LIMIT #{pageNum}, #{pageSize} !-- 分页从pageNum开始查询pageSize条 -- /select !-- 查询图书总数 -- select idgetBookCount resultTypeInteger SELECT COUNT(*) FROM book /select /mapper4. 服务层Service业务逻辑处理1Service 接口在service包下创建BookService.javajava运行package com.study.bookmanage.service; import com.study.bookmanage.entity.Book; import java.util.List; public interface BookService { // 添加图书 boolean addBook(Book book); // 根据ID删除图书 boolean deleteBookById(Integer id); // 根据ID修改图书 boolean updateBook(Book book); // 根据ID查询图书 Book getBookById(Integer id); // 分页查询所有图书 ListBook getAllBooks(Integer pageNum, Integer pageSize); // 查询图书总数 int getBookCount(); }2Service 实现类在service包下创建impl子包新建BookServiceImpl.javajava运行package com.study.bookmanage.service.impl; import com.study.bookmanage.entity.Book; import com.study.bookmanage.mapper.BookMapper; import com.study.bookmanage.service.BookService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; Service // 标识为服务层组件Spring自动注入 public class BookServiceImpl implements BookService { Resource // 注入BookMapper也可用Autowired private BookMapper bookMapper; Override public boolean addBook(Book book) { // 简单业务校验图书名称和作者不能为空 if (book.getBookName() null || book.getBookName().trim().equals() || book.getAuthor() null || book.getAuthor().trim().equals()) { return false; } return bookMapper.addBook(book) 0; // 受影响行数0则成功 } Override public boolean deleteBookById(Integer id) { if (id null || id 0) { return false; } return bookMapper.deleteBookById(id) 0; } Override public boolean updateBook(Book book) { if (book.getId() null || book.getId() 0) { return false; } return bookMapper.updateBook(book) 0; } Override public Book getBookById(Integer id) { if (id null || id 0) { return null; } return bookMapper.getBookById(id); } Override public ListBook getAllBooks(Integer pageNum, Integer pageSize) { // 分页参数校验默认查询第1页每页10条 if (pageNum null || pageNum 0) { pageNum 0; // LIMIT起始索引从0开始 } else { pageNum (pageNum - 1) * pageSize; // 页码转换为索引如第2页 → 索引10 } if (pageSize null || pageSize 0) { pageSize 10; } return bookMapper.getAllBooks(pageNum, pageSize); } Override public int getBookCount() { return bookMapper.getBookCount(); } }5. 控制器ControllerRESTful 接口开发在controller包下创建BookController.java提供 HTTP 接口供前端调用java运行package com.study.bookmanage.controller; import com.study.bookmanage.entity.Book; import com.study.bookmanage.service.BookService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; RestController // 等同于Controller ResponseBody返回JSON数据 RequestMapping(/book) // 接口统一前缀 public class BookController { Resource private BookService bookService; // 1. 添加图书POST请求 PostMapping(/add) public MapString, Object addBook(RequestBody Book book) { MapString, Object result new HashMap(); boolean success bookService.addBook(book); if (success) { result.put(code, 200); result.put(msg, 添加成功); } else { result.put(code, 400); result.put(msg, 添加失败图书名称或作者不能为空); } return result; } // 2. 根据ID删除图书DELETE请求 DeleteMapping(/delete/{id}) public MapString, Object deleteBookById(PathVariable Integer id) { MapString, Object result new HashMap(); boolean success bookService.deleteBookById(id); if (success) { result.put(code, 200); result.put(msg, 删除成功); } else { result.put(code, 400); result.put(msg, 删除失败ID无效); } return result; } // 3. 根据ID修改图书PUT请求 PutMapping(/update) public MapString, Object updateBook(RequestBody Book book) { MapString, Object result new HashMap(); boolean success bookService.updateBook(book); if (success) { result.put(code, 200); result.put(msg, 修改成功); } else { result.put(code, 400); result.put(msg, 修改失败ID无效); } return result; } // 4. 根据ID查询图书GET请求 GetMapping(/get/{id}) public MapString, Object getBookById(PathVariable Integer id) { MapString, Object result new HashMap(); Book book bookService.getBookById(id); if (book ! null) { result.put(code, 200); result.put(msg, 查询成功); result.put(data, book); } else { result.put(code, 404); result.put(msg, 查询失败图书不存在); } return result; } // 5. 分页查询所有图书GET请求 GetMapping(/list) public MapString, Object getAllBooks( RequestParam(required false) Integer pageNum, RequestParam(required false) Integer pageSize) { MapString, Object result new HashMap(); ListBook bookList bookService.getAllBooks(pageNum, pageSize); int total bookService.getBookCount(); result.put(code, 200); result.put(msg, 查询成功); result.put(data, bookList); result.put(total, total); // 总条数 result.put(pageNum, pageNum null ? 1 : pageNum); // 当前页码 result.put(pageSize, pageSize null ? 10 : pageSize); // 每页条数 return result; } }六、项目测试接口调试附 Postman 示例1. 启动项目运行BookManageApplication.java的main方法控制台输出 “Started BookManageApplication in xxx seconds” 表示启动成功。2. 接口测试用 Postman1添加图书请求方式POST请求地址http://localhost:8080/book/add请求体JSONjson{ bookName: Spring Boot实战, author: 张三, publishHouse: 技术出版社, publishDate: 2023-01-15, price: 59.9, stock: 100 }响应结果成功json{ code: 200, msg: 添加成功 }2查询所有图书分页请求方式GET请求地址http://localhost:8080/book/list?pageNum1pageSize5响应结果json{ code: 200, msg: 查询成功, data: [ { id: 1, bookName: Spring Boot实战, author: 张三, publishHouse: 技术出版社, publishDate: 2023-01-15, price: 59.90, stock: 100 } ], total: 1, pageNum: 1, pageSize: 5 }其他接口删除、修改、根据 ID 查询按类似方式测试均能正常响应。七、项目优化与拓展方向加分项当前系统已实现核心功能但可进一步优化体现你的思考深度添加全局异常处理用RestControllerAdvice ExceptionHandler统一处理空指针、SQL 异常等避免接口返回 500 错误参数校验用NotBlank、NotNull等注解校验请求参数替代手动校验缓存优化引入 Redis 缓存热门图书数据减少数据库查询压力权限控制整合 Spring Security实现 “管理员 / 普通用户” 权限区分如普通用户只能查询管理员可增删改前端页面用 Vue/Element UI 搭建前端页面实现前后端分离容器化部署用 Docker 打包项目实现一键部署。八、学习总结与思考1. 核心知识点回顾通过图书管理系统实战我掌握了 Spring Boot 的核心应用自动配置无需手动配置 Tomcat、MyBatis依赖引入后自动生效配置文件YAML 格式的层级配置简化数据库、MyBatis 等配置分层架构Controller请求处理→ Service业务逻辑→ Mapper数据访问职责清晰RESTful 接口用 POST/DELETE/PUT/GET 对应增删改查符合 REST 规范。2. 踩坑与解决思路坑 1MySQL 8.0 连接报错 “时区异常”→ 解决在 URL 中添加serverTimezoneAsia/Shanghai坑 2Mapper 接口扫描不到→ 解决在启动类添加MapperScan(com.study.bookmanage.mapper)或在 Mapper 接口加Mapper坑 3下划线转驼峰失效→ 解决在 application.yml 中开启map-underscore-to-camel-case: true。3. 学习建议Spring Boot 的学习核心是 “实战驱动”先通过简单项目掌握基础用法再深入源码理解自动配置原理遇到问题优先查官方文档https://docs.spring.io/spring-boot/docs/current/reference/html/其次是 Stack Overflow 和 CSDN。九、代码托管完整项目代码已上传至 Gitee可直接下载运行 图书管理系统完整代码替换为你的 Gitee 仓库地址结尾本文通过图书管理系统将 Spring Boot 课程核心知识点落地为可运行项目覆盖 “环境搭建→配置→开发→测试” 全流程。如果你是课程学习者可直接基于此项目优化扩展为课程作业如果是入门者跟着步骤操作能快速掌握 Spring Boot 的实战技巧。