springboot整合mybatis、swagger、代码生成器、Lombok


前言

提示:这里可以添加本文要记录的大概内容:


一、Swagger简述

1.1 swagger是什么?

1、是一款让你更好的书写API文档规范且完整的框架。

2、提供描述、生产、消费和可视化RESTful Web Service。

3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到商业API管理的方方面面。

二、Swagger整合springboot使用步骤

2.1 步骤一:导入jar包(pom.xml文件)

<!--    swagger插件    -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

2.2 步骤二: 编写swagger的配置类

package com.tzw.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
/**
 * @author tzw
 * @version 1.0
 */
@Configuration
public class Swagger3Config {
    
    
    @Bean
    public Docket apiConfig(){
    
    
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                //设置通过什么方式定位到需要生成文档的接口.
                // 定位了方法上的Api0peration
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())//接口URL路径,any表示全部的路径
                .build();
    }


    public ApiInfo apiInfo(){
    
    
        return new ApiInfoBuilder()
                .title("第一个Springboot项目")
                .description("项目描述信息")
                .contact(new Contact("tzw","https://blog.csdn.net/qq_45821255?spm=1011.2415.3001.5343","[email protected]"))
                .version("1.0")
                .build();
    }
}

2.3 步骤三:在启动类上加@EnableOpenApi注解

package com.tzw;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import springfox.documentation.oas.annotations.EnableOpenApi;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableOpenApi//以后很多配置都需要在启动类上加上Enable...,表示打开。
public class TestApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(TestApplication.class, args);
    }

}

2.4 步骤4:在controller类中加上@Api(tags = {“模块作用说明”})

@Api(tags = {“xxx”})用在类上,表示说明该类的作用。

@RestController
@RequestMapping("/test")
@Api(tags = {
    
    "第一个spring项目测试模块"})//用在类上,表示说明该类的作用。
public class TestController {
    
    

}

2.5 步骤5:在controller类中的方法上加上@ApiOperation(value = “模块结果”)

为了测试,完善一下controller层,同时完善pojo层:
controller:

@RestController
@RequestMapping("/test")
@Api(tags = {
    
    "第一个spring项目测试模块"})//用在类上,表示说明该类的作用。
public class TestController {
    
    

    @GetMapping()
    @ApiOperation(value = "显示测试结果")//用在方法上,说明方法的用途和作用
    public  Object testDemo(){
    
    
        List<TestDay01> list = new ArrayList<>();
        list.add(new TestDay01("张三",18));
        list.add(new TestDay01("张三1",12));
        list.add(new TestDay01("张三2",13));
        return list;
    }
}

指定请求方法:

在这里插入图片描述

代码:

package com.tzw.gene.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tzw.gene.entity.User;
import com.tzw.gene.service.IUserService;
import com.tzw.gene.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Delete;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author student_tzw
 * @since 2022-08-22
 */
@RestController
@RequestMapping("/gene/user")
@Api(tags = "用户管理")
public class UserController {
    
    
    @Resource
    private IUserService service;

    @ApiOperation(value = "查询全部数据",httpMethod = "GET")
    @GetMapping
    public Result select(){
    
    
        List<User> list = service.testSelect();
        return Result.success().setData("list",list);//下面三行代码可以替换此行
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("list",list);
//        return Result.success().setData(map);
    }

    @ApiOperation("按ID查询")
    @GetMapping("/{id}")
    public Result selectById(@PathVariable Integer id){
    
    
        User user = service.getById(id);
        return Result.success().setData("user",user);

    }


    @ApiOperation("分页查询")//需要加入插件
    @GetMapping("/{current}/{size}")
    public Result selectPage(@PathVariable Integer current,@PathVariable Integer size){
    
    
        Page<User> page = new Page<>(current, size);
        service.page(page);
        return Result.success().setData("page",page);

    }

    @ApiOperation(value = "保存用户",httpMethod = "POST")
    @PostMapping
    public Result save(@RequestBody User user){
    
    
        return service.save(user)?Result.success():Result.error();
    }

    @ApiOperation(value = "更新用户",httpMethod = "PUT")
    @PutMapping
    public Result update(@RequestBody User user){
    
    
        return service.updateById(user)?Result.success():Result.error();
    }

    @ApiOperation(value = "删除用户",httpMethod = "DELETE")
    @DeleteMapping("/{id}")
    public  Result delete(@PathVariable Integer id){
    
    
        return service.removeById(id)?Result.success():Result.error();
    }

}

pojo代码:

@Data
@NoArgsConstructor
@AllArgsConstructor

public class TestDay01 {
    
    
    private String name;
    private int age;

}

2.6 (步骤(选)) : 为方法(增删查改)中的形参做说明

@ApiImplicitParams(
            @ApiImplicitParam(
                    name = "id",value = "测试id",required = true,
                    paramType = "path",
                    dataType = "Integer", dataTypeClass = Integer.class
            )
    )

2.7 步骤6 : 测试swagger

访问地址:http://localhost:8080/swagger-ui/index.html
在这里插入图片描述

在controller里加一个查询模块:(为方法(增删查改)中的形参做说明)

    @GetMapping("/find")
    @ApiOperation(value = "按给定id来查询信息")//用在方法上,说明方法的用途和作用
    @ApiImplicitParams(
            @ApiImplicitParam(
                    name = "id",value = "测试id",required = true,
                    paramType = "path",
                    dataType = "Integer", dataTypeClass = Integer.class
            )
    )
    public  Object selectById(@PathVariable int id){
    
    
        return new TestDay01("张三",18);
    }

测试:
在这里插入图片描述

三、springboot整合lombok

在pom.xml中配置即可

<!--     lombok   -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

四、springboot配置代码生成器

步骤一:导入pom.xml文件的依赖

创建springboot模块的时候可以选择(lombok、apache模板引擎、热部署和驱动,SpringWeb等…)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tzw</groupId>
    <artifactId>first_boot_project</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
<!--    swagger插件    -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

<!--     lombok   -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

<!--   mybatisplus     -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--        模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
<!--        热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.tzw.TestApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

步骤二:配置yml文件

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis?serverTimeZone=GMT%2B8
    username: root
    password: admin

步骤三:配置生成基本代码的测试类

我们可以在applicationTest里面配置,代码从baomidou.com的快速入门中获得

package com.tzw;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AppTests {
    
    
	@Test
	void contextLoads() {
    
    
	}
	@Test
	public void generator(){
    
    
		FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis?serverTimeZone=UTC", "root", "admin")
				.globalConfig(builder -> {
    
    
					builder.author("student_tzw") // 设置作者
							.enableSwagger() // 开启 swagger 模式, 开启之后,在实体类中有api的注解
							.fileOverride() // 覆盖已生成文件
							.outputDir(".\\src\\main\\java"); // 指定输出目录(在当前目录的java目录下)
				})
				.packageConfig(builder -> {
    
    
					builder.parent("com.tzw") // 设置父包名
							.moduleName("gene") ;// 设置父包模块名
					//.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
					//默认有生成路径,可以不配置
				})
				.strategyConfig(builder -> {
    
    
					builder.addInclude("tb_user") // 设置需要生成的表名,多个表时,在后面添加即可。
							.addTablePrefix("tb_") // 设置过滤表前缀,多个前缀时,在后面添加即可。
							.entityBuilder().enableLombok()//开启lombok
							.controllerBuilder().enableRestStyle();//开启restController
//							.enableChainModel()//开启链式编程
//							.logicDeletePropertyName()
				})
				.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
				.execute();

	}

}

遇到的异常

1、创建bean异常

删掉改行即可。
在这里插入图片描述

步骤四:统一返回结果对象

Result类:

package com.tzw.gene.util;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

/**
 * @author tzw
 * @version 1.0
 * 返回结果
 */
@Data
@Accessors(chain = true)
public class Result {
    
    
    //操作是否成功
    private Boolean isSuccess;
    //状态码
    private Integer code;
    //消息
    private  String message;
    //返回操作数据
    private Map<String,Object> data;

    public static Result success(){
    
    
        return  new Result().setIsSuccess(true)
                            .setCode(ResultCode.SUCCESS)
                            .setMessage("操作成功")
                            .setData(new HashMap<>());
    }

    public static Result error(){
    
    
        return  new Result().setIsSuccess(false)
                .setCode(ResultCode.ERROR)
                .setMessage("操作失败")
                .setData(new HashMap<>());
    }
    public Result setData(HashMap<String,Object> data){
    
    
        this.data = data;
        return this;
    }

    public Result setData(String key,Object value){
    
    
        this.data.put(key, value);
        return this;
    }

}

ResultCode状态码接口


package com.tzw.gene.util;

/**
 * @author tzw
 * @version 1.0
 */
public interface ResultCode {
    
    
    Integer SUCCESS = 20000;//表示成功
    Integer ERROR = 20001;//表示失败

}

步骤五:测试(手写Controller层)

Entity、mapper、service层全部都自动生成,我们只需要加我们需要的插件及配置。
Controller层的增删查改:

package com.tzw.gene.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tzw.gene.entity.User;
import com.tzw.gene.service.IUserService;
import com.tzw.gene.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Delete;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author student_tzw
 * @since 2022-08-22
 */
@RestController
@RequestMapping("/gene/user")
@Api(tags = "用户管理")
public class UserController {
    
    
    @Resource
    private IUserService service;

    @ApiOperation("查询全部数据")
    @GetMapping
    public Result select(){
    
    
        List<User> list = service.list();
        return Result.success().setData("list",list);//下面三行代码可以替换此行
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("list",list);
//        return Result.success().setData(map);
    }

    @ApiOperation("按ID查询")
    @GetMapping("/{id}")
    public Result selectById(@PathVariable Integer id){
    
    
        User user = service.getById(id);
        return Result.success().setData("user",user);

    }


    @ApiOperation("分页查询")//需要加入插件
    @GetMapping("/{current}/{size}")
    public Result selectPage(@PathVariable Integer current,@PathVariable Integer size){
    
    
        Page<User> page = new Page<>(current, size);
        service.page(page);
        return Result.success().setData("page",page);

    }

    @ApiOperation("保存用户")
    @PostMapping
    public Result save(@RequestBody User user){
    
    
        return service.save(user)?Result.success():Result.error();
    }

    @ApiOperation("更新用户")
    @PutMapping
    public Result update(@RequestBody User user){
    
    
        return service.updateById(user)?Result.success():Result.error();
    }

    @ApiOperation("删除用户")
    @DeleteMapping("/{id}")
    public  Result delete(@PathVariable Integer id){
    
    
        return service.removeById(id)?Result.success():Result.error();
    }

}

用swagger测试:
在这里插入图片描述

对于mapper.xml文件的使用

1、在yml中配置mapper的地址和别名

mybatis-plus:
  mapper-locations: mapper/**/*.xml
  type-aliases-package: com.tzw.gene.entity

2、在包配置的参数中加上要生成mapper.xml的目录

.
.
.
.packageConfig(builder -> {
    
    
					builder.parent("com.tzw") // 设置父包名
							.moduleName("gene") // 设置父包模块名
							.pathInfo(Collections.singletonMap(OutputFile.xml,".\\src\\resources\\mapper"));

在这里插入图片描述


总结

猜你喜欢

转载自blog.csdn.net/qq_45821255/article/details/126431435