Spring Boot+MyBatis Plus图书管理系统开发实战 很多Java学习者在掌握了基础语法后常常面临不知道如何将知识点串联成完整项目的困境。图书管理系统作为经典的Java练手项目涵盖了从数据库设计到界面交互的全流程是检验Java综合能力的绝佳选择。本文将基于IntelliJ IDEA开发环境完整实现一个具备增删改查功能的图书管理系统提供可运行的源码和详细开发文档适合Java初学者巩固基础或毕业生完成课设/毕设需求。1. 项目概述与技术选型1.1 项目背景与功能需求图书管理系统是典型的信息管理系统(MIS)主要解决图书馆日常业务中的图书信息管理、借阅记录跟踪、用户权限控制等问题。一个完整的图书管理系统应包含以下核心功能图书信息管理实现图书的添加、删除、修改、查询等基本操作借阅管理记录图书借阅、归还状态管理借阅历史用户管理区分管理员和普通用户权限数据统计提供借阅排行、库存统计等数据分析功能1.2 技术栈选择理由本项目采用当前Java企业开发的主流技术栈Spring Boot 2.7简化Spring应用初始搭建和开发过程MyBatis Plus增强MyBatis功能简化CRUD操作MySQL 8.0稳定可靠的关系型数据库Thymeleaf自然模板引擎适合Web页面开发Bootstrap 5响应式前端框架提升界面美观度选择这些技术的原因在于它们组合起来学习曲线平缓社区资源丰富且符合企业实际开发需求。2. 开发环境准备2.1 基础软件安装在开始项目开发前需要确保本地环境已安装以下软件JDK安装与配置# 检查Java版本 java -version # 应该显示类似java version 17.0.2 2022-01-18 LTS # 设置JAVA_HOME环境变量Windows setx JAVA_HOME C:\Program Files\Java\jdk-17.0.2 setx Path %Path%;%JAVA_HOME%\binMySQL数据库安装-- 创建数据库 CREATE DATABASE library_management DEFAULT CHARACTER SET utf8mb4; -- 创建用户并授权 CREATE USER library_userlocalhost IDENTIFIED BY password123; GRANT ALL PRIVILEGES ON library_management.* TO library_userlocalhost; FLUSH PRIVILEGES;2.2 IDEA开发环境配置IntelliJ IDEA需要安装必要的插件和配置安装Lombok插件减少样板代码编写配置Maven使用阿里云镜像加速依赖下载安装MyBatisX插件增强MyBatis开发体验!-- 在pom.xml中配置阿里云镜像 -- mirrors mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrors3. 数据库设计与建模3.1 数据表结构设计合理的数据库设计是系统稳定运行的基础。以下是核心表结构图书信息表(book)CREATE TABLE book ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键ID, isbn VARCHAR(20) UNIQUE NOT NULL COMMENT ISBN编号, title VARCHAR(100) NOT NULL COMMENT 图书标题, author VARCHAR(50) NOT NULL COMMENT 作者, publisher VARCHAR(50) COMMENT 出版社, publish_date DATE COMMENT 出版日期, price DECIMAL(10,2) COMMENT 价格, stock INT DEFAULT 0 COMMENT 库存数量, status TINYINT DEFAULT 1 COMMENT 状态1-可借阅 0-不可借阅, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT图书信息表;用户表(users)CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键ID, username VARCHAR(30) UNIQUE NOT NULL COMMENT 用户名, password VARCHAR(100) NOT NULL COMMENT 密码, real_name VARCHAR(20) COMMENT 真实姓名, email VARCHAR(50) COMMENT 邮箱, phone VARCHAR(20) COMMENT 手机号, role TINYINT DEFAULT 0 COMMENT 角色0-普通用户 1-管理员, status TINYINT DEFAULT 1 COMMENT 状态1-正常 0-禁用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;3.2 表关系与索引优化为提升查询性能需要为常用查询字段添加索引-- 为图书表添加索引 CREATE INDEX idx_book_title ON book(title); CREATE INDEX idx_book_author ON book(author); CREATE INDEX idx_book_isbn ON book(isbn); -- 为借阅记录表添加索引 CREATE INDEX idx_borrow_user_id ON borrow_record(user_id); CREATE INDEX idx_borrow_book_id ON borrow_record(book_id); CREATE INDEX idx_borrow_status ON borrow_record(status);4. 项目架构搭建4.1 Maven依赖配置创建Spring Boot项目在pom.xml中配置必要依赖?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.0/version relativePath/ /parent groupIdcom.library/groupId artifactIdlibrary-management/artifactId version1.0.0/version dependencies !-- Spring Boot Starter -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency !-- MyBatis Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.2/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies /project4.2 项目目录结构规范的项目结构有助于代码维护src/main/java/com/library/ ├── LibraryApplication.java # 启动类 ├── config/ # 配置类 │ ├── MyBatisPlusConfig.java │ └── WebMvcConfig.java ├── controller/ # 控制层 │ ├── BookController.java │ ├── UserController.java │ └── BorrowController.java ├── entity/ # 实体类 │ ├── Book.java │ ├── User.java │ └── BorrowRecord.java ├── mapper/ # 数据访问层 │ ├── BookMapper.java │ ├── UserMapper.java │ └── BorrowRecordMapper.java ├── service/ # 业务层 │ ├── BookService.java │ ├── UserService.java │ └── impl/ # 实现类 └── util/ # 工具类 └── Result.java # 统一返回结果5. 核心功能实现5.1 实体类设计使用Lombok简化实体类代码// Book.java package com.library.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; Data TableName(book) public class Book { TableId(type IdType.AUTO) private Long id; private String isbn; private String title; private String author; private String publisher; private LocalDateTime publishDate; private BigDecimal price; private Integer stock; private Integer status; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }5.2 数据访问层实现利用MyBatis Plus简化CRUD操作// BookMapper.java package com.library.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.library.entity.Book; import org.apache.ibatis.annotations.Mapper; Mapper public interface BookMapper extends BaseMapperBook { // MyBatis Plus已提供基本CRUD方法 // 可自定义复杂查询方法 } // BookService.java package com.library.service; import com.baomidou.mybatisplus.extension.service.IService; import com.library.entity.Book; import java.util.List; public interface BookService extends IServiceBook { ListBook searchBooks(String keyword); boolean borrowBook(Long bookId, Long userId); boolean returnBook(Long bookId, Long userId); }5.3 业务逻辑层实现实现具体的业务逻辑// BookServiceImpl.java package com.library.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.library.entity.Book; import com.library.mapper.BookMapper; import com.library.service.BookService; import org.springframework.stereotype.Service; import java.util.List; Service public class BookServiceImpl extends ServiceImplBookMapper, Book implements BookService { Override public ListBook searchBooks(String keyword) { QueryWrapperBook wrapper new QueryWrapper(); wrapper.like(title, keyword) .or().like(author, keyword) .or().like(isbn, keyword); return this.list(wrapper); } Override public boolean borrowBook(Long bookId, Long userId) { Book book this.getById(bookId); if (book null || book.getStock() 0) { return false; } // 减少库存 book.setStock(book.getStock() - 1); return this.updateById(book); } }5.4 控制层设计RESTful API接口设计// BookController.java package com.library.controller; import com.library.entity.Book; import com.library.service.BookService; import com.library.util.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; Slf4j RestController RequestMapping(/api/books) public class BookController { private final BookService bookService; public BookController(BookService bookService) { this.bookService bookService; } GetMapping public ResultListBook listBooks() { try { ListBook books bookService.list(); return Result.success(books); } catch (Exception e) { log.error(获取图书列表失败, e); return Result.error(获取图书列表失败); } } PostMapping public ResultString addBook(RequestBody Book book) { try { boolean saved bookService.save(book); return saved ? Result.success(添加成功) : Result.error(添加失败); } catch (Exception e) { log.error(添加图书失败, e); return Result.error(添加图书失败); } } PutMapping(/{id}) public ResultString updateBook(PathVariable Long id, RequestBody Book book) { try { book.setId(id); boolean updated bookService.updateById(book); return updated ? Result.success(更新成功) : Result.error(更新失败); } catch (Exception e) { log.error(更新图书失败, e); return Result.error(更新图书失败); } } DeleteMapping(/{id}) public ResultString deleteBook(PathVariable Long id) { try { boolean removed bookService.removeById(id); return removed ? Result.success(删除成功) : Result.error(删除失败); } catch (Exception e) { log.error(删除图书失败, e); return Result.error(删除图书失败); } } }6. 前端页面开发6.1 页面模板设计使用Thymeleaf Bootstrap构建响应式界面!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title图书管理系统/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.1.3/dist/css/bootstrap.min.css relstylesheet /head body nav classnavbar navbar-expand-lg navbar-dark bg-primary div classcontainer a classnavbar-brand href#图书管理系统/a /div /nav div classcontainer mt-4 div classrow mb-3 div classcol-md-6 h2图书列表/h2 /div div classcol-md-6 text-end button classbtn btn-primary>// 加载图书列表 function loadBooks() { fetch(/api/books) .then(response response.json()) .then(data { if (data.success) { renderBooks(data.data); } else { alert(加载失败 data.message); } }) .catch(error console.error(Error:, error)); } // 添加图书 document.getElementById(addBookForm).addEventListener(submit, function(e) { e.preventDefault(); const formData new FormData(this); const bookData { isbn: formData.get(isbn), title: formData.get(title), author: formData.get(author), publisher: formData.get(publisher), price: parseFloat(formData.get(price)), stock: parseInt(formData.get(stock)) }; fetch(/api/books, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify(bookData) }) .then(response response.json()) .then(data { if (data.success) { $(#addBookModal).modal(hide); loadBooks(); this.reset(); } else { alert(添加失败 data.message); } }); });7. 系统配置与部署7.1 应用配置文件application.yml配置数据库连接和其他设置server: port: 8080 servlet: context-path: /library spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/library_management?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8 username: library_user password: password123 thymeleaf: cache: false encoding: UTF-8 mode: HTML prefix: classpath:/templates/ suffix: .html mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 07.2 启动类配置Spring Boot应用启动类package com.library; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication MapperScan(com.library.mapper) public class LibraryApplication { public static void main(String[] args) { SpringApplication.run(LibraryApplication.class, args); } }8. 常见问题与解决方案8.1 数据库连接问题问题现象启动时报数据库连接失败com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure解决方案检查MySQL服务是否启动确认数据库连接URL、用户名、密码正确检查防火墙设置确保3306端口可访问验证MySQL用户权限设置8.2 跨域访问问题问题现象前端请求API时出现CORS错误解决方案添加跨域配置类Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*) .allowCredentials(true); } }8.3 静态资源访问问题问题现象CSS、JS等静态资源无法加载解决方案配置静态资源路径Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/static/**) .addResourceLocations(classpath:/static/); } }9. 项目优化与扩展9.1 性能优化建议数据库连接池配置使用HikariCP替代默认连接池缓存集成集成Redis缓存热门图书数据分页查询大数据量时使用分页查询SQL优化为常用查询字段添加索引9.2 功能扩展方向权限管理集成Spring Security实现精细权限控制文件上传支持图书封面图片上传数据导出实现借阅记录Excel导出功能消息通知集成邮件提醒还书功能移动端适配开发微信小程序版本9.3 安全加固措施密码加密使用BCrypt对用户密码进行加密存储SQL注入防护使用MyBatis参数化查询XSS防护对用户输入进行过滤和转义会话管理设置合理的会话超时时间10. 项目部署与运维10.1 打包部署流程使用Maven打包项目mvn clean package -Dmaven.test.skiptrue部署到服务器# 上传jar包到服务器 scp target/library-management-1.0.0.jar userserver:/path/to/app/ # 启动应用 nohup java -jar library-management-1.0.0.jar --spring.profiles.activeprod app.log 21 10.2 生产环境配置创建application-prod.yml生产环境配置spring: datasource: url: jdbc:mysql://prod-db:3306/library_management username: ${DB_USERNAME} password: ${DB_PASSWORD} logging: level: com.library: INFO file: name: /var/log/library/app.log server: port: 80本项目完整实现了图书管理系统的核心功能代码结构清晰注释完整适合Java学习者深入理解Spring Boot项目开发流程。通过这个项目可以掌握企业级应用开发的基本技能为后续更复杂的项目开发打下坚实基础。在实际开发过程中建议先理解业务需求再设计数据库结构最后实现代码功能。遇到问题时多查阅官方文档和社区资源培养独立解决问题的能力。