久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

瀏覽:24日期:2023-03-22 08:22:17
導讀 Lombok:可以讓你的POJO代碼特別簡潔,不止簡單在BO/VO/DTO/DO等大量使用,還有設計模式,對象對比等 MybatisPlus:增加版Mybatis,基礎的數據庫CRUD、分頁等可以直接生成使用,避免了大量的重復低效代碼,還有數據庫自動Java類,sql文件等等,比傳統的更賤簡介易用 SwaggerUI:接口文檔自動生成,對接前端和測試更加方便,基于業界的OpennApi規范,采用Swagger3.x版本。

技術棧

SpringBoot2.4+ MybatisPlus+Lombok+Swagger3.x+jdk8+IDEA

在線構建項目

點我直達

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

什么是lombok

官網

點我直達

一個優秀的Java代碼庫,簡化了Java的編碼,為Java代碼的精簡提供了一種方式

添加依賴

<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!--scope=provided,說明它是在編譯階段生效,不需要打入包中,Lombok在編譯期將帶Lombok注解的Java文件正確編譯為完整的Class文件--> <scope>provided</scope> </dependency>常見注解@Getter/@Setter# 作用類上,生成所有成員變量的getter/setter方法 作用于成員變量上,生成該成員變量的getter/setter方法 方法控制訪問級別set和get注解加上@Getter(AccessLevel.PROTECTED) 編譯查看字節碼

mvn compile

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

package com.ybchen.shopmanager.model;import lombok.AccessLevel;import lombok.Getter;import lombok.Setter;/** * @Description: * @Author:chenyanbin * @Date:2021/3/2 下午9:43 * @Versiion:1.0 */@Getter@Setterpublic class User { //不想生成get方法 @Getter(AccessLevel.NONE) int id; //只會去生成get final String name = 'alex'; String phone; //靜態成員變量不會生成set/get方法 static final String pwd = '123';}

@NonNull

作用于方法上或者屬性,用于非空判斷,如果為空則拋異常

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@NoArgsContructor

生成無參構造器

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@AllArgsConstructor

生成全參構造器

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@RequiredArgsConstructor

指定參數的構造函數,有以下的特征的字段

final類型未被初始化的屬性,標記了@NonNull的屬性 注意:@NoArgsConstructor不能添加

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@ToStringList或者其他集合調試不方便控制臺或者日志輸出對象,默認打印的是內存地址作用于類,覆蓋默認的toString()方法

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

不包括某個字段

@ToString(exclude={'age'})

只輸出某個字段

@ToString(of={'name'})

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

為什么對象要重寫hashcode和equal方法

HashCode方法

頂級類Object里面的方法,所有類都是繼承Object的,返回值Int類型 根據一定的hash規則(存儲地址,字段,或者長度等),映射成一個數值,即散列值

Equals方法

頂級類Object里面的方法,所有類都是繼承Object的,返回值boolean類型 根據自定義的匹配規則,用于匹配兩個對象是否一樣,一般邏輯如下

1、判斷地址是否一樣2、非空判斷和class類型判斷3、強轉4、對象里面的字段一一匹配

解析

如果兩個對象相等,那么它們的hashCode()值一定相同。如果兩個對象hashCode()相等,它們并不一定相等。在散列表中hashCode()相等,即兩個鍵值的哈希值相等。然后哈希值相等,并不一定得出鍵值對相等,就出現所謂的哈希沖突場景,還需要equals方法判斷對象是否相等。

應用場景

當向集合中插入對象時,如何判別在集合中是否已經存在該對象,比如Set確保存儲對象的唯一值,并判斷是否同一個對象呢?

依據hashCode和equals進行判斷所以Set存儲的對象必須重寫這兩個方法,判斷兩個對象是否一樣首先判斷插入對象的hashCode值是否存在,hashCode值不存在則直接插入集合;值存在則還需要判斷equals方法判斷對象是否相等

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@EqualsAndHashCode

作用于類,覆蓋默認的equals和hashCode,作用于全部屬性

不包含某個屬性

@EqualsAndHashCode(exclude={'id'})

只輸出某個屬性

@EqualsAndHashCode(of={'id'})

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@Data

作用于類上,是以下注解的集合

@ToString

@EqualsAndHashCode

@Getter

@Setter

@RequiredArgsConstructor

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@Builder場景:當一個bean類重載了多個構造方法時,并且參數隨機使用時,考慮使用構造者模式

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

@Lof/@Slf4j作用于類上,生成日志變量,用于記錄日志

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

MybatisPlus介紹 官網:點我直達 是一個mybatis的增強工具,在Mybatis的基礎上只做強增不做改變,為簡化開發,提高效率

數據庫腳本

/* Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50728 Source Host : localhost:3306 Source Schema : shop Target Server Type : MySQL Target Server Version : 50728 File Encoding : 65001 Date: 04/03/2021 22:17:20*/SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for address-- ----------------------------DROP TABLE IF EXISTS `address`;CREATE TABLE `address` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL COMMENT ’用戶id’, `default_status` int(1) DEFAULT NULL COMMENT ’是否默認收貨地址:0->否;1->是’, `receive_name` varchar(64) DEFAULT NULL COMMENT ’收發貨人姓名’, `phone` varchar(64) DEFAULT NULL COMMENT ’收貨人電話’, `province` varchar(64) DEFAULT NULL COMMENT ’省/直轄市’, `city` varchar(64) DEFAULT NULL COMMENT ’市’, `region` varchar(64) DEFAULT NULL COMMENT ’區’, `detail_address` varchar(200) DEFAULT NULL COMMENT ’詳細地址’, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’電商-公司收發貨地址表’;-- ------------------------------ Records of address-- ----------------------------BEGIN;COMMIT;-- ------------------------------ Table structure for banner-- ----------------------------DROP TABLE IF EXISTS `banner`;CREATE TABLE `banner` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `img` varchar(524) DEFAULT NULL COMMENT ’圖片’, `url` varchar(524) DEFAULT NULL COMMENT ’跳轉地址’, `weight` int(11) DEFAULT NULL COMMENT ’權重’, `version` int(11) DEFAULT ’1’, `deleted` int(11) DEFAULT ’0’ COMMENT ’0是未刪除,1是已經刪除’, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of banner-- ----------------------------BEGIN;INSERT INTO `banner` VALUES (1, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, ’https://www.cnblogs.com/chenyanbin/’, 1, 2, 1);INSERT INTO `banner` VALUES (2, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, ’https://www.cnblogs.com/chenyanbin/’, 3, 1, 0);INSERT INTO `banner` VALUES (3, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, ’https://www.cnblogs.com/chenyanbin/’, 2, 1, 0);INSERT INTO `banner` VALUES (7, ’werw’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);INSERT INTO `banner` VALUES (8, ’666666’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);INSERT INTO `banner` VALUES (9, ’sdfds’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);INSERT INTO `banner` VALUES (10, ’323232’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);INSERT INTO `banner` VALUES (11, ’532’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);INSERT INTO `banner` VALUES (12, ’6666’, ’https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg’, 2, 1, 0);COMMIT;-- ------------------------------ Table structure for coupon-- ----------------------------DROP TABLE IF EXISTS `coupon`;CREATE TABLE `coupon` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ’id’, `category` varchar(11) DEFAULT NULL COMMENT ’優惠卷類型[NEW_USER注冊贈券,TASK任務卷,PROMOTION促銷??’, `publish` varchar(11) DEFAULT NULL COMMENT ’發布狀態, PUBLISH發布,DRAFT草稿,OFFLINE下線’, `coupon_img` varchar(524) DEFAULT NULL COMMENT ’優惠券圖片’, `coupon_title` varchar(128) DEFAULT NULL COMMENT ’優惠券標題’, `price` decimal(16,2) DEFAULT NULL COMMENT ’抵扣價格’, `user_limit` int(11) DEFAULT NULL COMMENT ’每人限制張數’, `start_time` datetime DEFAULT NULL COMMENT ’優惠券開始有效時間’, `end_time` datetime DEFAULT NULL COMMENT ’優惠券失效時間’, `publish_count` int(11) DEFAULT NULL COMMENT ’優惠券總量’, `stock` int(11) DEFAULT ’0’ COMMENT ’庫存’, `add_one` int(11) DEFAULT NULL COMMENT ’是否疊加0是不行,1是可以’, `create_time` datetime DEFAULT NULL, `condition_price` decimal(16,2) DEFAULT NULL COMMENT ’滿多少才可以使用’, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of coupon-- ----------------------------BEGIN;COMMIT;-- ------------------------------ Table structure for product-- ----------------------------DROP TABLE IF EXISTS `product`;CREATE TABLE `product` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) DEFAULT NULL COMMENT ’標題’, `cover_img` varchar(128) DEFAULT NULL COMMENT ’封面圖’, `detail` varchar(256) DEFAULT ’’ COMMENT ’詳情’, `old_price` decimal(16,2) DEFAULT NULL COMMENT ’老價格’, `price` decimal(16,2) DEFAULT NULL COMMENT ’新價格’, `stock` int(11) DEFAULT NULL COMMENT ’庫存’, `create_time` datetime DEFAULT NULL COMMENT ’創建時間’, `lock_stock` int(11) DEFAULT ’0’ COMMENT ’鎖定庫存’, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of product-- ----------------------------BEGIN;COMMIT;-- ------------------------------ Table structure for product_order-- ----------------------------DROP TABLE IF EXISTS `product_order`;CREATE TABLE `product_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `out_trade_no` varchar(64) DEFAULT NULL COMMENT ’訂單唯一標識’, `state` varchar(11) DEFAULT NULL COMMENT ’NEW 未支付訂單,PAY已經支付訂單,CANCEL超時取消訂單’, `create_time` datetime DEFAULT NULL COMMENT ’訂單生成時間’, `total_fee` decimal(16,2) DEFAULT NULL COMMENT ’訂單總金額’, `pay_fee` decimal(16,2) DEFAULT NULL COMMENT ’訂單實際支付價格’, `pay_type` varchar(64) DEFAULT NULL COMMENT ’支付類型,微信-銀行-支付寶’, `nickname` varchar(64) DEFAULT NULL COMMENT ’昵稱’, `head_img` varchar(524) DEFAULT NULL COMMENT ’頭像’, `user_id` int(11) DEFAULT NULL COMMENT ’用戶id’, `del` int(5) DEFAULT ’0’ COMMENT ’0表示未刪除,1表示已經刪除’, `update_time` datetime DEFAULT NULL COMMENT ’更新時間’, `order_type` varchar(32) DEFAULT NULL COMMENT ’訂單類型 DAILY普通單,PROMOTION促銷訂單’, `receiver_address` varchar(1024) DEFAULT NULL COMMENT ’收貨地址 json存儲’, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ------------------------------ Records of product_order-- ----------------------------BEGIN;COMMIT;-- ------------------------------ Table structure for product_order_item-- ----------------------------DROP TABLE IF EXISTS `product_order_item`;CREATE TABLE `product_order_item` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `product_order_id` bigint(11) DEFAULT NULL COMMENT ’訂單號’, `out_trade_no` varchar(32) DEFAULT NULL, `product_id` bigint(11) DEFAULT NULL COMMENT ’產品id’, `product_name` varchar(128) DEFAULT NULL COMMENT ’商品名稱’, `product_img` varchar(524) DEFAULT NULL COMMENT ’商品圖片’, `buy_num` int(11) DEFAULT NULL COMMENT ’購買數量’, `create_time` datetime DEFAULT NULL, `total_fee` decimal(16,2) DEFAULT NULL COMMENT ’購物項商品總價格’, `pay_fee` decimal(16,0) DEFAULT NULL COMMENT ’購物項商品支付總價格’, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of product_order_item-- ----------------------------BEGIN;COMMIT;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL COMMENT ’昵稱’, `pwd` varchar(124) DEFAULT NULL COMMENT ’密碼’, `head_img` varchar(524) DEFAULT NULL COMMENT ’頭像’, `slogan` varchar(524) DEFAULT NULL COMMENT ’用戶簽名’, `sex` tinyint(2) DEFAULT ’1’ COMMENT ’0表示女,1表示男’, `points` int(10) DEFAULT ’0’ COMMENT ’積分’, `create_time` datetime DEFAULT NULL, `mail` varchar(64) DEFAULT NULL COMMENT ’郵箱’, `secret` varchar(12) DEFAULT NULL COMMENT ’鹽,用于個人敏感信息處理’, PRIMARY KEY (`id`), UNIQUE KEY `mail_idx` (`mail`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------BEGIN;COMMIT;SET FOREIGN_KEY_CHECKS = 1;

pom.xml

<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus和spring boot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency><?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.ybchen</groupId> <artifactId>shop-manager</artifactId> <version>0.0.1-SNAPSHOT</version> <name>shop-manager</name> <description>Demo project for Spring Boot</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-starter-test</artifactId> <scope>test</scope> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!--scope=provided,說明它是在編譯階段生效,不需要打入包中,Lombok在編譯期將帶Lombok注解的Java文件正確編譯為完整的Class文件--> <scope>provided</scope> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus和spring boot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- 代碼庫 --> <repositories> <repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories></project>

完整pom.xml配置文件

application.properties

# 端口號server.port=9999#===========數據庫相關=============spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring.datasource.username=rootspring.datasource.password=root配置SpringBoot掃描路徑

啟動類上添加:@MapperScan('Mapper全包路徑')

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合MybatisPlus

統一接口返回協議

package com.ybchen.shopmanager.utils;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@AllArgsConstructor@NoArgsConstructorpublic class JsonData implements Serializable { /** * 狀態碼 0 表示成功,1 表示處理中,-1表示失敗 */ private Integer code; /** * 數據 */ private Object data; /** * 描述信息 */ private String msg; /** * 成功,無傳入數據 * * @return */ public static JsonData buildSuccess() { return new JsonData(0, null, null); } /** * 成功,有傳入數據 * * @param data 數據 * @return */ public static JsonData buildSuccess(Object data) { return new JsonData(0, data, null); } /** * 失敗,有返回錯誤信息 * * @param msg 描述信息 * @return */ public static JsonData buildError(String msg) { return new JsonData(-1, null, msg); } /** * 失敗,有狀態碼,描述信息 * * @param code 狀態碼 * @param msg 描述信息 * @return */ public static JsonData buildError(Integer code, String msg) { return new JsonData(code, null, msg); } /** * 是否返回成功 * @param jsonData * @return */ public static boolean isSuccess(JsonData jsonData) { return jsonData.getCode() == 0; }}

實體類

package com.ybchen.shopmanager.model;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;/** * @Description:輪播圖 * @Author:chenyanbin * @Date:2021/3/4 下午11:00 * @Versiion:1.0 */@Data//數據庫表名@TableName('banner')public class BannerDO { /** * 主鍵 */ private Integer id; /** * 圖片 */ private String img; /** * url跳轉地址 */ private String url; /** * 權重 */ private Integer weight; /** * 版本號 */ private Integer version; /** * 0是未刪除,1是已經刪除 */ private Integer deleted;}

service

package com.ybchen.shopmanager.service;import com.ybchen.shopmanager.model.BannerDO;import java.util.List;public interface BannerService { List<BannerDO> list();}package com.ybchen.shopmanager.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.ybchen.shopmanager.mapper.BannerMapper;import com.ybchen.shopmanager.model.BannerDO;import com.ybchen.shopmanager.service.BannerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @Description:輪播圖Service * @Author:chenyanbin * @Date:2021/3/4 下午11:04 * @Versiion:1.0 */@Servicepublic class BannerServiceImpl implements BannerService { @Autowired private BannerMapper bannerMapper; @Override public List<BannerDO> list() { return bannerMapper.selectList(new QueryWrapper<>()); }}

Controller

package com.ybchen.shopmanager.controller;import com.ybchen.shopmanager.service.BannerService;import com.ybchen.shopmanager.utils.JsonData;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;/** * @Description:輪播圖Controller * @Author:chenyanbin * @Date:2021/3/4 下午11:06 * @Versiion:1.0 */@RestController@RequestMapping('api/v1/banner')public class BannerController { @Autowired private BannerService bannerService; @GetMapping('list') public JsonData list(){ return JsonData.buildSuccess(bannerService.list()); }}

測試

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

單元測試+控制臺打印sql

單元測試

package com.ybchen.shopmanager;import com.ybchen.shopmanager.model.BannerDO;import com.ybchen.shopmanager.service.BannerService;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.List;//classes=啟動類.class@SpringBootTest(classes = ShopManagerApplication.class)@Slf4jpublic class BannerTest { @Autowired private BannerService bannerService; @Test public void testBannerTest() { List<BannerDO> list = bannerService.list(); log.info('輪播圖列表:{}', list); }}

配置文件

application.properties

# 配置mybatis plus打印sql日志mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

測試

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

BaseMapperMapper

繼承該接口后,無需編寫mapper.xml文件,即可獲得CRUD功能

/* * Copyright (c) 2011-2020, baomidou (jobob@qq.com). * <p> * Licensed under the Apache License, Version 2.0 (the 'License'); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * https://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */package com.baomidou.mybatisplus.core.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.core.toolkit.Constants;import org.apache.ibatis.annotations.Param;import java.io.Serializable;import java.util.Collection;import java.util.List;import java.util.Map;/* :` .:, :::,,. :: `:::::: ::` `,:,` .:` `:: `::::::::.:` `:’;,` ::::, .:::` `@++++++++: `` :::` @+++++++++++# :::, #++++++++++++++` ,: `::::::;’##++++++++++ .@#@;` ::::::::::::::::::::; #@####@, :::::::::::::::+#;::. @@######+@:::::::::::::. #@:; , @@########’:::::::::::: .#’’’:` ;##@@@+:##########@::::::::::: @#;.,:. #@@@######++++#####’::::::::: .##+,:#` @@@@@#####+++++’#####+::::::::` ,`::@#:` `@@@@#####++++++’#####+#’:::::::::::@. @@@@######+++++’’#######+##’;::::;’:,` @@@@#####+++++’’’#######++++++++++` #@@#####++++++’’########++++++++’ `#@######+++++’’+########+++++++; `@@#####+++++’’##########++++++, @@######+++++’##########+++++#` @@@@#####+++++############++++; ;#@@@@@####++++##############+++, @@@@@@@@@@@###@###############++’ @#@@@@@@@@@@@@###################+: `@#@@@@@@@@@@@@@@###################’` :@#@@@@@@@@@@@@@@@@@##################, ,@@@@@@@@@@@@@@@@@@@@################; ,#@@@@@@@@@@@@@@@@@@@##############+` .#@@@@@@@@@@@@@@@@@@#############@, @@@@@@@@@@@@@@@@@@@###########@, :#@@@@@@@@@@@@@@@@##########@, `##@@@@@@@@@@@@@@@########+, `+@@@@@@@@@@@@@@@#####@:` `:@@@@@@@@@@@@@@##@;. `,’@@@@##@@@+;,` ``...`` _ _ /_ _ _/_. ____ / _/ / //_//_//_|/ /_ /_///_/_ Talk is cheap. Show me the code. _/ / *//** * Mapper 繼承該接口后,無需編寫 mapper.xml 文件,即可獲得CRUD功能 * <p>這個 Mapper 支持 id 泛型</p> * * @author hubin * @since 2016-01-23 */public interface BaseMapper<T> extends Mapper<T> { /** * 插入一條記錄 * * @param entity 實體對象 */ int insert(T entity); /** * 根據 ID 刪除 * * @param id 主鍵ID */ int deleteById(Serializable id); /** * 根據 columnMap 條件,刪除記錄 * * @param columnMap 表字段 map 對象 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據 entity 條件,刪除記錄 * * @param wrapper 實體對象封裝操作類(可以為 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 刪除(根據ID 批量刪除) * * @param idList 主鍵ID列表(不能為 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 根據 ID 修改 * * @param entity 實體對象 */ int updateById(@Param(Constants.ENTITY) T entity); /** * 根據 whereEntity 條件,更新記錄 * * @param entity 實體對象 (set 條件值,可以為 null) * @param updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句) */ int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); /** * 根據 ID 查詢 * * @param id 主鍵ID */ T selectById(Serializable id); /** * 查詢(根據ID 批量查詢) * * @param idList 主鍵ID列表(不能為 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 查詢(根據 columnMap 條件) * * @param columnMap 表字段 map 對象 */ List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據 entity 條件,查詢一條記錄 * * @param queryWrapper 實體對象封裝操作類(可以為 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢總記錄數 * * @param queryWrapper 實體對象封裝操作類(可以為 null) */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 entity 條件,查詢全部記錄 * * @param queryWrapper 實體對象封裝操作類(可以為 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄 * * @param queryWrapper 實體對象封裝操作類(可以為 null) */ List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄 * <p>注意: 只返回第一個字段的值</p> * * @param queryWrapper 實體對象封裝操作類(可以為 null) */ List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 entity 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 實體對象封裝操作類(可以為 null) */ <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件 * @param queryWrapper 實體對象封裝操作類 */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);} Mybatis plus常用注解# @TableName:用于定義表名 @TableId:用于定義表的主鍵

value:用于定義主鍵字段名type:用于定義主鍵類型(主鍵策略 IdType)IdType.AUTO:主鍵自增,系統分配,不需要手動輸入IdType.NODE:未設置主鍵IdType.INPUT:需要自己輸入主鍵值IdType.ASSIGN_ID:系統分配ID,用于數值型數據(Long,對應mysql中的BIGINT類型)IdType.ASSIGN_UUID:系統分配uuid,用于字符串型數據TableField:用于定義表的非主鍵字段value:用于定義非主鍵字段名,用于別名匹配,假如java對象和數據庫屬性不一樣exist:用于指明是否為數據表的字段,true表示是,false為不是fill:用于指定字段填充策略,一般用于填充:創建時間、修改時間等字段FieldFill.DEFAULT:默認不填充FieldFill.INSERT:插入時填充FieldFill.UPDATE:更新時填充FieldFill.INSERT_UPDATE:插入、更新時填充QueryWrapper/LambdaQueryWrapper#可以封裝sql對象,包括where條件,order by排序

eq:等于ne:不等于gt:大于ge:大于等于lt:小于le:小于等于or:拼接orbetween:兩個值中間notBetween:不在兩個值中間like:模糊匹配notLike:不像likeLeft:左匹配likeRight:右邊匹配isNull:字段為空in:in查詢groupBy:分組orderByAsc:升序orderByDesc:降序having:having查詢分頁插件#配置類#

package com.ybchen.shopmanager.config;import com.baomidou.mybatisplus.annotation.DbType;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;/** * @Description:分頁插件配置 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Configurationpublic class MybatisPlusPageConfig { /** * 舊版本 */// @Bean// public PaginationInterceptor paginationInterceptor() {// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// return paginationInterceptor;// } /** * 新的分頁插件,一級和二級緩存遵循mybatis的規則 * 需要設置 MybatisConfiguration#useDeprecatedExecutor=false 避免緩存出現問題 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; }}

演示類

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

自定義xml的sql腳本

新建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接口的路徑--><mapper namespace='com.ybchen.shopmanager.mapper.BannerMapper'> <select resultType='com.ybchen.shopmanager.model.BannerDO'> select * from banner </select></mapper>

BannerMapper.java添加方法

package com.ybchen.shopmanager.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.ybchen.shopmanager.model.BannerDO;import java.util.List;/** * @Description:輪播圖Mapper * @Author:chenyanbin * @Date:2021/3/4 下午11:03 * @Versiion:1.0 */public interface BannerMapper extends BaseMapper<BannerDO> { List<BannerDO> getList();}

配置文件告訴mapper.xml路徑

application.properties

# 默認配置路徑mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

全局配置文件

注意config-location和configuration不能同時出現

修改配置文件

application.properties

#配置全局配置文件!!!!mybatis-plus.config-location = classpath:mybatis-config.xml

新建mybatis-config.xml

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE configuration PUBLIC '-//mybatis.org//DTD Config 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-config.dtd'><configuration> <settings> <!--控制臺輸出日志--> <setting name='logImpl' value='STDOUT_LOGGING'/> </settings></configuration>

測試

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

配置實體類別名

修改application.properties

# 配置實體類別名mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model

測試

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

mybatis plus下劃線轉駝峰

默認就是true

修改application.properties

# mybatis plus下劃線轉駝峰mybatis-plus.configuration.map-underscore-to-camel-case=true

配置全局默認主鍵類型

實體類上就不用加 @TableId(value='id',type=IdType.AUTO)

修改application.properties

# 配置全局默認主鍵規則mybatis-plus.global-config.db-config.id-type=auto

完整application.properties

# 端口號server.port=9999#===========數據庫相關=============spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring.datasource.username=rootspring.datasource.password=root# 配置mybatis plus打印sql日志#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# 默認配置路徑mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml#配置全局配置文件!!!!mybatis-plus.config-location = classpath:mybatis-config.xml# 配置實體類別名mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model# mybatis plus下劃線轉駝峰mybatis-plus.configuration.map-underscore-to-camel-case=true# 配置全局默認主鍵規則mybatis-plus.global-config.db-config.id-type=auto

樂觀鎖

大多是基于數據版本(Version)記錄機制實現。即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般通過為數據庫表增加一個“version”字段來實現。讀取數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據,庫表對應記錄的當前版本信息進行比較,如果提交的數據,版本號大于數據庫表當前的版本號,則予以更新,否則認為是過期數據。

實體類增加@version

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

增加樂觀鎖插件

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

package com.ybchen.shopmanager.config;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Description:分頁插件配置 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Configurationpublic class MybatisPlusPageConfig { /** * 舊版本 */// @Bean// public PaginationInterceptor paginationInterceptor() {// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// return paginationInterceptor;// } /** * 新的分頁插件,一級和二級緩存遵循mybatis的規則 * 需要設置 MybatisConfiguration#useDeprecatedExecutor=false 避免緩存出現問題 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); //分頁插件 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //樂觀鎖插件 mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; }}

使用

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

注意 樂觀鎖數據類型支持int、Integer、long、timestamp 僅支持updateById和update方法邏輯刪除

公司在設計規范中都加入了邏輯刪除的強制規定,運營人員可以分析和審查數據,也方便將數據沉淀下來用于商業分析。

數據量過多,也會采用數據倉庫,通過監聽應用數據庫的數據變化,進行遷移到數據倉庫。

方式一 數據庫增加deleted字段,0是未刪除,1表示刪除 實體類增加屬性配置@TableLogic 查詢的時候會自動拼接上deleted=0的檢索條件

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

方式二

修改application.properties

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

# 邏輯刪除,刪除是1mybatis-plus.global-config.db-config.logic-delete-value=1# 邏輯刪除,未刪除是0mybatis-plus.global-config.db-config.logic-not-delete-value=0# 如果java實體類沒加注解@TableLogic,則可以配置這個,推薦這里配置mybatis-plus.global-config.db-config.logic-delete-field=deleted

代碼生成器#添加依賴#

<!-- 代碼自動生成依賴 begin --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <!-- velocity --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <!-- 代碼自動生成依賴 end-->

生成器類#

package com.ybchen.shopmanager;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.config.DataSourceConfig;import com.baomidou.mybatisplus.generator.config.GlobalConfig;import com.baomidou.mybatisplus.generator.config.PackageConfig;import com.baomidou.mybatisplus.generator.config.StrategyConfig;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;/** * @Description:代碼生成器 * @Author:chenyanbin * @Date:2021/3/6 下午5:10 * @Versiion:1.0 */public class MyBatisPlusGenerator { public static void main(String[] args) { //1. 全局配置 GlobalConfig config = new GlobalConfig(); // 是否支持AR模式 config.setActiveRecord(true) // 作者 .setAuthor('chenyanbin') // 生成路徑,最好使用絕對路徑,window路徑是不一樣的 .setOutputDir('/Users/chenyanbin/IdeaProjects/shop-manager') // 文件覆蓋 .setFileOverride(true) // 主鍵策略 .setIdType(IdType.AUTO) .setDateType(DateType.ONLY_DATE) // 設置生成的service接口的名字的首字母是否為I,默認Service是以I開頭的 .setServiceName('%sService') //實體類結尾名稱 .setEntityName('%sDO') //生成基本的resultMap .setBaseResultMap(true) //不使用AR模式 .setActiveRecord(false) //生成基本的SQL片段 .setBaseColumnList(true); //2. 數據源配置 DataSourceConfig dsConfig = new DataSourceConfig(); // 設置數據庫類型 dsConfig.setDbType(DbType.MYSQL) .setDriverName('com.mysql.cj.jdbc.Driver') .setUrl('jdbc:mysql://127.0.0.1:3306/shop?useSSL=false') .setUsername('root') .setPassword('root'); //3. 策略配置globalConfiguration中 StrategyConfig stConfig = new StrategyConfig(); //全局大寫命名 stConfig.setCapitalMode(true) // 數據庫表映射到實體的命名策略 .setNaming(NamingStrategy.underline_to_camel) //使用lombok .setEntityLombokModel(true) //使用restcontroller注解 .setRestControllerStyle(true) // 生成的表, 支持多表一起生成,以數組形式填寫 .setInclude('product','banner','address','coupon','product_order'); //4. 包名策略配置 PackageConfig pkConfig = new PackageConfig(); pkConfig.setParent('net.mybatisplus') .setMapper('mapper') .setService('service') .setController('controller') .setEntity('model') .setXml('mapper'); //5. 整合配置 AutoGenerator ag = new AutoGenerator(); ag.setGlobalConfig(config) .setDataSource(dsConfig) .setStrategy(stConfig) .setPackageInfo(pkConfig); //6. 執行操作 ag.execute(); System.out.println('======= 代碼生成完畢 ========'); }}

使用#

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合Swagger 3.x添加依賴

<!--springBoot整合swagger3.0--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>

修改application.properties

添加如下信息

spring.application.name=shop-manager# ===== 自定義swagger配置 ===== #swagger.enable=trueswagger.application-name= ${spring.application.name}swagger.application-version=1.0swagger.application-description=shop api

配置類

package com.ybchen.shopmanager.config;import io.swagger.annotations.ApiOperation;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.oas.annotations.EnableOpenApi;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;/** * @Description:swagger配置類 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Component@Data@ConfigurationProperties('swagger')@EnableOpenApipublic class SwaggerConfiguration { /** * 是否開啟swagger,生產環境一般關閉,所以這里定義一個變量 */ private Boolean enable; /** * 項目應用名 */ private String applicationName; /** * 項目版本信息 */ private String applicationVersion; /** * 項目描述信息 */ private String applicationDescription; @Bean public Docket docket(){ return new Docket(DocumentationType.OAS_30) .pathMapping('/') // 定義是否開啟swagger,false為關閉,可以通過變量控制,線上關閉 .enable(enable) //配置api文檔元信息 .apiInfo(apiInfo()) // 選擇哪些接口作為swagger的doc發布 .select() //apis() 控制哪些接口暴露給swagger, // RequestHandlerSelectors.any() 所有都暴露 // RequestHandlerSelectors.basePackage('net.ybchen.*') 指定包位置 // withMethodAnnotation(ApiOperation.class)標記有這個注解 ApiOperation .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(applicationName) .description(applicationDescription) .contact(new Contact('陳彥斌', 'https://www.cnblogs.com/chenyanbin/', '543210188@qq.com')) .version(applicationVersion) .build(); }}

啟動測試

訪問地址:http://localhost:9999/swagger-ui/index.html

注意:如果訪問不成功,看是否攔截器攔截了相關資源!!!!!

SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI

常用注解

@Api

用在controller類,描述API接口

@Api(tags = '用戶模塊',value = '用戶UserController') public class UserController { }

@ApiOperation#

接口配置,用在方法上,描述接口方法

@ApiOperation('分頁用戶列表') @GetMapping('list') public JsonData list(){​ return JsonData.buildSuccess(); }

@ApiParam#

方法參數配置,用在入參上面,描述參數

@ApiOperation('用戶登錄') @PostMapping('login') public JsonData login( @ApiParam(name = 'phone', value = '手機號',example = '13888888888') @RequestParam('phone') String phone,​ @ApiParam(name = 'pwd', value = '密碼',example = '123456') @RequestParam('pwd')String pwd){​ return JsonData.buildSuccess(); }

@Apilgnore#忽略此接口不生成文檔

@ApiIgnore @ApiOperation('刪除用戶') @DeleteMapping('/delete/{id}') public JsonData deleteById(@PathVariable int id) { return JsonData.buildSuccess(); }

@ApiModel#用于類,表示對類進行說明,用于參數,用實體類接收@ApiModelProperty#用于方法,字段;表示對model屬性的說明或者數據操作更改value:字段說明name:重寫屬性名稱dataType:重寫屬性類型required:是否必填example:舉例說明hidden:隱藏@Data@ApiModel('用戶基本信息')

public class SaveUserRequest {​ private int age;​ private String pwd;​ @ApiModelProperty(value ='【必填】郵箱',required = true) private String email;​ @ApiModelProperty('【必填】手機號') private String phone;​ @ApiModelProperty(value='創建時間') private Date createTime;​}

@ApiResponse#描述接口響應

@ApiOperation('用戶登錄') @PostMapping('login') @ApiResponses({ @ApiResponse(responseCode = CodeStatus.SUCCESS, description = '保存成功'), @ApiResponse(responseCode = CodeStatus.FAIL, description = '保存失敗') }) public JsonData login( @ApiParam(name = 'phone', value = '手機號',example = '13888888888') @RequestParam('phone') String phone,​ @ApiParam(name = 'pwd', value = '密碼',example = '123456') @RequestParam('pwd')String pwd){​ return JsonData.buildSuccess(); }

項目源碼下載

鏈接: https://pan.baidu.com/s/1OaOG0xK6jl8zDweAMkggAQ 提取碼: ed54

到此這篇關于SpringBoot 開發提速神器 Lombok+MybatisPlus+SwaggerUI的文章就介紹到這了,更多相關SpringBoot Lombok+MybatisPlus+SwaggerUI內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 久久成人国产精品 | 久草天堂| 久久在线 | 午夜精品久久久久久久久 | 天堂资源最新在线 | 99综合 | 两性午夜视频 | 日本免费一区二区三区 | 国产女爽爽视频精品免费 | 国产艳妇av视国产精选av一区 | 美日韩一区二区三区 | 在线视频一区二区三区 | 国产精品99 | 91视频免费播放 | 亚洲精品欧美 | 久久久久久久免费 | www.天天草 | 97在线免费视频 | 日韩高清在线播放 | 亚洲一区 中文字幕 | 国产精品揄拍一区二区久久国内亚洲精 | 九九热精品视频在线观看 | 国产美女福利在线 | 一区二区欧美在线 | 日韩高清国产一区在线 | 日日摸天天做天天添天天欢 | 亚洲高清免费视频 | 99成人| 欧美久久久久久 | 一区二区三区国产视频 | 日韩精品久久 | 午夜视频一区二区三区 | 久久久久久黄 | 黄色一级视屏 | 精品亚洲一区二区三区 | 久久精品国产99国产精品 | 国产高清视频在线 | 欧美精品一级二级 | 日韩精品一区二区三区第95 | 欧洲精品视频在线观看 | 自拍偷拍视频网站 | 另类天堂| 美女视频黄色 | 9uu在线观看| 亚洲视频在线一区 | av在线一区二区三区 | 色av一区| 日韩在线成人av | 97成人在线视频 | 成全视频免费观看在线看黑人 | 久久久美女 | 九九九色 | 台湾佬亚洲色图 | 亚洲综合精品视频 | 日本成人午夜影院 | 日韩成人在线一区 | 一区中文字幕 | 韩国xxxx性hd极品 | 黄色a视频 | 国产成人精品a视频一区www | 国产精品免费观看 | 成人av免费在线 | 激情久久久 | 国产在线91 | 国产视频第一页 | 亚洲精品久久久久久下一站 | 一区二区三区在线 | 日本在线视频不卡 | 一区二区三区免费在线观看 | 一级片在线观看 | 成人精品网站在线观看 | 久久免费视频观看 | 国产精品久久久久国产精品 | 亚洲国产91 | 亚洲欧美日韩精品久久亚洲区 | 精品国产一区二区三区性色av | 亚洲免费视频网 | 午夜精品久久久久久久男人的天堂 | 国产超碰人人爽人人做人人爱 | 国产精品日本一区二区不卡视频 | 二区三区 | 国产日本韩国在线 | 欧美一区二区三区在线视频 | 亚洲成人一区 | www.国产精品| 色婷婷在线视频 | 欧美日韩精品一区二区三区蜜桃 | 91久久久久久久久久久久久久 | 91在线免费观看 | 日本三级中国三级99人妇网站 | 精品中文在线 | 国产精品福利久久 | 毛片站 | 黄色资源在线观看 | 久久成人免费 | 日本好好热视频 | 精品国产乱码一区二区三区 | av免费网站 | 国产精品一二 | 欧美亚洲国产一区二区三区 | a级性生活 | 日韩一区二区观看 | 黄色一级在线播放 | 日韩欧美视频 | 亚洲日本中文 | 日本不卡免费新一二三区 | 在线看亚洲 | 精品久久久久久亚洲精品 | 91精品国产综合久久国产大片 | 国产性猛交xxxx免费看久久 | 欧美一区二区三区免费在线观看 | 在线视频亚洲 | 久久精品免费观看视频 | 精品国产精品三级精品av网址 | 久久免费精品 | 自拍偷拍专区 | 91在线看| 成人日韩 | 天堂精品久久 | 亚洲电影一区二区三区 | 欧美午夜三级视频 | 亚洲一区二区三区免费 | 欧美精品日韩 | 黄色大片视频网站 | 在线精品自拍 | 国产91在线播放精品91 | 国产免费看 | 在线手机电影 | 99爱免费观看国语 | 能直接看的av网站 | 精品日韩一区二区三区 | 欧美精品区 | 精品欧美一区二区在线观看 | 欧美一级毛片久久99精品蜜桃 | 成人精品视频在线观看 | 狠狠操中文字幕 | 蜜桃av一区二区三区 | 一区二区三区国产亚洲网站 | 久久国产欧美一区二区三区精品 | 午夜视频在线观看网址 | 嫩草影院在线观看91麻豆 | 日韩理论在线 | 亚洲成av人乱码色午夜 | 国产一级片 | 欧美一级做性受免费大片免费 | 亚洲精品成人久久久 | av大片 | 中文字幕成人 | 欧美精品一区在线发布 | 欧美性大战久久久久久久蜜臀 | 国产激情在线观看 | 亚洲成人在线网站 | 91亚洲成人| 久久国产精品免费一区二区三区 | 在线天堂av | 欧美一区二区三区精品免费 | 久久久久久国产精品高清 | 国产伦精品一区二区 | 一区二区免费播放 | 久久精品久久久久电影 | 91亚洲日本aⅴ精品一区二区 | 精品一区二区久久久久久久网站 | 在线中文字幕av | 污视频在线观看免费 | 久久香蕉国产 | 免费福利视频一区二区三区 | 精品国产乱码久久久久久1区2区 | 成人在线免费 | 国产污视频在线 | 成人亚洲 | 欧美盗摄| 精品国产一区二区三区久久影院 | 国产99久久久精品视频 | 色播久久| 日本成人中文字幕 | 污视频免费网站观看 | 久久天堂网 | 欧美国产高清 | 亚洲97| 伊人激情av一区二区三区 | 91网址| 操皮视频 | 久久久久久久久99精品 | 欧美午夜视频在线观看 | 免费欧美一级 | 香蕉大人久久国产成人av | 成人情趣视频 | 黄色国产视频 | 性高湖久久久久久久久aaaaa | t66y最新地址一地址二69 | 亚洲久视频| 91av爱爱| 在线观看免费视频91 | 午夜影院毛片 | 神马久久精品 | 亚洲在线播放 | 国产精品久久二区 | 日韩精品一91爱爱 | 中国一级免费毛片 | 亚洲www永久成人夜色 | 91视频原创 | 欧美成人h版在线观看 | 99九九久久 | 一区二区三区回区在观看免费视频 | 日韩免费在线观看视频 | 成人片免费看 | 精品伊人 | 97超碰人人 | 天天天干夜夜夜操 | 91午夜精品 | 综合伊人久久 | 91久久九色| 国产精品爱久久久久久久 | 91亚洲日本aⅴ精品一区二区 | 国产无区一区二区三麻豆 | 免费久久网站 | 亚洲视频中文字幕 | 日日搞夜夜操 | 精品亚洲国产成av人片传媒 | 国产三区在线视频 | 国产九九九 | 奇米色777欧美一区二区 | 日韩一区二区在线观看 | 99精品欧美一区二区三区综合在线 | 国产在线一区二区三区 | 天天噜天天干 | 吴梦梦到粉丝家实战华中在线观看 | 色综合天天综合网国产成人网 | 美女一区二区三区在线观看 | 91中文在线观看 | 日韩欧美二区 | 欧美三级电影在线播放 | av中文字幕在线播放 | 精品视频在线播放 | 国产精品成人一区二区 | 欧美日韩一区二区中文字幕 | 狠狠爱天天操 | 99久久精品国产毛片 | 中文字幕亚洲二区 | 在线精品日韩 | 欧美1区 | 国产亚洲综合精品 | 久草综合网 | 国产精品日韩精品 | www.一区| a级在线 | 亚洲精品乱码久久久久久9色 | 欧美激情网站 | 亚洲三区视频 | 日本激情视频一区二区三区 | 91在线免费看 | 激情com| 精品在线看 | 日本久久二区 | 骚黄视频 | 91文字幕巨乱亚洲香蕉 | 91久久久久久久久久久久久久久久 | 91精品国产99久久久久久红楼 | 国产免费一区 | 波多野结衣在线网址 | 欧美三区视频 | 亚洲欧美一区二区三区四区 | 在线免费观看日韩视频 | 99精品欧美一区二区三区综合在线 | 偷拍自拍亚洲欧美 | 日韩a视频 | 欧美国产一区二区 | 日韩一区二区三区精品 | av三级在线观看 | 最新日韩av | 狠狠操综合网 | 久久久久亚洲精品 | 国产在线不卡一区 | 国产av毛片 | 久久com| 精品国产一区二区三区久久久蜜臀 | 日本黄色大片免费 | 91网站在线看 | 91大神xh98hx在线播放 | 久久精品性 | 欧美一级黄色影院 | 热久久久久 | 国产高清视频在线观看 | 久久亚洲一区二区三区四区 | 欧美黑人做爰xxxⅹ 国产精品一区二区视频 | 色优久久 | 狠狠艹视频 | 伊人激情网| 中文在线a在线 | 中文字幕久久精品 | 在线日韩| 精品久久久久久国产 | 国产日韩视频在线观看 | 韩国成人精品a∨在线观看 国产伊人av | 久久亚洲一区二区 | 亚洲精品一区二区在线观看 | 中文字幕一区二区三区四区 | 亚洲精品久久久久久下一站 | 日本精品免费在线观看 | 欧美日韩黄色一区二区 | 三级av | 99福利视频| 中文字幕高清一区 | 91精品久久久久久久久久久 | 91精品视频在线播放 | 福利网站在线观看 | 日韩欧美一级二级 | 亚洲欧美日韩在线一区 | 午夜影院在线观看版 | 99久久99热这里只有精品 | 国产精品18久久久久久久久久久久 | 国内自拍第一页 | 欧美性一区二区三区 | 午夜精品久久久久久久久久久久 | 久久色av | а_天堂中文最新版地址 | 曰批视频在线观看 | 超碰最新在线 | 亚洲第一视频网站 | 可以免费看黄的网站 | 日韩免费一区 | 少妇久久久 | 香蕉久久一区二区不卡无毒影院 | 亚洲一区二区三区观看 | 国产一级特黄毛片在线毛片 | 成人激情视频免费观看 | 一区二区三区免费在线观看 | 日韩精品一区二区三区 | 日韩色在线 | 91中文字幕在线观看 | 在线观看成人 | 久久女人网 | 毛片av片 | 日本成人黄色网址 | 日韩www| 午夜一级黄色片 | 久久久久久极品 | 狠狠狠 | 一区二区三区 在线 | 99久久精品免费看国产免费软件 | 夜夜爽99久久国产综合精品女不卡 | 中文字幕在线免费播放 | v亚洲| 毛片在线免费播放 | 一区二区三区国产好 | 免费在线观看一区二区 | 亚洲精品视频在线播放 | 中文字幕一区在线 | 日本三级中国三级99人妇网站 | 日韩成人免费 | 久草网站 | 亚洲一区二区三区视频免费观看 | 日韩一区二区福利 | 亚洲中午字幕在线观看 | 欧美精品一区二区三区四区五区 | 久久综合成人精品亚洲另类欧美 | 四季久久免费一区二区三区四区 | 波多野结衣一区二区三区中文字幕 | 久久不射电影网 | 欧美在线播放一区 | 欧美在线高清 | 国产亚洲一区二区三区在线观看 | 久草福利在线视频 | 欧洲精品视频一区 | 成人精品久久久 | 依人久久 | 亚洲va欧美va天堂v国产综合 | 国产图区 | 精品视频 | 日韩a| 欧美精品一区二区三区在线 | 亚洲国产精品一区 | 精品国产不卡一区二区三区 | 日本一区二区三区四区视频 | 精品久久久一区二区 | 欧美一级在线观看 | 亚洲精品乱码久久久久久蜜桃图片 | 久久中文视频 | 亚洲免费色 | 国产精品久久久久久吹潮 | 欧美一级黄色片免费看 | 国产一区二区精品在线观看 | 我和我的祖国电影在线观看免费版高清 | 日韩三级视频 | 亚洲精品国品乱码久久久久 | 国产成人在线视频 | 亚洲夜幕久久日韩精品一区 | 精品日韩欧美一区二区三区在线播放 | av中文字幕在线播放 | 精品久久久久久久久久久久包黑料 | 97精品国产97久久久久久免费 | 一区二区三区高清 | 最新高清无码专区 | 天天综合欧美 | 欧美日韩亚洲国产综合 | 国产美女高潮一区二区三区 | 在线99热 | 国产成人免费视频网站视频社区 | 日韩在线中文字幕视频 | 精品久久久久久久久久久 | 久久这里只有精品首页 | 久久久久亚洲一区二区三区 | 91久久精品一区二区二区 | 亚洲欧美一区二区三区在线 | 一区二区精品视频 | 国产成人在线免费观看视频 | 麻豆精品一区二区 | 一区二区不卡视频在线观看 | av黄在线观看 | 欧美一级爆毛片 | 亚洲午夜在线 | 久久这里只有国产精品 | 91精品久久久久 | 久久免费视频在线 | 久久国| 国产精品二区一区二区aⅴ污介绍 | 成人久久18免费观看 | 九草在线| 狠狠爱天天操 | 日本在线观看 | 日韩精品一区二 | 精品视频三区 | a级毛片免费高清视频 | 欧美一区二区在线 | 精品www| 久久国产视频一区二区 | 国产三级黄色毛片 | 亚洲国产精品va在线看黑人 | 成人欧美一区二区三区在线播放 | 亚洲欧美电影 | 成人av免费在线观看 | 一区视频在线 | 成人影院av | 中文字幕在线观看精品视频 | 狠狠干狠狠操 | 一级黄色毛片子 | www.久久.com| 天天操天天干视频 | a免费视频| 久久tv在线观看 | 亚洲第一av | 成人精品网 | 国产福利一区二区 | 日韩精品一区在线视频 | 欧美精品亚洲精品 | 男人的天堂久久精品 | 狠狠搞狠狠干 | av不卡电影在线观看 | 日本一区二区三区四区 | 欧美高清成人 | 一区二区视频在线 | 国产欧美一二三区在线粉嫩 | 亚洲成人精品在线 | 亚洲综合精品 | 日韩五码 | 中文字幕亚洲视频 | 琪琪午夜伦伦电影福利片 | 美女h视频 | 在线播放亚洲 | 亚洲情网站| 最新国产在线 | 91亚洲成人 | 亚洲tv久久爽久久爽 | 国产欧美精品区一区二区三区 | 亚洲欧美一区二区三区在线 | 日本视频一区二区三区 | 亚洲欧美另类在线 | 精品国产一区二区三区成人影院 | 成人毛片视频免费 | 91国内外精品自在线播放 | 天天艹夜夜艹 | 国产成人自拍一区 | 亚洲精品久久久久久久久久久久久 | 亚洲精品电影在线一区 | av在线天堂 | 精品国产99| 爱爱视频网站 | 亚洲成人在线视频播放 | 中文字幕在线一区 | 亚洲国产成人一区二区精品区 | 色综合久久天天综合网 | 国产一区二区亚洲 | 中文字幕亚洲一区二区三区 | 亚洲精品中文字幕在线观看 | 韩国三级中文字幕hd久久精品 | 免费一级欧美在线观看视频 | 毛片一区二区 | 日韩一区二区三区在线 | 日本一区二区三区在线视频 | 日韩精品一 | 一级黄色影视 | 亚洲综合二区 | 色欧美片视频在线观看 | 99热最新网站 | 日韩一区二 | 夜夜视频 | 特级淫片女子高清视频在线观看 | 国产婷婷精品 | 午夜国产一级片 | www.99热这里只有精品 | 精品久久久久久久久久久久久久久久久久 | 久久久男人天堂 | 欧美精品一区视频 | 欧美一区二区三区精品 | 在线观看免费的网站www | 亚洲成人网络 | 一区二区三区国产 | 无码少妇一区二区三区 | 国产精品九九九 | 美女久久 | 国产精品成人一区二区三区夜夜夜 | 美女黄视频网站 | 污视频在线观看免费 | 综合一区| 国产不卡一二三区 | 一级片在线观看 | 欧美成人一区二区 | 成人精品一区二区三区中文字幕 | 久久国产亚洲 | 国产午夜精品一区二区三区 | 蜜桃一区二区 | 国产在线不卡一区 | 久一久久 | 久久爱综合 | 国产一区二区三区在线视频 | 亚洲欧美一区二区三区在线 | 91精品啪aⅴ在线观看国产 | 91精品国产色综合久久不卡98口 | 岛国精品| 亚洲精品一区二区网址 | 激情开心成人网 | 欧美一级黄带 | 成人在线观看av | 午夜免费影院 | 国产在线看h | 国产免费黄视频 | 国产精品二区三区 | 国产中文视频 | 日本一区二区视频 | 久久99国产精品 | 白浆在线 | 国产精品免费在线 | 成人免费一区二区三区视频网站 | 欧美日韩亚洲在线 | 日韩成人影院 | 玖玖玖精品视频 | 国产欧美精品一区二区 | 国产美女在线播放 | 亚洲码欧美码一区二区三区 | 欧美日韩成人在线视频 | 色吊丝在线| 国产一区影院 | 成人 在线 | 国内精品久久久久久影视8 91一区二区在线观看 | 中文字幕高清视频 | 久久久久久久 | 在线看片福利 | 国产一级黄色大片 | www久久久| 看亚洲a级一级毛片 | 国产黄色在线观看 | 精品久 | 久久久久久亚洲 | 四虎影视网址 | 国产欧美在线一区二区 | 欧美乱淫 | 精品日韩av | 日日夜夜精品免费视频 | 国产激情视频 | 欧美日韩精品一区 | 国产午夜久久久久 | 99爱免费视频 | 欧美激情五月 | 久草在线在线精品观看 | 久久久久国产 | 亚洲精品一区二三区不卡 | 欧美精品色网 | 国产探花| 国产精品jizz在线观看麻豆 | 国产日韩欧美激情 | 日韩欧美国产成人一区二区 | 欧美性大战久久久久久久蜜臀 | 亚洲www视频 | 国产区视频在线观看 | 久久久精品国产 | 亚洲一区中文 | 国产精品1区2区3区 欧美 中文字幕 | 久久午夜影院 | 久久久久久免费免费 | 美国特级a毛片免费网站 | 国产视频一区二区 | 亚洲国产精品一区二区第一页 | 黑人一级片视频 | 国产精品亚洲视频 | 欧美日韩在线不卡 | 亚洲每日更新 | 日韩色图在线观看 | 国产精品久久久久久久久久久免费看 | 欧美一区在线视频 | 久久久久久久久久久久99 | 亚洲成人av电影 | 精品一区二区av | 午夜免费av | 欧美日韩国产综合网 | 欧美在线视频一区 | 银杏成人影院在线观看 | 亚洲精品一区二区三区99 | 综合网亚洲 | 一区二区免费在线播放 | 33eee在线视频免费观看 | 夜夜av| 国产精品乱码一二三区的特点 | 一级在线播放 | 免费毛片a线观看 | 精品久久精品久久 |