好久没有更新了,从来不废话,直接开干

这次搭建的是一个图书管理系统。简单的前后端分离

# Java Spring Boot 作业文档
本文档详细记录了一个 Spring Boot 后端应用的开发过程,涵盖实体类创建、数据层开发(包括 CRUD、分页、条件查询)、业务层、表现层、前端集成以及 SSMP 框架整合。每个部分对应一个特定的作业,包含详细的实现说明和技术要点。
## 作业 1:实体类开发
本作业的目标是创建 Book 实体类,用于表示系统中的书籍信息。该类放置在 entity 包中,利用 Lombok 插件简化 getter、setter、构造函数和 toString 方法的编写。实体类包含书籍的 ID(唯一标识)、名称、作者和价格等字段,并通过注解配置与数据库表的映射。
实现细节

包结构:实体类位于 com.example.demo.entity 包,确保项目结构清晰。
Lombok 注解:使用 @Data 自动生成 getter、setter 等方法,@NoArgsConstructor 和 @AllArgsConstructor 提供无参和全参构造函数,简化代码。
数据库映射:通过 JPA 注解(如 @Entity 和 @Table)将类映射到数据库中的 books 表,@Id 标记主键字段。
字段设计:ID 作为主键,名称、作者和价格分别表示书籍的核心属性,类型选择考虑数据库存储需求(如 Long、String、Double)。

说明
Lombok 的使用显著减少了样板代码,提高了开发效率。实体类的设计遵循面向对象原则,确保字段与数据库表结构一致,为后续数据操作提供了基础。该类的创建是整个后端开发的第一步,为数据层和业务层奠定了模型基础。
![](http://xtstuc.dyfl.top/xtsimage/sprig1.png)
Book.java,项目路径src/main/java/com/example/demo/entity/Book.java
~~~
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 图书实体类,对应数据库表 tbl_book
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("tbl_book")  // 指定数据库表名
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

~~~

## 作业 2:数据层开发 - 基础 CRUD
本作业实现数据访问层,支持对书籍信息的增删改查(CRUD)操作,使用 MyBatis 框架连接 MySQL 数据库。
步骤 1:配置项目依赖
在项目配置文件中添加必要的依赖,包括 Spring Boot Web 启动器、MyBatis 与 Spring Boot 集成包、MySQL 数据库驱动以及 HikariCP 连接池。这些依赖确保了项目能够连接数据库并执行 SQL 操作。
![](http://xtstuc.dyfl.top/xtsimage/springbosyot2.png)


步骤 2:配置数据源
在 application.yml 文件中设置数据库连接信息,包括数据库的 URL、用户名、密码和驱动类名。同时配置 MyBatis 的 Mapper 文件路径和实体类包路径,以便框架自动加载映射文件和实体类。
![](http://xtstuc.dyfl.top/xtsimage/springboot3.png)
BookMapper.java,文件路径src/main/java/com/example/demo/mapper/BookMapper.java
~~~
package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BookMapper extends BaseMapper<Book> {
    // 继承 BaseMapper 即可实现基础 CRUD(无需手写 SQL)
}

~~~

步骤 3:创建 MyBatis Mapper 文件
在 resources/mapper 目录下创建 BookMapper.xml 文件,定义 CRUD 操作的 SQL 语句。文件中包括查询所有书籍、按 ID 查询、插入新书籍、更新书籍信息和删除书籍的 SQL 配置,映射到 DAO 层接口的对应方法。
![](http://xtstuc.dyfl.top/xtsimage/springboot4.png)
BookMapper.xml 文件路径 src/main/resources/BookMapper.xml
~~~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.book.dao.BookMapper">

    <select id="getAllBooks" resultType="com.example.demo.book.pojo.Book">
        SELECT id, type, name, description FROM tbl_book
    </select>

</mapper>

~~~

步骤 4:DAO 层测试
在 test 目录下创建 BookDaoTestCase 测试类,用于验证 CRUD 功能的正确性。测试用例覆盖插入、查询、更新和删除操作,通过 JUnit 框架运行,确保 DAO 层与数据库交互正常。测试通过表明数据层基础功能已实现。
说明
MyBatis 提供了一种灵活的 SQL 映射方式,结合 Spring Boot 的自动配置功能,简化了数据层开发。HikariCP 连接池的使用提高了数据库连接的性能和稳定性。测试用例的编写确保了 CRUD 操作的可靠性,为后续功能开发提供了保障。
![](http://xtstuc.dyfl.top/xtsimage/springboot7.png)
BookDaoTestCase.java 文件路径src/test/java/com/example/demo/BookDaoTestCase.java
~~~
package com.example.demo;  //分页功能作业3

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.Book;
import com.example.demo.mapper.BookMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookMapper bookMapper;

    @Test
    public void testGetPage() {
        // 创建分页对象:当前页为2,页面大小为5条数据
        Page<Book> page = new Page<>(2, 5);

        // 执行分页查询,第二个参数是查询条件Wrapper,null代表无条件
        bookMapper.selectPage(page, null);

        // 输出分页信息
        System.out.println("当前页码:" + page.getCurrent());
        System.out.println("每页记录数:" + page.getSize());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());

        // 输出当前页数据
        System.out.println("当前页数据列表:");
        page.getRecords().forEach(System.out::println);
    }
}


~~~


## 作业 3:数据层开发 - 分页功能
本作业在基础 CRUD 的基础上实现分页查询功能,允许按页显示书籍列表,提高数据查询效率。
实现细节

分页测试类:在 test 目录下创建分页测试类,调用 DAO 层分页查询方法,验证分页效果。
![](http://xtstuc.dyfl.top/xtsimage/spring5java.png)
BookDaoTestCase.java 文件路径src/test/java/com/example/demo/BookDaoTestCase.java
~~~
package com.example.demo;  //分页功能作业3

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.Book;
import com.example.demo.mapper.BookMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookMapper bookMapper;

    @Test
    public void testGetPage() {
        // 创建分页对象:当前页为2,页面大小为5条数据
        Page<Book> page = new Page<>(2, 5);

        // 执行分页查询,第二个参数是查询条件Wrapper,null代表无条件
        bookMapper.selectPage(page, null);

        // 输出分页信息
        System.out.println("当前页码:" + page.getCurrent());
        System.out.println("每页记录数:" + page.getSize());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());

        // 输出当前页数据
        System.out.println("当前页数据列表:");
        page.getRecords().forEach(System.out::println);
    }
}


~~~

分页拦截器:配置 MyBatis 的分页拦截器(例如 MyBatis-Plus 的分页插件),通过拦截 SQL 查询自动添加分页逻辑(如 LIMIT 和 OFFSET)。未配置拦截器将导致分页功能失效。
![](http://xtstuc.dyfl.top/xtsimage/image-6.png)
webbatisPlusConfig.java 文件路径src/main/java/com/example/demo/config/MybatisPlusConfig.java
~~~
package com.example.demo.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

~~~
测试运行:运行 BookDaoTestCase 测试类,检查分页查询是否返回正确的数据条数和页码内容。测试类位于 test 目录,确保与生产代码分离。
![](http://xtstuc.dyfl.top/xtsimage/image-8.png)
说明
分页功能是数据量较大时的常见需求,通过拦截器实现避免了手动修改 SQL 的繁琐工作。MyBatis-Plus 的分页插件支持多种数据库,配置简单且高效。测试用例验证了分页逻辑的正确性,确保了功能的可扩展性。


## 作业 4:数据层开发 - 条件查询功能
本作业实现书籍的模糊查询功能,允许根据关键字(如书籍名称或作者)搜索相关记录。
实现细节

模糊查询测试类:在 test 目录下创建 BookDaoTestCase2 测试类,专门用于测试模糊查询功能。测试用例以 “spring” 作为关键字,验证是否能正确返回包含该关键字的书籍记录。
DAO 层实现:在 DAO 接口和 Mapper 文件中添加模糊查询方法,使用 SQL 的 LIKE 语句实现关键字匹配。
测试验证:运行测试类,检查模糊查询结果是否符合预期。测试通过表明条件查询功能正常。

说明
模糊查询通过 SQL 的 LIKE 语句实现,适用于需要灵活搜索的场景。测试类的设计确保了查询逻辑的正确性,同时也为后续复杂查询功能的开发提供了参考。关键字搜索的实现提高了系统的用户友好性。
![](http://xtstuc.dyfl.top/xtsimage/image-99.png)
BookDaoTestCase2.java 文件路径src/test/java/com/example/demo/BookDaoTestCase2.java
~~~
package com.example.demo;  //作业4 模糊搜索

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Book;
import com.example.demo.mapper.BookMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;



@SpringBootTest
public class BookDaoTestCase2 {

    @Autowired
    private BookMapper bookMapper;

    @Test
    void testGetBy() {
        QueryWrapper<Book> qw = new QueryWrapper<>();
        qw.like("name", "Spring"); // 模糊查询 name 中包含 Spring 的书

        List<Book> books = bookMapper.selectList(qw);
        books.forEach(System.out::println);
    }
}

~~~
## 作业 5:业务层开发
本作业实现业务层,封装数据层操作,提供更高层次的逻辑处理。
实现细节  
Service 接口:在 service 包下创建 BookService 接口,定义书籍管理的业务方法,如增删改查和分页查询。
Service 实现:创建接口的实现类,通过 @Service 注解交由 Spring 管理,调用 DAO 层方法完成具体操作。
单元测试:在 test 目录下创建 BookServiceTest 测试类,验证业务方法的正确性。测试用例覆盖主要业务场景,确保逻辑无误。
![](http://xtstuc.dyfl.top/xtsimage/image-9.png)
BookServiceTest.java 文件路径src/main/java/com/example/demo/Service/BookServiceTest.java
~~~
package com.example.demo.Service;   //作业5的测试类


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.demo.entity.Book;
import com.example.demo.Service.BookService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTest {

    @Autowired
    private BookService bookService;

    @Test
    void testGetById() {
        System.out.println(bookService.getById(4));
    }

    @Test
    void testSave() {
        Book book = new Book();
        book.setType("测试数据123");
        book.setName("测试数据123");
        book.setDescription("测试数据123");
        bookService.save(book);
    }

    @Test
    void testUpdate() {
        Book book = new Book();
        book.setId(53);
        book.setType("-----------------");
        book.setName("测试数据123");
        book.setDescription("测试数据123");
        bookService.update(book);
    }

    @Test
    void testDelete() {
        bookService.delete(53);
    }

    @Test
    void testGetAll() {
        bookService.getAll().forEach(System.out::println);
    }

    @Test
    void testGetPage() {
        IPage<Book> page1 = bookService.getPage(2, 5, null);
        System.out.println("当前页码:" + page1.getCurrent());
        System.out.println("每页记录数:" + page1.getSize());
        System.out.println("总记录数:" + page1.getTotal());
        System.out.println("总页数:" + page1.getPages());
        System.out.println("当前页数据:");
        page1.getRecords().forEach(System.out::println);
    }
}


~~~
说明
业务层的引入将数据操作与业务逻辑分离,符合分层架构的设计原则。Spring 的依赖注入机制简化了 Service 和 DAO 层之间的协作。单元测试的通过验证了业务层的稳定性和功能完整性。
![](http://xtstuc.dyfl.top/xtsimage/image-10.png)


## 作业 6:表现层开发
本作业实现表现层,通过 RESTful API 提供前端调用的接口。
实现细节

响应类:在 pojo 包下创建 R 类,用于封装 API 的响应数据,包含状态码、消息和数据字段,确保响应格式统一。
Controller 类:更新 BookController 类,定义 RESTful 端点(如 GET /books),调用 Service 层方法处理请求并返回 JSON 格式的响应。
接口测试:由于 Postman 需要安装,使用在线工具“工具猫”测试 API。启动后端服务,访问 http://localhost:8080/books,检查是否返回正确的 JSON 数据。
![](http://xtstuc.dyfl.top/xtsimage/image-13.png)
说明
表现层通过 Spring MVC 实现,RESTful API 的设计遵循标准化规范,便于前端集成。R 类的使用统一了响应格式,提高了接口的可读性和维护性。工具猫测试验证了后端服务的可用性。
![](http://xtstuc.dyfl.top/xtsimage/image-11.png)
更新BookController
![](http://xtstuc.dyfl.top/xtsimage/image-12.png)

## 作业 7:基础页面开发
本作业基于后端接口开发简单的前端页面,实现基本的书籍管理功能。
实现细节

前端技术:使用 HTML 结合 JavaScript 和 CSS 开发页面,通过 AJAX 调用后端 API 获取书籍数据并展示。
功能实现:页面支持书籍列表展示、添加、编辑和删除操作,与后端接口无缝对接。
测试验证:运行前端页面,检查与后端交互是否正常,功能是否符合预期。
![](http://xtstuc.dyfl.top/xtsimage/image-14.png)
说明
前端页面的开发完成了前后端联调,HTML 的简单实现适合快速验证接口功能。AJAX 技术确保了动态数据加载,提升了用户体验。功能的正常运行表明后端接口设计合理。

## 跨域问题
在前后端分离的项目里面,跨域问题是一个非常常见的问题,我采用了如下的解决方案,设置了全局请求
文件路径 src/main/java/com/example/demo/config/CorsConfig.java
~~~
package com.example.demo.config;


// 解决跨域问题,允许请求
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                        .allowedHeaders("*") // 允许的请求头
                        .allowCredentials(false)
                        .maxAge(3600);
            }
        };
    }
}


~~~

## 作业 8:SSMP 整合流程简介
SSMP 整合是指将 Spring、Spring MVC 和 MyBatis 三大框架整合到一个项目中,构建高内聚、低耦合的后端架构。以下是整合流程的详细说明:
步骤 1:创建 Maven 项目并配置依赖
在项目配置文件中添加 Spring 核心模块(Context、Web、AOP)、Spring MVC、MyBatis(或 MyBatis-Plus)、数据库连接池(如 Druid 或 HikariCP)、MySQL 驱动、日志框架和 JSON 序列化库等依赖。
步骤 2:配置数据库连接
在 application.yml 或 application.properties 中设置数据源信息,包括数据库地址、用户名、密码和驱动类名,确保 Spring Boot 能够连接数据库。
步骤 3:整合 MyBatis
配置 MyBatis 的 Mapper 文件扫描路径和实体类包路径,支持 XML 文件或注解方式定义 SQL。使用 MyBatis-Plus 时,可配置分页插件以支持分页查询。
步骤 4:整合 Spring
通过 @Service 和 @Component 注解将服务类和组件交由 Spring 管理,启用注解驱动和事务管理,确保业务逻辑的事务一致性。
步骤 5:整合 Spring MVC
配置 Spring MVC 的前端控制器(DispatcherServlet),设置静态资源路径、视图解析器和跨域支持,确保 RESTful API 和页面请求的正常处理。
步骤 6:配置启动类
在 Spring Boot 项目中创建主启动类,使用 @SpringBootApplication 和 @MapperScan 注解,指定 Mapper 接口的扫描路径,启动整个应用。
步骤 7:测试整合效果
通过编写实体类、Mapper 接口、Service 层和 Controller 层,结合 Postman 或前端页面测试接口,验证 SSMP 整合是否成功。
说明
SSMP 整合利用 Spring Boot 的自动配置功能,简化了框架配置过程。分层架构的设计提高了代码的可维护性和扩展性,测试验证了整合效果的可靠性。
图片链接:!

## 总结
通过以上八个作业,完成了从实体类定义到前后端集成的完整 Spring Boot 应用开发。每个作业逐步构建了后端功能,包括数据操作、业务逻辑、API 开发和前端展示,同时通过 SSMP 整合实现了高效的框架协作。测试用例和工具验证确保了功能的正确性和系统的稳定性。本文档详细记录了实现过程和技术要点,展示了项目的完整开发流程。