很多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%\bin"MySQL数据库安装
-- 创建数据库 CREATE DATABASE library_management DEFAULT CHARACTER SET utf8mb4; -- 创建用户并授权 CREATE USER 'library_user'@'localhost' IDENTIFIED BY 'password123'; GRANT ALL PRIVILEGES ON library_management.* TO 'library_user'@'localhost'; FLUSH PRIVILEGES;2.2 IDEA开发环境配置
IntelliJ IDEA需要安装必要的插件和配置:
- 安装Lombok插件:减少样板代码编写
- 配置Maven:使用阿里云镜像加速依赖下载
- 安装MyBatisX插件:增强MyBatis开发体验
<!-- 在pom.xml中配置阿里云镜像 --> <mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors>3. 数据库设计与建模
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 '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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 '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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 version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.0</version> <relativePath/> </parent> <groupId>com.library</groupId> <artifactId>library-management</artifactId> <version>1.0.0</version> <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> </project>4.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 BaseMapper<Book> { // 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 IService<Book> { List<Book> 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 ServiceImpl<BookMapper, Book> implements BookService { @Override public List<Book> searchBooks(String keyword) { QueryWrapper<Book> 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 Result<List<Book>> listBooks() { try { List<Book> books = bookService.list(); return Result.success(books); } catch (Exception e) { log.error("获取图书列表失败", e); return Result.error("获取图书列表失败"); } } @PostMapping public Result<String> 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 Result<String> 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 Result<String> 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:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>图书管理系统</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-primary"> <div class="container"> <a class="navbar-brand" href="#">图书管理系统</a> </div> </nav> <div class="container mt-4"> <div class="row mb-3"> <div class="col-md-6"> <h2>图书列表</h2> </div> <div class="col-md-6 text-end"> <button class="btn 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?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%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.skip=true部署到服务器:
# 上传jar包到服务器 scp target/library-management-1.0.0.jar user@server:/path/to/app/ # 启动应用 nohup java -jar library-management-1.0.0.jar --spring.profiles.active=prod > app.log 2>&1 &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项目开发流程。通过这个项目,可以掌握企业级应用开发的基本技能,为后续更复杂的项目开发打下坚实基础。
在实际开发过程中,建议先理解业务需求,再设计数据库结构,最后实现代码功能。遇到问题时,多查阅官方文档和社区资源,培养独立解决问题的能力。