前言
在现代 web 开发中,跨域请求、数据访问层的高效管理以及 API 文档的生成等问题常常成为开发者面临的挑战。为了解决这些问题,许多开发者选择使用 Spring Boot 结合 Mybatis-Plus 进行后端开发。Mybatis-Plus 提供了强大的数据访问能力,配合简单易用的配置方式,极大地提升了开发效率。
本文将详细介绍如何在 Spring Boot 项目中解决跨域问题,通过设置 CorsConfig 类来允许跨域请求,确保前后端的顺畅交互。此外,我们将深入探讨 Mybatis-Plus 的配置与使用,涵盖从引入依赖到定义 Mapper 接口及 Service 层的完整流程。同时,我们还将介绍如何实现分页查询功能,并利用 Swagger UI 自动生成 API 文档,以提高接口的可读性和可维护性。
后端解决跨域
创建config 文件夹
创建corsconfig 的 类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { // 当前跨域请求最大有效时长。这里默认1天 private static final long MAX_AGE = 24 * 60 * 60; @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 corsConfiguration.setMaxAge(MAX_AGE); source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 return new CorsFilter(source); } }
Mybatis-Plus
下载一个mybatis 插件
依赖 <!-- mypbatis - plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency>
配置MybatisPlusConfig
package com.example.springboot.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration // 这个 扫描的包 为 mapper 文件夹下面的包 @MapperScan("com.example.springboot.mapper") public class MybatisPlusConfig{ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
配置的mapper
package com.example.springboot.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.springboot.pojo.User; public interface UserMapper extends BaseMapper <User>{ }
配置的service
UserService
配置yaml 文件 server: port: 8081 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2b8 username: root password: 253215 mybatis: mapper-locations: classpath:mapper/*.xml # classpath resources 文件夹 下面的 东西 # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志
可以直接使用 ,不需要写语句
// 增和 改 都在 这个里面 @PostMapping public boolean save(@RequestBody User user){ // 新增或则 更新 都在里面 return userService.saveUser(user); } // 查所有 @RequestMapping public List<User> findAll(){ return userService.list(); } // 删除 @DeleteMapping("/{id}") public boolean delete(@PathVariable Integer id){ return userService.removeById(id); }
分页查询
@RequestMapping("/page") // 不给defaultValue 会报错 public IPage<User> findPage(@RequestParam Integer pageNum, @RequestParam Integer pageSize, @RequestParam (defaultValue = "") String username, @RequestParam (defaultValue = "") String address) { // 页码和 每页个数 IPage <User>page=new Page<>(pageNum,pageSize); // 添加 查询的 参数 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 实现 拼接 // 如果 不为空 为 true 则 加上 username if(!"".equals(username)){ queryWrapper.like("username",username); } if(!"".equals(address)){ queryWrapper.like("address",address); } return userService.page(page, queryWrapper); }
SwaggerUI
先配置pom.xml
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
配置application.yaml
spring: mvc: pathmatch: matching-strategy: ANT_PATH_MATCHER
配置 SwaggerConfig 文件
package com.example.springboot.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { /** * 创建API应用 * apiInfo() 增加API相关信息 * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现, * 本例采用指定扫描的包路径来定义指定要建立API的目录。 * * @return */ @Bean public Docket restApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName("标准接口") .apiInfo(apiInfo("Spring Boot中使用Swagger2构建RESTful APIs", "1.0")) .useDefaultResponseMessages(true) .forCodeGeneration(false) .select() // 注意更改controller 包名 .apis(RequestHandlerSelectors.basePackage("com.example.springboot.controller")) .paths(PathSelectors.any()) .build(); } /** * 创建该API的基本信息(这些基本信息会展现在文档页面中) * 访问地址:http://ip:port/swagger-ui.html * * @return */ private ApiInfo apiInfo(String title, String version) { return new ApiInfoBuilder() .title(title) .description("更多请关注: https://blog.csdn.net/xqnode") .termsOfServiceUrl("https://blog.csdn.net/xqnode") .contact(new Contact("xqnode", "https://blog.csdn.net/xqnode", "xiaqingweb@163.com")) .version(version) .build(); } }
配置完成之后便可以使用
代码 生成器
mp 的 依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency>
utils 文件夹下面
package com.example.springboot.utils; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import java.util.Collections; /** * */ public class CodeGenerator { public static void main(String[] args) { generate(); } private static void generate(){ FastAutoGenerator.create("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2b8", "root", "253215") .globalConfig(builder -> { builder.author("youren") // 设置作者 .enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir("E:\\springBootLearn\\springBoot\\src\\main\\java"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.example.springboot") // 设置父包名 .moduleName("") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml,"E:\\springBootLearn\\springBoot\\src\\main\\resources\\mapper " )); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("sys_user") // 设置需要生成的表名 .addTablePrefix("t_", "sys_"); // 设置过滤表前缀 }) // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }
user.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.springboot.mapper.UserMapper"> <!-- id 和 方法名一样--> <update id="update"> update sys_user <set> <if test="username != null"> username=#{username}, </if> <!-- <if test="password != null">--> <!-- password=#{password}--> <!-- </if>--> <if test="nickname != null"> nickname=#{nickname}, </if> <if test="email != null"> email=#{email}, </if> <if test="phone != null"> phone=#{phone}, </if> <if test="address != null"> address=#{address} </if> </set> <where> id=#{id} </where> </update> </mapper>