mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。

前言

一、maven依赖

1. 新增依赖(本博客用到的swagger2和分页依赖)

<!--swagger2 依赖-->
<!--http://localhost:8086/swagger-ui.html# 使用这个接口对接口进行测试-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

<!--分页依赖-->
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.5</version>
</dependency>

2. 所有依赖

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.feng</groupId>
    <artifactId>springboot-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis</name>
    <description>springboot-mybatis</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <!-- mybatis逆向工程jar包:mybatis-generator-core -->
        <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-maven-plugin -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--逆向工程,自动生成@Table、@Id等注解,会使用到下面两个注解-->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>
        <!--通用Mapper启动器-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.3</version>
        </dependency>

        <!--第一次新增加:mysql驱动和Druid数据源-->
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!--数据源-->
        <!--http://localhost:8083/druid/index.html 通过这个网址 对 SQL进行监控-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--第二次新增加:swagger2、jsqlparser、pagehelper-->
        <!--swagger2 依赖-->
        <!--http://localhost:8086/swagger-ui.html# 使用这个接口对接口进行测试-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        <!--分页依赖-->
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>springboot-mybatis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <overwrite>true</overwrite>
                    <configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
                    <!--避免操作不当,覆盖原来的类,设置为不覆盖:false-->
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.47</version>
                    </dependency>
                    <!--<dependency>
                        <groupId>com.thunisoft.arterybase</groupId>
                        <artifactId>ArteryBase</artifactId>
                        <version>3.6.2.2</version>
                    </dependency>-->
                    <!--自动生成@Table、@Id等注解-->
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.0.0</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

</project>

二、application.yml配置

1. 新增配置

# 分页配置
pagehelper:
  # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你也可以配置helperDialect属性来指定分页插件使用哪种方言
  helper-dialect: mysql
  # 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超
  # 过总数时),会查询最后一页。默认false 时,直接根据参数进行查询
  reasonable: true

# log日志
#mybatis:
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
  level:
    com.feng.dao: debug

#swagger
swagger2:
  enable: true

2. 全配置

server:
  port: 8086
spring:
  application:
    name: company-frame
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.131.168:3306/CLASS?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: Dataadt123!

mybatis:
  # 配置映射类所在的包名
  type-aliases-package: com.feng.bean, com.feng.vo.req, com.feng.vo.resp
  # 配置 mapper xml 文件所在的路径, 如果不配置 会报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  # 也就是 java 找不到 mapper 的 xml 文件中的语句
  mapper-locations: classpath:mapper/*.xml
  # mybatis 打印 SQL 语句
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

pagehelper:
  # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你也可以配置helperDialect属性来指定分页插件使用哪种方言
  helper-dialect: mysql
  # 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超
  # 过总数时),会查询最后一页。默认false 时,直接根据参数进行查询
  reasonable: true

# log日志
logging:
  level:
    com.feng.dao: debug

#swagger
swagger2:
  enable: true

3. 打印SQL日志配置(两种)

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
  level:
    com.feng.dao: debug

这两个配置都可以
区别在于:
第一个是启用mybatis的SQL日志打印
第二个是启用springboot的日志框架。

四、统一的数据返回格式

1. 定义统一数据返回格式(important)

统一数据返回格式包括三个数据:

  • code:int类型,请求响应编码,0表示请求成功,其他表示失败
  • msg:String类型,响应客户端的提示
  • data:T 泛型,响应客户端内容

新建包 utils 存放DataResult.java
新建包 exception.code 存放ResponseCodeInterface.javaBaseResponseCode.java

DataResult.java 为统一数据返回格式的类
ResponseCodeInterface.java为返回数据的code和data的接口
BaseResponseCode.java 为返回数据的code和data的各种情况定义。

com/feng/utils/DataResult.java
com/feng/exception/code/ResponseCodeInterface.java
com/feng/exception/code/BaseResponseCode.java

2. DataResult.java

编写新包新类:utils/DataResult.java
其中内容如下:

package com.feng.utils;

import com.feng.exception.code.BaseResponseCode;
import com.feng.exception.code.ResponseCodeInterface;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class DataResult<T> {
    /*
     * 请求响应code,0表示请求成功,其他表示失败
     * */
    @ApiModelProperty(value = "请求响应code,0表示请求成功,其他表示失败")
    private int code = 0;

    /*
     * 响应客户端的提示
     * */
    @ApiModelProperty(value = "响应异常码详细情况")
    private String msg;

    /*
     * 响应客户端内容
     * */
    @ApiModelProperty(value = "响应客户端内容")
    private T data;

    /*
    * 先编写 7个 构造函数,然后再编写静态函数,便于开发
    * */

    public DataResult() {
        this.code = BaseResponseCode.SUCCESS.getCode();
        this.msg = BaseResponseCode.SUCCESS.getMsg();
        this.data = null;
    }

    public DataResult(T data) {
        this.code = BaseResponseCode.SUCCESS.getCode();
        this.msg = BaseResponseCode.SUCCESS.getMsg();
        this.data = data;
    }

    public DataResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public DataResult(int code, T data) {
        this.code = code;
        this.msg = null;
        this.data = data;
    }

    public DataResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public DataResult(ResponseCodeInterface responseCodeInterface) {
        this.code = responseCodeInterface.getCode();
        this.msg = responseCodeInterface.getMsg();
        this.data = null;
    }

    public DataResult(ResponseCodeInterface responseCodeInterface, T data) {
        this.code = responseCodeInterface.getCode();
        this.msg = responseCodeInterface.getMsg();
        this.data = data;
    }

    // 以下 为定义的方法,直接调用上面封装好的 构造方法。  6个
    /**
     * 操作成功 data 不为null
     */
    public static <T> DataResult success(T data) {
        return new <T>DataResult(data);
    }

    /**
     * 操作成功 data为null
     */
    public static <T> DataResult success() {
        return new <T>DataResult();
    }

    /**
     * 自定义 返回操作 data 可控
     */
    public static <T> DataResult getResult(int code, String msg, T data) {
        return new <T>DataResult(code, msg, data);
    }

    /**
     * 自定义返回  data为null
     */
    public static <T> DataResult getResult(int code, String msg) {
        return new <T>DataResult(code, msg);
    }

    /**
     * 自定义返回 入参一般是异常code枚举 data为空
     */
    public static <T> DataResult getResult(BaseResponseCode responseCode) {
        return new <T>DataResult(responseCode);
    }

    /**
     * 自定义返回 入参一般是异常code枚举 data 可控
     */
    public static <T> DataResult getResult(BaseResponseCode responseCode, T data) {
        return new <T>DataResult(responseCode, data);
    }
}

3. ResponseCodeInterface.java 接口

package com.feng.exception.code;

/**
 * @ClassName: ResponseCodeInterface
 * TODO:类文件简单描述
 * @Author: 冯凡利
 * @UpdateUser: 冯凡利
 * @Version: 0.0.1
 */
public interface ResponseCodeInterface {
    int getCode();
    String getMsg();
}

4. BaseResponseCode.java枚举类

package com.feng.exception.code;

/**
 * @ClassName: BaseResponseCode
 * @Description: 响应码约定
 * @Author: 冯凡利
 * @UpdateUser: 冯凡利
 * @Version: 0.0.1
 */
public enum BaseResponseCode implements ResponseCodeInterface {
    /**
     * 这个要和前段约定好
     * code=0:服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
     * code=4010001:(授权异常) 请求要求身份验证。 客户端需要跳转到登录页面重新登录
     * code=4010002:(凭证过期) 客户端请求 刷新凭证接口
     * code=4030001:没有权限禁止访问
     * code=400xxxx:系统主动抛出的业务异常
     * code=5000001:系统异常
     */
    SUCCESS(0, "操作成功"),
    SYSTEM_ERROR(5000001, "系统异常请稍后再试"),
    DATA_ERROR(4000001, "传入数据异常"),
    METHOD_IDENTITY_ERROR(4000002, "数据校验异常"),
    ACCOUNT_ERROR(4000003, "该账号不存在"),
    ACCOUNT_LOCK(4010001, "该账号被锁定,请联系系统管理员"),
    ACCOUNT_PASSWORD_ERROR(4000004, "用户名密码不匹配"),
    TOKEN_ERROR(4010001, "用户未登录,请重新登录"),
    TOKEN_NOT_NULL(4010001, "token 不能为空"),
    SHIRO_AUTHENTICATION_ERROR(4010001, "用户认证异常"),
    ACCOUNT_HAS_DELETED_ERROR(4010001, "该账号已被删除,请联系系统管理员"),
    TOKEN_PAST_DUE(4010002, "token失效,请刷新token"),
    NOT_PERMISSION(4030001, "没有权限访问该资源"),
    OPERATION_ERROR(4000005, "操作失败"),
    OPERATION_MENU_PERMISSION_CATALOG_ERROR(4000006, "操作后的菜单类型是目录,所属菜单必须为默认顶级菜单或者目录"),
    OPERATION_MENU_PERMISSION_MENU_ERROR(4000007, "操作后的菜单类型是菜单,所属菜单必须为目录类型"),
    OPERATION_MENU_PERMISSION_BTN_ERROR(4000008, "操作后的菜单类型是按钮,所属菜单必须为菜单类型"),
    OPERATION_MENU_PERMISSION_URL_NOT_NULL(4000009, "菜单权限的url不能为空"),
    OPERATION_MENU_PERMISSION_URL_PERMS_NULL(4000010, "菜单权限的标识符不能为空"),
    OPERATION_MENU_PERMISSION_URL_METHOD_NULL(4000011, "菜单权限的请求方式不能为空"),
    ACCOUNT_LOCK_TIP(4010012, "该账号被锁定,请联系系统管理员"),
    OPERATION_MENU_PERMISSION_UPDATE(4010013, "操作的菜单权限存在子集关联不允许变更"),
    ROLE_PERMISSION_RELATION(4010014, "该菜单权限存在子集关联,不允许删除"),
    NOT_PERMISSION_DELETED_DEPT(4010015, "该组织机构下还关联着用户,不允许删除"),
    OLD_PASSWORD_ERROR(4010016, "旧密码不匹配"),
    OPERATION_MENU_PERMISSION_URL_CODE_NULL(4000011, "菜单权限的按钮标识不能为空"),
    ;

    /**
     * 响应码
     */
    private int code;
    /**
     * 提示
     */
    private String msg;

    BaseResponseCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }
}

五、请求模块

编写vo包,此包下,新建 reqresp包,即:com/feng/vo/reqcom/feng/vo/resp

req包,存放请求的数据。
resp包,存放响应的数据。

1. vo/req/StudentPageReqVo.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentPageReqVo implements Serializable {

    @ApiModelProperty(value = "当前第几页")
    private Integer pageNum = 1;

    @ApiModelProperty(value = "当前页数量")
    private Integer pageSize = 10;
}

2. vo/resp/PageRespVo.java

/**
 * @ClassName: PageVO
 * @Description: 分页 POJO 返回的响应数据
 * @createTime: 2020/2/5 15:45
 * @Author: 冯凡利
 * @UpdateUser: 冯凡利
 * @Version: 0.0.1
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageRespVo<T> implements Serializable {
    /**
     * 总 记录数
     */
    @ApiModelProperty(value = "总记录数")
    private Long totalRows;

    /**
     * 总 页数
     */
    @ApiModelProperty(value = "总页数")
    private Integer totalPages;

    /**
     * 当前 第几页
     */
    @ApiModelProperty(value = "当前第几页")
    private Integer nowPageNum;
    /**
     * 每页 记录数
     */
    @ApiModelProperty(value = "每页记录数")
    private Integer pageSize;
    /**
     * 当前页 记录数
     */
    @ApiModelProperty(value = "当前页记录数")
    private Integer curPageSize;
    /**
     * 数据 列表
     */
    @ApiModelProperty(value = "数据列表")
    private List<T> dataList;
}

六、utils工具模块

1. 定义

utils包存放各种工具类,比如分页工具类,统一数据返回格式类等等。
在utils包中编写分页工具类PageUtil.java
会在业务层用到。

2. 分页工具类:PageUtil.java(important)

package com.feng.utils;

import com.feng.vo.resp.PageRespVo;
import com.github.pagehelper.Page;

import java.util.List;

public class PageUtil {
    public PageUtil() {
    }

    public static <T> PageRespVo<T> getPageVO(List<T> list){
        PageRespVo<T> respVo = new PageRespVo<>();

        if (list instanceof Page) {
            Page page = (Page) list; // 将结果集 list 强转为 page 对象,则
            respVo.setTotalRows(page.getTotal()); // 总记录数
            respVo.setTotalPages(page.getPages());
            respVo.setNowPageNum(page.getPageNum());// 当前页数
            respVo.setCurPageSize(page.getPageSize());// 当前页 记录数
            respVo.setPageSize(page.size()); // 每页 记录数
            respVo.setDataList(page.getResult()); // 数据 列表
        }

        return respVo;
    }
}

七、业务代码

1. bean模型层

Student.java

package com.feng.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    private Integer stuId;

    private String name;

    private String gender;

    private Integer age;

    private String nation;

    private static final long serialVersionUID = 1L;

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", stuId=").append(stuId);
        sb.append(", name=").append(name);
        sb.append(", gender=").append(gender);
        sb.append(", age=").append(age);
        sb.append(", nation=").append(nation);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}

2. controller控制层

package com.feng.controller;

import com.feng.bean.Student;
import com.feng.service.StudentService;
import com.feng.utils.DataResult;
import com.feng.vo.req.StudentPageReqVo;
import com.feng.vo.resp.PageRespVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping("/stu/{userId}")
    public DataResult<Student> getStuByIdPath(@PathVariable Integer userId){
        Student student = studentService.getStuById(userId);
        DataResult result = DataResult.success(student);
        return result;
    }

    @GetMapping(value = "/stu")
    @ResponseBody
    public DataResult<Student> getCompanyByIdGET(@RequestParam(value = "userId") Integer id) {
        Student student = studentService.getStuById(id);
        DataResult result = DataResult.success(student);
        return result;
    }

    @PostMapping(value = "/stuPageInfo")
    @ResponseBody
    public DataResult<PageRespVo<Student>> getStuPageInfo(@RequestBody StudentPageReqVo studentPageReqVo){
        PageRespVo<Student> stuPageInfo = studentService.getStuPageInfo(studentPageReqVo);
        DataResult result = DataResult.success(stuPageInfo);
        return result;
    }

    @GetMapping(value = "/allStu")
    @ResponseBody
    public DataResult<List<Student>> getAllStu(){
        List<Student> students = studentService.getAllStu();
        DataResult result = DataResult.success(students);
        return result;
    }
}

3. service业务层

a. StudentService 接口

package com.feng.service;

import com.feng.bean.Student;
import com.feng.vo.req.StudentPageReqVo;
import com.feng.vo.resp.PageRespVo;

import java.util.List;

public interface StudentService {

    Student getStuById(Integer userId);

    PageRespVo<Student> getStuPageInfo(StudentPageReqVo studentPageReqVo);

    List<Student> getAllStu();
}

b. StudentServiceImpl 实现类(分页二行语句)

impl包下的StudentServiceImpl.java 实现类

package com.feng.service.impl;

import com.feng.bean.Student;
import com.feng.dao.StudentMapper;
import com.feng.service.StudentService;
import com.feng.utils.PageUtil;
import com.feng.vo.req.StudentPageReqVo;
import com.feng.vo.resp.PageRespVo;
import com.github.pagehelper.PageHelper;
import org.springframework.stereotype.Service;

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

@Service
public class StudentServiceImpl implements StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Override
    public Student getStuById(Integer userId) {
        return studentMapper.selectByPrimaryKey(userId);
    }

    @Override
    public PageRespVo<Student> getStuPageInfo(StudentPageReqVo studentPageReqVo) {
        PageHelper.startPage(studentPageReqVo.getPageNum(), studentPageReqVo.getPageSize());
        List<Student> students = studentMapper.getAllStudent();
        return PageUtil.getPageVO(students);
    }

    @Override
    public List<Student> getAllStu() {
        return studentMapper.getAllStudent();
    }
}

4. dao数据层

目前只有getAllStudent()是我写的其余都是mybatis-generator自动生成的。


package com.feng.dao;

import com.feng.bean.Student;
import com.feng.vo.req.StudentPageReqVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface StudentMapper {
    int deleteByPrimaryKey(Integer stuId);

    int insert(Student record);

    int insertSelective(Student record);

    Student selectByPrimaryKey(Integer stuId);

    int updateByPrimaryKeySelective(Student record);

    int updateByPrimaryKey(Student record);

    List<Student> getAllStudent();
}

5. mapper SQL语句

其余的我就不在复制了,都是mybatis-generator逆向生成的,都在GitHub中可以查看

<select id="getAllStudent" resultType="com.feng.bean.Student">
  SELECT stu_id AS stuId, name, gender, age, nation
  FROM STUDENT
</select>

八、整合Swagger配置

1. Swagger2config.java

编写包 config,新建类 Swagger2config.java

package com.feng.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class Swagger2Config {
    /**
     * 引入 yml 配置文件中的自定义属性
     * 用来控制 swagger2 接口文档的开关,因为在生产环境中,是要关闭掉 swagger2 接口文档的
     */
    @Value("${swagger2.enable}")
    private boolean enable;

    @Bean
    public Docket createRestApi() {
        /*
         * 这是为了我们在用 swagger 测试接口的时候添加头部信息
         * 模拟使用 header 参数,非必填
         * */
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        ParameterBuilder refreshTokenPar = new ParameterBuilder();

        tokenPar.name("authorization").description("swagger测试用(模拟authorization传入)非必填 header").modelRef(new ModelRef("string")).parameterType("header").required(false);
        refreshTokenPar.name("refresh_token").description("swagger测试用(模拟刷新token传入)非必填 header").modelRef(new ModelRef("string")).parameterType("header").required(false);
        /**
         * 多个的时候 就直接添加到 pars 就可以了
         */
        pars.add(tokenPar.build());
        pars.add(refreshTokenPar.build());

        return new Docket(DocumentationType.SWAGGER_2)
                // 自定义的 描述表头信息
                .apiInfo(apiInfo())
                // 函数返回一个ApiSerlectorBuilder 实例来控制哪些接口暴露给 Swagger ui 来展示
                .select()
                // 指定需要扫描的包路径
                .apis(RequestHandlerSelectors.basePackage("com.feng.controller"))
                .paths(PathSelectors.any())
                .build()
                // 添加请求头等信息
                .globalOperationParameters(pars)
                // 设置swagger文档的开关
                .enable(enable);
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("springboot-mybatis")
                .description("springboot 整合 mybatis 实战系列")
                .termsOfServiceUrl("")
                .version("1.0")
                .build();
    }
}

2. 启动类开启

开启Swagger配置,需要在主类上启动,使用 @EnableSwagger2 注解即可。

//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan(value = {"com.feng.dao"})
@SpringBootApplication
@EnableSwagger2
public class SpringbootMybatisApplication {

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

}

九、postman调用

1. 请求/allStu

GET http://localhost:8086/allStu
在这里插入图片描述

2. 分页请求/stuPageInfo

POST http://localhost:8086/stuPageInfo
请求头:Content-Type: application/json
请求体raw中的JSON:

{
    "pageNum":2,
    "pageSize":2
}

在这里插入图片描述

3. swagger2 UI展示

http://localhost:8086/swagger-ui.html#/
在这里插入图片描述

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
25天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
18天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
31 2
|
23天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
49 9
|
28天前
|
存储 easyexcel Java
SpringBoot+EasyExcel轻松实现300万数据快速导出!
本文介绍了在项目开发中使用Apache POI进行数据导入导出的常见问题及解决方案。首先比较了HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook三种传统POI版本的优缺点,然后根据数据量大小推荐了合适的使用场景。接着重点介绍了如何使用EasyExcel处理超百万数据的导入导出,包括分批查询、分批写入Excel、分批插入数据库等技术细节。通过测试,300万数据的导出用时约2分15秒,导入用时约91秒,展示了高效的数据处理能力。最后总结了公司现有做法的不足,并提出了改进方向。
|
29天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
45 2
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
205 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
123 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
375 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
17 0
mybatis使用二:springboot 整合 mybatis,创建开发环境