欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot整合Mybatis Plus和Swagger2的教程詳解

 更新時間:2021年02月24日 08:39:29   作者:野生D程序猿  
這篇文章主要介紹了Spring Boot整合Mybatis Plus和Swagger2的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言:如果你是初學者,請完全按照我的教程以及代碼來搭建(文末會附上完整的項目代碼包,你可以直接下載我提供的完整項目代碼包然后自行體驗?。?,為了照顧初學者所以貼圖比較多,請耐心跟著教程來,希望這個項目Demo能給你一些幫助,如果覺得寫的還可以請給個關(guān)注和點贊,謝謝!

題外話:這是我第一篇用markdown來寫的博文,格式不好的地方請見諒

一、pom.xml和application.yml

1、pom.xml中添加相關(guān)依賴,這里我把我的pom.xml代碼貼出來

<?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.3</version>
 <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>study</name>
<description>Demo project for Spring Boot</description>

<properties>
 <!--依賴的版本-->
 <java.version>1.8</java.version>
 <mysql.version>8.0.13</mysql.version>
 <mybatisPlus.version>3.4.1</mybatisPlus.version>
 <druid.version>1.0.9</druid.version>
 <swagger.version>2.9.2</swagger.version>
 <hutool.version>5.5.8</hutool.version>
</properties>

<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </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>

 <!--mysql-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 <version>${mysql.version}</version>
 </dependency>

 <!-- MyBatis-Plus-->
 <dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>${mybatisPlus.version}</version>
 </dependency>
 <dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-generator</artifactId>
 <version>${mybatisPlus.version}</version>
 </dependency>

 <!--druid-->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>${druid.version}</version>
 </dependency>

 <!--swagger2-->
 <dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-swagger2</artifactId>
 <version>${swagger.version}</version>
 </dependency>
 <dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-swagger-ui</artifactId>
 <version>${swagger.version}</version>
 </dependency>

 <!--hutool-->
 <dependency>
 <groupId>cn.hutool</groupId>
 <artifactId>hutool-all</artifactId>
 <version>${hutool.version}</version>
 </dependency>
</dependencies>

<build>
 <plugins>
 <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
  <excludes>
   <exclude>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   </exclude>
  </excludes>
  </configuration>
 </plugin>
 </plugins>
</build>

2、在resources下新建application.yml文件,并添加如下配置

# 配置端口
server:
 port: 8080

#----------------druid數(shù)據(jù)源配置-----------------------
spring:
 datasource:
 type: com.alibaba.druid.pool.DruidDataSource
 druid:
 #這里跟pom里面mysql-connector版本相關(guān)8.0之后用com.mysql.cj.jdbc.Driver,之前用com.mysql.jdbc.Driver
 driver-class-name: com.mysql.cj.jdbc.Driver
 #這里改成你自己的數(shù)據(jù)庫名稱以及賬號和密碼
 url: jdbc:mysql://127.0.0.1:3306/study?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
 username: root
 password: 123456
 initialSize: 10
 minIdle: 10
 maxActive: 30
 # 配置獲取連接等待超時的時間
 maxWait: 60000
 # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
 timeBetweenEvictionRunsMillis: 60000
 # 配置一個連接在池中最小生存的時間,單位是毫秒
 minEvictableIdleTimeMillis: 300000
 validationQuery: SELECT 1 FROM DUAL
 testWhileIdle: true
 testOnBorrow: false
 testOnReturn: false
 # 打開PSCache,并且指定每個連接上PSCache的大小
 poolPreparedStatements: true
 # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
 #filters: stat,wall,log4j
 # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
 # 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
 useGlobalDataSourceStat: true

#----------------mybatis plus配置-----------------------
mybatis-plus:
 # xml掃描,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應(yīng)的 XML 文件位置)
 mapper-locations: classpath:mapper/*.xml
 configuration:
 # 是否開啟自動駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射
 map-underscore-to-camel-case: true
 # 如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
 call-setters-on-nulls: true
 # 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 # 實體掃描,多個package用逗號或者分號分隔(這里更改為你的實體類存放路徑)
 typeAliasesPackage: com.example.study.model.entity
 global-config:
 db-config:
 #主鍵類型 AUTO:"數(shù)據(jù)庫ID自增" INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID (數(shù)字類型唯一ID)", UUID:"全局唯一ID UUID";
 id-type: auto
 #字段策略 IGNORED:"忽略判斷" NOT_NULL:"非 NULL 判斷") NOT_EMPTY:"非空判斷"
 field-strategy: NOT_EMPTY
 #數(shù)據(jù)庫類型
 db-type: MYSQL
 # 邏輯刪除配置
 # 刪除前
 logic-not-delete-value: 1
 # 刪除后
 logic-delete-value: 0

#----------------swagger配置-----------------------
swagger:
 #生產(chǎn)環(huán)境改為false(改為false后swagger-ui.html則無法訪問)
 enable: true
#解決Swagger2 異常 NumberFormatException:For input string:""
logging:
 level:
 io:
 swagger:
 models:
  parameters:
  AbstractSerializableParameter: ERROR

二、整合Swagger2

1、添加swagger的配置類SwaggerConfig.java

package com.example.study.config;

import io.swagger.annotations.Api;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
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.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

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

/**
 * Swagger配置類
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */
@Configuration
@EnableSwagger2
@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")
public class SwaggerConfig {
 /**
 * 創(chuàng)建API應(yīng)用
 * apiInfo() 增加API相關(guān)信息
 * 通過select()函數(shù)返回一個ApiSelectorBuilder實例,用來控制哪些接口暴露給Swagger來展現(xiàn),
 * 本例采用指定掃描的包路徑來定義指定要建立API的目錄。
 *
 * @return
 */
 @Bean
 public Docket createRestApi() {
 return new Docket(DocumentationType.SWAGGER_2)
  .apiInfo(this.apiInfo())
  .select()
  //設(shè)置選擇器,選擇帶Api接口類的類
  .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
  //api包掃描
  .apis(RequestHandlerSelectors.basePackage("com.example.study"))
  .paths(PathSelectors.any())
  .build()
  .securitySchemes(securitySchemes());
 }

 /**
 * 創(chuàng)建該API的基本信息(這些基本信息會展現(xiàn)在文檔頁面中)
 * 訪問地址:http://ip:端口/swagger-ui.html
 *
 * @return ApiInfo
 */
 private ApiInfo apiInfo() {
 return new ApiInfoBuilder().title("demo項目")
  .description("demo項目API文檔")
  .termsOfServiceUrl("http://localhost")
  .version("1.0")
  .build();
 }

 private List<ApiKey> securitySchemes() {
 List<ApiKey> apiKeyList= new ArrayList<>();
 //apiKeyList.add(new ApiKey("token", "令牌", "header"));
 return apiKeyList;
 }
}

2、新建controller包并且在controller包下新建IndexController.java

package com.example.study.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 首頁控制器
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */
@Api(tags = "首頁控制器")
@RestController
public class IndexController {

 @ApiOperation("首頁html")
 @GetMapping("/")
 public String index(){
 return "hello index";
 }
}

3、啟動StudyApplication.java后訪問http://localhost:8080/swagger-ui.html,出現(xiàn)第二圖所示則表示swagger整合完成


三、整合Mybatis Plus

1、如圖創(chuàng)建MybatisPlusConfi.java配置分頁插件

package com.example.study.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
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;

/**
 * 配置MybatisPlus分頁插件
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */
@Configuration
@MapperScan("com.example.study.mapper")
public class MybatisPlusConfig {

 /**
 * Mybatis-plus3.4.0版本過后使用MybatisPlusInterceptor分頁插件
 * 注意:DbType.MYSQL必須為自己使用的數(shù)據(jù)庫類型,否則分頁不生效
 */
 @Bean
 public MybatisPlusInterceptor mybatisPlusInterceptor() {
 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
 return interceptor;
 }

 /**
 * 設(shè)置useDeprecatedExecutor = false 避免緩存出現(xiàn)問題
 * @return
 */
 @Bean
 public ConfigurationCustomizer configurationCustomizer() {
 return configuration -> configuration.setUseDeprecatedExecutor(false);
 }
}

2、在數(shù)據(jù)庫中創(chuàng)建測試表

CREATE TABLE `t_user` (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(32) DEFAULT NULL,
 `age` int DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3、創(chuàng)建實體類UserEntity.java

package com.example.study.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 用戶信息實體類
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "UserEntity", description = "用戶實體")
@TableName("t_user")
public class UserEntity implements Serializable {

 private static final long serialVersionUID = 6928834261563057243L;

 /**
 * 唯一標識,自增主鍵
 */
 @ApiModelProperty(value = "id")
 @TableId(value = "id", type = IdType.AUTO)
 private Long id;

 /**
 * 姓名
 */
 @ApiModelProperty(value = "姓名")
 @TableField("name")
 private String name;

 /**
 * 年齡
 */
 @ApiModelProperty(value = "年齡")
 @TableField("age")
 private Integer age;
}

4、創(chuàng)建UserMapper.java

package com.example.study.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.study.model.entity.UserEntity;

/**
 * @author 154594742@qq.com
 */
public interface UserMapper extends BaseMapper<UserEntity> {
}

5、創(chuàng)建UserService.java

package com.example.study.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.study.model.entity.UserEntity;

/**
 * @author 154594742@qq.com
 */
public interface UserService extends IService<UserEntity> {
}

6、創(chuàng)建UserServiceImpl.java

package com.example.study.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.study.model.entity.UserEntity;
import com.example.study.mapper.UserMapper;
import com.example.study.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author 154594742@qq.com
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {
}

7、創(chuàng)建UserController.java(這里編譯器會提示一些錯誤暫時不用管,因為缺少一些類的代碼)

package com.example.study.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.study.model.entity.UserEntity;
import com.example.study.model.param.UserParam;
import com.example.study.model.vo.ResponseVo;
import com.example.study.service.UserService;
import com.example.study.util.CommonQueryPageUtils;
import com.example.study.util.BuildResponseUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 用戶控制器
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */

@RestController
@Api(tags = "用戶控制器")
public class UserController {

 @Autowired
 private UserService userService;

 @ApiOperation("新增")
 @PostMapping("user")
 public ResponseVo<?> add(UserEntity entity) {
 return userService.save(entity) ? BuildResponseUtils.success() : BuildResponseUtils.error();
 }

 @ApiOperation("通過id查詢")
 @GetMapping("user/{id}")
 public ResponseVo<UserEntity> getById(@PathVariable String id) {
 return BuildResponseUtils.buildResponse(userService.getById(id));
 }

 @ApiOperation("修改")
 @PutMapping("user")
 public ResponseVo<?> update(UserEntity entity) {
 return userService.updateById(entity) ? BuildResponseUtils.success() : BuildResponseUtils.error();
 }

 @ApiOperation("通過id刪除")
 @DeleteMapping("user/{id}")
 public ResponseVo<?> delete(@PathVariable String id) {
 return userService.removeById(id) ? BuildResponseUtils.success() : BuildResponseUtils.error();
 }


 @ApiOperation("分頁查詢")
 @GetMapping("userPage")
 public ResponseVo<IPage<UserEntity>> selectPage(UserParam param) {
 return BuildResponseUtils.buildResponse(CommonQueryPageUtils.commonQueryPage(param, userService));
 }

}

8、創(chuàng)建枚舉CodeMsgEnum.java

package com.example.study.enums;

/**
 * 異常類code常量(code值不要重復(fù))
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 9:42:00
 */
public enum CodeMsgEnum {
 //請求成功
 SUCCESS("0","成功!"),
 //系統(tǒng)異常
 FAIL("1","失敗!"),
 //以下是業(yè)務(wù)異常
 LOGIN_NO_PASS("1001","用戶名或密碼錯誤"),
 ;

 /**
 * 狀態(tài)碼
 */
 public String code;

 /**
 * 狀態(tài)碼對應(yīng)信息
 */
 public String msg;

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

9、創(chuàng)建統(tǒng)一的返回結(jié)果類ResponseVo.java

package com.example.study.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 統(tǒng)一的返回對象VO
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "ResponseVo", description = "統(tǒng)一的返回對象")
public class ResponseVo<T> implements Serializable {
 private static final long serialVersionUID = 7748070653645596712L;
 /**
 * 狀態(tài)碼
 */
 @ApiModelProperty(value = "狀態(tài)碼")
 private String code;

 /**
 * 狀態(tài)碼對應(yīng)描述信息
 */
 @ApiModelProperty(value = "狀態(tài)碼對應(yīng)描述信息")
 private String msg;

 /**
 * 數(shù)據(jù)
 */
 @ApiModelProperty(value = "數(shù)據(jù)")
 private T data;
}

10、創(chuàng)建常量類QueryMethodConstant.java

package com.example.study.constant;

/**
 * mybatis plus常用的查詢方式
 * @author 154594742@qq.com
 * @date 2021/2/23 11:24
 */

public interface QueryMethodConstant {
 /**
 * 相同
 */
 String EQ = "EQ";

 /**
 * 不相同
 */
 String NE = "NE";

 /**
 * 相似,左右模糊(like '%值%')
 */
 String LIKE = "LIKE";

 /**
 * 相似,左模糊(like '%值')
 */
 String LIKE_LIFT = "LIKE_LIFT";

 /**
 * 相似,右模糊(like '值%')
 */
 String LIKE_RIGHT = "LIKE_RIGHT";

 /**
 * 不相似 (not like '%值%')
 */
 String NOT_LIKE = "NOT_LIKE";

 /**
 * 大于
 */
 String GT = "GT";

 /**
 * 大于等于
 */
 String GE = "GE";

 /**
 * 小于
 */
 String LT = "LT";

 /**
 * 小于等于
 */
 String LE = "LE";
}

11、創(chuàng)建自定義注解QueryMethod.java(用于后續(xù)的通用分頁查詢工具類)

package com.example.study.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 查詢方式的自定義注解
 * @author 154594742@qq.com
 * @date 2021/2/23 11:24
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface QueryMethod {

 /**
 * 字段名
 */
 String field() default "";

 /**
 * 匹配方式
 */
 String method() default "";
}

12、創(chuàng)建構(gòu)建返回結(jié)果工具類BuildResponseUtils.java

package com.example.study.util;

import com.example.study.enums.CodeMsgEnum;
import com.example.study.model.vo.ResponseVo;

/**
 * 構(gòu)建返回結(jié)果工具類
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */
public final class BuildResponseUtils {

 /**
 * 構(gòu)建正確請求的response
 *
 * @return ResponseVo 統(tǒng)一的返回結(jié)果
 */
 public static ResponseVo<?> success() {
 ResponseVo<?> response = new ResponseVo<>();
 response.setCode(CodeMsgEnum.SUCCESS.code);
 response.setMsg(CodeMsgEnum.SUCCESS.msg);
 return response;
 }

 /**
 * 構(gòu)建業(yè)務(wù)異常的response
 * @param codeMsgEnum 枚舉
 * @return ResponseVo 統(tǒng)一的返回結(jié)果
 */
 public static ResponseVo<?> success(CodeMsgEnum codeMsgEnum) {
 ResponseVo<?> response = new ResponseVo<>();
 response.setCode(codeMsgEnum.code);
 response.setMsg(codeMsgEnum.msg);
 return response;
 }

 /**
 * 構(gòu)建自定義code和msg的業(yè)務(wù)異常
 *
 * @param code 自定義code
 * @param msg 自定義msg
 * @return ResponseVo 統(tǒng)一的返回結(jié)果
 */
 public static ResponseVo<?> success(String code, String msg) {
 ResponseVo<?> response = new ResponseVo<>();
 response.setCode(code);
 response.setMsg(msg);
 return response;
 }

 /**
 * 構(gòu)建系統(tǒng)異常的response(只用于系統(tǒng)異常)
 * @return ResponseVo 統(tǒng)一的返回結(jié)果
 */
 public static ResponseVo<?> error() {
 ResponseVo<?> response = new ResponseVo<>();
 response.setCode(CodeMsgEnum.FAIL.code);
 response.setMsg(CodeMsgEnum.FAIL.msg);
 return response;
 }

 /**
 * 構(gòu)建返回結(jié)果
 * @param obj 結(jié)果數(shù)據(jù)
 * @param <T> 結(jié)果數(shù)據(jù)的泛型
 * @return ResponseVo 統(tǒng)一的返回結(jié)果
 */
 public static <T> ResponseVo<T> buildResponse(T obj) {
 ResponseVo<T> response = new ResponseVo<>();
 response.setData(obj);
 response.setCode(CodeMsgEnum.SUCCESS.code);
 response.setMsg(CodeMsgEnum.SUCCESS.msg);
 return response;
 }
}

13、創(chuàng)建分頁查詢工具類CommonQueryPageUtils.java(本人自己封裝的,功能可能不是很完善,但是基本的單表查詢夠用了)

package com.example.study.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.study.annotation.QueryMethod;
import com.example.study.constant.QueryMethodConstant;
import com.example.study.model.param.PageParam;

import java.lang.reflect.Field;
import java.util.Locale;

/**
 * 分頁查詢工具類
 *
 * @author 154594742@qq.com
 * @date: 2021/2/22 10:02:00
 */
public final class CommonQueryPageUtils {

 /**
 * 正序
 */
 private static final String ASC = "asc";

 /**
 * 倒序
 */
 private static final String DESC = "desc";

 /**
 * 通用的帶排序功能的分頁查詢
 */
 public static <T> IPage<T> commonQueryPage(PageParam param, IService<T> service) {
 //構(gòu)建page
 //根據(jù)傳入的排序設(shè)置order
 //排序字段(格式:字段名:排序方式,字段名:排序方式 (asc正序,desc倒序) 示例:id:desc,age:asc)
 Page<T> page = new Page<>(param.getPage(), param.getLimit());
 String orders = param.getOrders();
 if (StringUtils.isNotBlank(orders)) {
  String[] splitArr = orders.split(",");
  for (String str : splitArr) {
  if (StringUtils.isBlank(str)) {
   continue;
  }
  String[] strArr = str.split(":");
  if (strArr.length != 2 || StringUtils.isBlank(strArr[0]) || StringUtils.isBlank(strArr[1])) {
   continue;
  }
  if (ASC.equals(strArr[1].toLowerCase(Locale.ROOT))) {
   page.addOrder(OrderItem.asc(strArr[0]));
   continue;
  }
  if (DESC.equals(strArr[1].toLowerCase(Locale.ROOT))) {
   page.addOrder(OrderItem.desc(strArr[0]));
  }
  }
 }
 //根據(jù)自定義注解構(gòu)建queryWrapper
 QueryWrapper<T> queryWrapper = new QueryWrapper<>();
 Class<? extends PageParam> clazz = param.getClass();
 Field[] fields = clazz.getDeclaredFields();
 for (Field field : fields) {
  //設(shè)置對象的訪問權(quán)限,保證對private的屬性可以訪問
  field.setAccessible(true);
  QueryMethod annotation = field.getAnnotation(QueryMethod.class);
  try {
  //屬性沒有值則跳過
  if (null == field.get(param)) {
   continue;
  }
  //沒有加@QueryMethod 默認屬性名為字段名,默認匹配方式為eq
  if (null == annotation) {
   queryWrapper.eq(field.getName(), field.get(param));
   continue;
  }

  switch (annotation.method()) {
   case QueryMethodConstant.EQ:
   queryWrapper.eq(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.NE:
   queryWrapper.ne(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.LIKE:
   queryWrapper.like(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.LIKE_LIFT:
   queryWrapper.likeLeft(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.LIKE_RIGHT:
   queryWrapper.likeRight(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.GT:
   queryWrapper.gt(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.GE:
   queryWrapper.ge(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.LT:
   queryWrapper.lt(annotation.field(), field.get(param));
   break;
   case QueryMethodConstant.LE:
   queryWrapper.le(annotation.field(), field.get(param));
   break;
   default:
   ;
  }
  } catch (IllegalAccessException e) {
  e.printStackTrace();
  }
 }
 return service.page(page, queryWrapper);
 }
}

14、創(chuàng)建統(tǒng)一的分頁查詢請求參數(shù)類PageParam.java

package com.example.study.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.LinkedHashMap;

/**
 * 統(tǒng)一的分頁查詢請求參數(shù)
 *
 * @author 154594742@qq.com
 * @date 2021/2/22 17:24
 */

@Data
@ApiModel(value = "PageParam", description = "分頁參數(shù)")
public class PageParam {
 /**
 * 頁碼
 */
 @ApiModelProperty(value = "頁碼,不傳則默認1")
 private Integer page = 1;

 /**
 * 每頁條數(shù)
 */
 @ApiModelProperty(value = "每頁條數(shù),不傳則默認10")
 private Integer limit = 10;

 /**
 * 排序字段(格式:字段名:排序方式,字段名:排序方式 (asc正序,desc倒序) 示例:id:desc,age:asc)
 */
 @ApiModelProperty(value = "排序字段(格式:字段名:排序方式,字段名:排序方式 (asc正序,desc倒序) 示例:id:desc,age:asc)")
 private String orders;
}

15、創(chuàng)建用戶查詢條件類UserParam.java繼承PageParam(以后分頁查詢的參數(shù)類都要繼承PageParam)

package com.example.study.model.param;

import com.example.study.annotation.QueryMethod;
import com.example.study.constant.QueryMethodConstant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 用戶查詢條件類(需要根據(jù)哪些字段查詢就添加哪些字段)
 * @author 154594742@qq.com
 * @date 2021/2/22 17:24
 */

@Data
@ApiModel(value = "UserParam", description = "用戶查詢條件")
public class UserParam extends PageParam {

 /**
 * 通過@QueryMethod注解來控制匹配的方式,這里查詢條件為 name like ‘%值%'
 */
 @ApiModelProperty(value = "姓名")
 @QueryMethod(field = "name", method = QueryMethodConstant.LIKE)
 private String name;

 /**
 * 這里沒有@QueryMethod注解則如果age有值,則默認查詢條件為 age=值
 */
 @ApiModelProperty(value = "年齡")
 private Integer age;

 /**
 * 假如要查詢 (值1 < age < 值2)則可以采用如下方式添加兩個屬性minAge和maxAge,
 * ‘ @QueryMethod 注解的field是數(shù)據(jù)表字段名,method是查詢方式
 * 假如minAge = 18,maxAge=25,則通過CommonQueryPageUtils工具類會構(gòu)建出的sql為 18<age AND age>25
 */
 @ApiModelProperty(value = "年齡下限")
 @QueryMethod(field = "age", method = QueryMethodConstant.GT)
 private String minAge;

 @ApiModelProperty(value = "年齡上限")
 @QueryMethod(field = "age", method = QueryMethodConstant.LT)
 private String maxAge;
}

16、先在數(shù)據(jù)庫中添加幾條測試數(shù)據(jù),然后啟動項目后打開http://localhost:8080/swagger-ui.html

insert into `t_user`(`id`,`name`,`age`) values 
(1,'小二',20),
(2,'張三',20),
(3,'李四',20),
(4,'王五',35),
(5,'小六',18);

17、按上圖填入查詢條件,然后點擊“Execute”執(zhí)行

返回的Response body:

{
 "code": "0",
 "msg": "成功!",
 "data": {
 "records": [
 {
 "id": 5,
 "name": "小六",
 "age": 18
 },
 {
 "id": 1,
 "name": "小二",
 "age": 20
 },
 {
 "id": 2,
 "name": "張三",
 "age": 20
 },
 {
 "id": 3,
 "name": "李四",
 "age": 20
 }
 ],
 "total": 4,
 "size": 10,
 "current": 1,
 "orders": [
 {
 "column": "age",
 "asc": true
 }
 ],
 "optimizeCountSql": true,
 "hitCount": false,
 "countId": null,
 "maxLimit": null,
 "searchCount": true,
 "pages": 1
 }
}

通過上面的返回結(jié)果可以看出我們帶條件帶排序的的分頁查詢功能是ok的!??!

感謝你看完了此篇博文,如果有什么問題可以評論留言,附上完整代碼 點擊下載完整代碼包

到此這篇關(guān)于Spring Boot整合Mybatis Plus和Swagger2的文章就介紹到這了,更多相關(guān)Spring Boot整合Mybatis Plus和Swagger2內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中對象轉(zhuǎn)json字符串的幾種常用方式舉例

    java中對象轉(zhuǎn)json字符串的幾種常用方式舉例

    這篇文章主要給大家介紹了關(guān)于java中對象轉(zhuǎn)json字符串的幾種常用方式,在Java中可以使用許多庫將對象轉(zhuǎn)換為JSON字符串,其中最常用的是Jackson和Gson,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • SpringCloud Zuul的使用簡介

    SpringCloud Zuul的使用簡介

    這篇文章主要介紹了SpringCloud Zuul的使用簡介,幫助大家更好的理解和學習使用Spring Cloud,感興趣的朋友可以了解下
    2021-04-04
  • Java設(shè)計模式之適配器模式的示例詳解

    Java設(shè)計模式之適配器模式的示例詳解

    適配器模式,即將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口的表示,主要目的是實現(xiàn)兼容性,讓原本因為接口不匹配,沒辦法一起工作的兩個類,可以協(xié)同工作。本文將通過示例詳細介紹適配器模式,需要的可以參考一下
    2022-08-08
  • @valid 無法觸發(fā)BindingResult的解決

    @valid 無法觸發(fā)BindingResult的解決

    這篇文章主要介紹了@valid 無法觸發(fā)BindingResult的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java classloader和namespace詳細介紹

    Java classloader和namespace詳細介紹

    這篇文章主要介紹了Java classloader和namespace詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 淺析spring定時器的使用

    淺析spring定時器的使用

    這篇文章主要介紹了淺析spring定時器的使用,幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下
    2020-10-10
  • 淺談SpringMVC中Interceptor和Filter區(qū)別

    淺談SpringMVC中Interceptor和Filter區(qū)別

    這篇文章主要介紹了淺談SpringMVC中Interceptor和Filter區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 解決maven啟動Spring項目報錯的問題

    解決maven啟動Spring項目報錯的問題

    下面小編就為大家分享一篇解決maven啟動Spring項目報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 一文搞懂Spring中的注解與反射

    一文搞懂Spring中的注解與反射

    這篇文章主要為大家介紹了Spring中的注解與反射的原理與實現(xiàn),文中的示例代碼講解詳細,對我們了解Spring有一定的幫助,需要的可以參考一下
    2022-06-06
  • jvm垃圾回收之GC調(diào)優(yōu)工具分析詳解

    jvm垃圾回收之GC調(diào)優(yōu)工具分析詳解

    這篇文章主要為大家介紹了jvm垃圾回收之GC調(diào)優(yōu)工具的分析詳解,在進行JVM?GC性能調(diào)優(yōu)之前,需要使用某些工具獲取到當前應(yīng)用的狀態(tài)信息
    2022-01-01

最新評論