黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

瀏覽:64日期:2023-03-22 08:22:17
導(dǎo)讀 Lombok:可以讓你的POJO代碼特別簡(jiǎn)潔,不止簡(jiǎn)單在BO/VO/DTO/DO等大量使用,還有設(shè)計(jì)模式,對(duì)象對(duì)比等 MybatisPlus:增加版Mybatis,基礎(chǔ)的數(shù)據(jù)庫(kù)CRUD、分頁(yè)等可以直接生成使用,避免了大量的重復(fù)低效代碼,還有數(shù)據(jù)庫(kù)自動(dòng)Java類(lèi),sql文件等等,比傳統(tǒng)的更賤簡(jiǎn)介易用 SwaggerUI:接口文檔自動(dòng)生成,對(duì)接前端和測(cè)試更加方便,基于業(yè)界的OpennApi規(guī)范,采用Swagger3.x版本。

技術(shù)棧

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

在線(xiàn)構(gòu)建項(xiàng)目

點(diǎn)我直達(dá)

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

什么是lombok

官網(wǎng)

點(diǎn)我直達(dá)

一個(gè)優(yōu)秀的Java代碼庫(kù),簡(jiǎn)化了Java的編碼,為Java代碼的精簡(jiǎn)提供了一種方式

添加依賴(lài)

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

mvn compile

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開(kāi)發(fā)提速神器 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; //只會(huì)去生成get final String name = 'alex'; String phone; //靜態(tài)成員變量不會(huì)生成set/get方法 static final String pwd = '123';}

@NonNull

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

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@NoArgsContructor

生成無(wú)參構(gòu)造器

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@AllArgsConstructor

生成全參構(gòu)造器

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@RequiredArgsConstructor

指定參數(shù)的構(gòu)造函數(shù),有以下的特征的字段

final類(lèi)型未被初始化的屬性,標(biāo)記了@NonNull的屬性 注意:@NoArgsConstructor不能添加

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@ToStringList或者其他集合調(diào)試不方便控制臺(tái)或者日志輸出對(duì)象,默認(rèn)打印的是內(nèi)存地址作用于類(lèi),覆蓋默認(rèn)的toString()方法

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

不包括某個(gè)字段

@ToString(exclude={'age'})

只輸出某個(gè)字段

@ToString(of={'name'})

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

為什么對(duì)象要重寫(xiě)hashcode和equal方法

HashCode方法

頂級(jí)類(lèi)Object里面的方法,所有類(lèi)都是繼承Object的,返回值Int類(lèi)型 根據(jù)一定的hash規(guī)則(存儲(chǔ)地址,字段,或者長(zhǎng)度等),映射成一個(gè)數(shù)值,即散列值

Equals方法

頂級(jí)類(lèi)Object里面的方法,所有類(lèi)都是繼承Object的,返回值boolean類(lèi)型 根據(jù)自定義的匹配規(guī)則,用于匹配兩個(gè)對(duì)象是否一樣,一般邏輯如下

1、判斷地址是否一樣2、非空判斷和class類(lèi)型判斷3、強(qiáng)轉(zhuǎn)4、對(duì)象里面的字段一一匹配

解析

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

應(yīng)用場(chǎng)景

當(dāng)向集合中插入對(duì)象時(shí),如何判別在集合中是否已經(jīng)存在該對(duì)象,比如Set確保存儲(chǔ)對(duì)象的唯一值,并判斷是否同一個(gè)對(duì)象呢?

依據(jù)hashCode和equals進(jìn)行判斷所以Set存儲(chǔ)的對(duì)象必須重寫(xiě)這兩個(gè)方法,判斷兩個(gè)對(duì)象是否一樣首先判斷插入對(duì)象的hashCode值是否存在,hashCode值不存在則直接插入集合;值存在則還需要判斷equals方法判斷對(duì)象是否相等

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@EqualsAndHashCode

作用于類(lèi),覆蓋默認(rèn)的equals和hashCode,作用于全部屬性

不包含某個(gè)屬性

@EqualsAndHashCode(exclude={'id'})

只輸出某個(gè)屬性

@EqualsAndHashCode(of={'id'})

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@Data

作用于類(lèi)上,是以下注解的集合

@ToString

@EqualsAndHashCode

@Getter

@Setter

@RequiredArgsConstructor

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@Builder場(chǎng)景:當(dāng)一個(gè)bean類(lèi)重載了多個(gè)構(gòu)造方法時(shí),并且參數(shù)隨機(jī)使用時(shí),考慮使用構(gòu)造者模式

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

@Lof/@Slf4j作用于類(lèi)上,生成日志變量,用于記錄日志

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

MybatisPlus介紹 官網(wǎng):點(diǎn)我直達(dá) 是一個(gè)mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做強(qiáng)增不做改變,為簡(jiǎn)化開(kāi)發(fā),提高效率

數(shù)據(jù)庫(kù)腳本

/* 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 ’用戶(hù)id’, `default_status` int(1) DEFAULT NULL COMMENT ’是否默認(rèn)收貨地址:0->否;1->是’, `receive_name` varchar(64) DEFAULT NULL COMMENT ’收發(fā)貨人姓名’, `phone` varchar(64) DEFAULT NULL COMMENT ’收貨人電話(huà)’, `province` varchar(64) DEFAULT NULL COMMENT ’省/直轄市’, `city` varchar(64) DEFAULT NULL COMMENT ’市’, `region` varchar(64) DEFAULT NULL COMMENT ’區(qū)’, `detail_address` varchar(200) DEFAULT NULL COMMENT ’詳細(xì)地址’, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’電商-公司收發(fā)貨地址表’;-- ------------------------------ 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 ’跳轉(zhuǎn)地址’, `weight` int(11) DEFAULT NULL COMMENT ’權(quán)重’, `version` int(11) DEFAULT ’1’, `deleted` int(11) DEFAULT ’0’ COMMENT ’0是未刪除,1是已經(jīng)刪除’, 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 ’優(yōu)惠卷類(lèi)型[NEW_USER注冊(cè)贈(zèng)券,TASK任務(wù)卷,PROMOTION促銷(xiāo)??’, `publish` varchar(11) DEFAULT NULL COMMENT ’發(fā)布狀態(tài), PUBLISH發(fā)布,DRAFT草稿,OFFLINE下線(xiàn)’, `coupon_img` varchar(524) DEFAULT NULL COMMENT ’優(yōu)惠券圖片’, `coupon_title` varchar(128) DEFAULT NULL COMMENT ’優(yōu)惠券標(biāo)題’, `price` decimal(16,2) DEFAULT NULL COMMENT ’抵扣價(jià)格’, `user_limit` int(11) DEFAULT NULL COMMENT ’每人限制張數(shù)’, `start_time` datetime DEFAULT NULL COMMENT ’優(yōu)惠券開(kāi)始有效時(shí)間’, `end_time` datetime DEFAULT NULL COMMENT ’優(yōu)惠券失效時(shí)間’, `publish_count` int(11) DEFAULT NULL COMMENT ’優(yōu)惠券總量’, `stock` int(11) DEFAULT ’0’ COMMENT ’庫(kù)存’, `add_one` int(11) DEFAULT NULL COMMENT ’是否疊加0是不行,1是可以’, `create_time` datetime DEFAULT NULL, `condition_price` decimal(16,2) DEFAULT NULL COMMENT ’滿(mǎn)多少才可以使用’, 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 ’標(biāo)題’, `cover_img` varchar(128) DEFAULT NULL COMMENT ’封面圖’, `detail` varchar(256) DEFAULT ’’ COMMENT ’詳情’, `old_price` decimal(16,2) DEFAULT NULL COMMENT ’老價(jià)格’, `price` decimal(16,2) DEFAULT NULL COMMENT ’新價(jià)格’, `stock` int(11) DEFAULT NULL COMMENT ’庫(kù)存’, `create_time` datetime DEFAULT NULL COMMENT ’創(chuàng)建時(shí)間’, `lock_stock` int(11) DEFAULT ’0’ COMMENT ’鎖定庫(kù)存’, 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 ’訂單唯一標(biāo)識(shí)’, `state` varchar(11) DEFAULT NULL COMMENT ’NEW 未支付訂單,PAY已經(jīng)支付訂單,CANCEL超時(shí)取消訂單’, `create_time` datetime DEFAULT NULL COMMENT ’訂單生成時(shí)間’, `total_fee` decimal(16,2) DEFAULT NULL COMMENT ’訂單總金額’, `pay_fee` decimal(16,2) DEFAULT NULL COMMENT ’訂單實(shí)際支付價(jià)格’, `pay_type` varchar(64) DEFAULT NULL COMMENT ’支付類(lèi)型,微信-銀行-支付寶’, `nickname` varchar(64) DEFAULT NULL COMMENT ’昵稱(chēng)’, `head_img` varchar(524) DEFAULT NULL COMMENT ’頭像’, `user_id` int(11) DEFAULT NULL COMMENT ’用戶(hù)id’, `del` int(5) DEFAULT ’0’ COMMENT ’0表示未刪除,1表示已經(jīng)刪除’, `update_time` datetime DEFAULT NULL COMMENT ’更新時(shí)間’, `order_type` varchar(32) DEFAULT NULL COMMENT ’訂單類(lèi)型 DAILY普通單,PROMOTION促銷(xiāo)訂單’, `receiver_address` varchar(1024) DEFAULT NULL COMMENT ’收貨地址 json存儲(chǔ)’, 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 ’訂單號(hào)’, `out_trade_no` varchar(32) DEFAULT NULL, `product_id` bigint(11) DEFAULT NULL COMMENT ’產(chǎn)品id’, `product_name` varchar(128) DEFAULT NULL COMMENT ’商品名稱(chēng)’, `product_img` varchar(524) DEFAULT NULL COMMENT ’商品圖片’, `buy_num` int(11) DEFAULT NULL COMMENT ’購(gòu)買(mǎi)數(shù)量’, `create_time` datetime DEFAULT NULL, `total_fee` decimal(16,2) DEFAULT NULL COMMENT ’購(gòu)物項(xiàng)商品總價(jià)格’, `pay_fee` decimal(16,0) DEFAULT NULL COMMENT ’購(gòu)物項(xiàng)商品支付總價(jià)格’, 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 ’昵稱(chēng)’, `pwd` varchar(124) DEFAULT NULL COMMENT ’密碼’, `head_img` varchar(524) DEFAULT NULL COMMENT ’頭像’, `slogan` varchar(524) DEFAULT NULL COMMENT ’用戶(hù)簽名’, `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 ’鹽,用于個(gè)人敏感信息處理’, 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,說(shuō)明它是在編譯階段生效,不需要打入包中,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> <!-- 代碼庫(kù) --> <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

# 端口號(hào)server.port=9999#===========數(shù)據(jù)庫(kù)相關(guān)=============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掃描路徑

啟動(dòng)類(lèi)上添加:@MapperScan('Mapper全包路徑')

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合MybatisPlus

統(tǒng)一接口返回協(xié)議

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 { /** * 狀態(tài)碼 0 表示成功,1 表示處理中,-1表示失敗 */ private Integer code; /** * 數(shù)據(jù) */ private Object data; /** * 描述信息 */ private String msg; /** * 成功,無(wú)傳入數(shù)據(jù) * * @return */ public static JsonData buildSuccess() { return new JsonData(0, null, null); } /** * 成功,有傳入數(shù)據(jù) * * @param data 數(shù)據(jù) * @return */ public static JsonData buildSuccess(Object data) { return new JsonData(0, data, null); } /** * 失敗,有返回錯(cuò)誤信息 * * @param msg 描述信息 * @return */ public static JsonData buildError(String msg) { return new JsonData(-1, null, msg); } /** * 失敗,有狀態(tài)碼,描述信息 * * @param code 狀態(tài)碼 * @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; }}

實(shí)體類(lèi)

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//數(shù)據(jù)庫(kù)表名@TableName('banner')public class BannerDO { /** * 主鍵 */ private Integer id; /** * 圖片 */ private String img; /** * url跳轉(zhuǎn)地址 */ private String url; /** * 權(quán)重 */ private Integer weight; /** * 版本號(hào) */ private Integer version; /** * 0是未刪除,1是已經(jīng)刪除 */ 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()); }}

測(cè)試

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

單元測(cè)試+控制臺(tái)打印sql

單元測(cè)試

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=啟動(dòng)類(lèi).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

測(cè)試

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

BaseMapperMapper

繼承該接口后,無(wú)需編寫(xiě)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 繼承該接口后,無(wú)需編寫(xiě) mapper.xml 文件,即可獲得CRUD功能 * <p>這個(gè) Mapper 支持 id 泛型</p> * * @author hubin * @since 2016-01-23 */public interface BaseMapper<T> extends Mapper<T> { /** * 插入一條記錄 * * @param entity 實(shí)體對(duì)象 */ int insert(T entity); /** * 根據(jù) ID 刪除 * * @param id 主鍵ID */ int deleteById(Serializable id); /** * 根據(jù) columnMap 條件,刪除記錄 * * @param columnMap 表字段 map 對(duì)象 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據(jù) entity 條件,刪除記錄 * * @param wrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 刪除(根據(jù)ID 批量刪除) * * @param idList 主鍵ID列表(不能為 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 根據(jù) ID 修改 * * @param entity 實(shí)體對(duì)象 */ int updateById(@Param(Constants.ENTITY) T entity); /** * 根據(jù) whereEntity 條件,更新記錄 * * @param entity 實(shí)體對(duì)象 (set 條件值,可以為 null) * @param updateWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null,里面的 entity 用于生成 where 語(yǔ)句) */ int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); /** * 根據(jù) ID 查詢(xún) * * @param id 主鍵ID */ T selectById(Serializable id); /** * 查詢(xún)(根據(jù)ID 批量查詢(xún)) * * @param idList 主鍵ID列表(不能為 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 查詢(xún)(根據(jù) columnMap 條件) * * @param columnMap 表字段 map 對(duì)象 */ List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據(jù) entity 條件,查詢(xún)一條記錄 * * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) Wrapper 條件,查詢(xún)總記錄數(shù) * * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) entity 條件,查詢(xún)?nèi)坑涗?* * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) Wrapper 條件,查詢(xún)?nèi)坑涗?* * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) Wrapper 條件,查詢(xún)?nèi)坑涗?* <p>注意: 只返回第一個(gè)字段的值</p> * * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) entity 條件,查詢(xún)?nèi)坑涗洠ú⒎?yè)) * * @param page 分頁(yè)查詢(xún)條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi)(可以為 null) */ <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) Wrapper 條件,查詢(xún)?nèi)坑涗洠ú⒎?yè)) * * @param page 分頁(yè)查詢(xún)條件 * @param queryWrapper 實(shí)體對(duì)象封裝操作類(lèi) */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);} Mybatis plus常用注解# @TableName:用于定義表名 @TableId:用于定義表的主鍵

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

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

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:分頁(yè)插件配置 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Configurationpublic class MybatisPlusPageConfig { /** * 舊版本 */// @Bean// public PaginationInterceptor paginationInterceptor() {// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// return paginationInterceptor;// } /** * 新的分頁(yè)插件,一級(jí)和二級(jí)緩存遵循mybatis的規(guī)則 * 需要設(shè)置 MybatisConfiguration#useDeprecatedExecutor=false 避免緩存出現(xiàn)問(wèn)題 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; }}

演示類(lèi)

SpringBoot 開(kāi)發(fā)提速神器 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'><!--這個(gè)名稱(chēng)空間是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

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

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

全局配置文件

注意config-location和configuration不能同時(shí)出現(xiàn)

修改配置文件

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> <!--控制臺(tái)輸出日志--> <setting name='logImpl' value='STDOUT_LOGGING'/> </settings></configuration>

測(cè)試

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

配置實(shí)體類(lèi)別名

修改application.properties

# 配置實(shí)體類(lèi)別名mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model

測(cè)試

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

mybatis plus下劃線(xiàn)轉(zhuǎn)駝峰

默認(rèn)就是true

修改application.properties

# mybatis plus下劃線(xiàn)轉(zhuǎn)駝峰mybatis-plus.configuration.map-underscore-to-camel-case=true

配置全局默認(rèn)主鍵類(lèi)型

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

修改application.properties

# 配置全局默認(rèn)主鍵規(guī)則mybatis-plus.global-config.db-config.id-type=auto

完整application.properties

# 端口號(hào)server.port=9999#===========數(shù)據(jù)庫(kù)相關(guān)=============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# 默認(rèn)配置路徑mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml#配置全局配置文件!!!!mybatis-plus.config-location = classpath:mybatis-config.xml# 配置實(shí)體類(lèi)別名mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model# mybatis plus下劃線(xiàn)轉(zhuǎn)駝峰mybatis-plus.configuration.map-underscore-to-camel-case=true# 配置全局默認(rèn)主鍵規(guī)則mybatis-plus.global-config.db-config.id-type=auto

樂(lè)觀鎖

大多是基于數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)。即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫(kù)表的版本解決方案中,一般通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè)“version”字段來(lái)實(shí)現(xiàn)。讀取數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù),庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比較,如果提交的數(shù)據(jù),版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前的版本號(hào),則予以更新,否則認(rèn)為是過(guò)期數(shù)據(jù)。

實(shí)體類(lèi)增加@version

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

增加樂(lè)觀鎖插件

SpringBoot 開(kāi)發(fā)提速神器 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:分頁(yè)插件配置 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Configurationpublic class MybatisPlusPageConfig { /** * 舊版本 */// @Bean// public PaginationInterceptor paginationInterceptor() {// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// return paginationInterceptor;// } /** * 新的分頁(yè)插件,一級(jí)和二級(jí)緩存遵循mybatis的規(guī)則 * 需要設(shè)置 MybatisConfiguration#useDeprecatedExecutor=false 避免緩存出現(xiàn)問(wèn)題 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); //分頁(yè)插件 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //樂(lè)觀鎖插件 mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; }}

使用

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

注意 樂(lè)觀鎖數(shù)據(jù)類(lèi)型支持int、Integer、long、timestamp 僅支持updateById和update方法邏輯刪除

公司在設(shè)計(jì)規(guī)范中都加入了邏輯刪除的強(qiáng)制規(guī)定,運(yùn)營(yíng)人員可以分析和審查數(shù)據(jù),也方便將數(shù)據(jù)沉淀下來(lái)用于商業(yè)分析。

數(shù)據(jù)量過(guò)多,也會(huì)采用數(shù)據(jù)倉(cāng)庫(kù),通過(guò)監(jiān)聽(tīng)?wèi)?yīng)用數(shù)據(jù)庫(kù)的數(shù)據(jù)變化,進(jìn)行遷移到數(shù)據(jù)倉(cāng)庫(kù)。

方式一 數(shù)據(jù)庫(kù)增加deleted字段,0是未刪除,1表示刪除 實(shí)體類(lèi)增加屬性配置@TableLogic 查詢(xún)的時(shí)候會(huì)自動(dòng)拼接上deleted=0的檢索條件

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

方式二

修改application.properties

SpringBoot 開(kāi)發(fā)提速神器 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實(shí)體類(lèi)沒(méi)加注解@TableLogic,則可以配置這個(gè),推薦這里配置mybatis-plus.global-config.db-config.logic-delete-field=deleted

代碼生成器#添加依賴(lài)#

<!-- 代碼自動(dòng)生成依賴(lài) 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> <!-- 代碼自動(dòng)生成依賴(lài) end-->

生成器類(lèi)#

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') // 生成路徑,最好使用絕對(duì)路徑,window路徑是不一樣的 .setOutputDir('/Users/chenyanbin/IdeaProjects/shop-manager') // 文件覆蓋 .setFileOverride(true) // 主鍵策略 .setIdType(IdType.AUTO) .setDateType(DateType.ONLY_DATE) // 設(shè)置生成的service接口的名字的首字母是否為I,默認(rèn)Service是以I開(kāi)頭的 .setServiceName('%sService') //實(shí)體類(lèi)結(jié)尾名稱(chēng) .setEntityName('%sDO') //生成基本的resultMap .setBaseResultMap(true) //不使用AR模式 .setActiveRecord(false) //生成基本的SQL片段 .setBaseColumnList(true); //2. 數(shù)據(jù)源配置 DataSourceConfig dsConfig = new DataSourceConfig(); // 設(shè)置數(shù)據(jù)庫(kù)類(lèi)型 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(); //全局大寫(xiě)命名 stConfig.setCapitalMode(true) // 數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略 .setNaming(NamingStrategy.underline_to_camel) //使用lombok .setEntityLombokModel(true) //使用restcontroller注解 .setRestControllerStyle(true) // 生成的表, 支持多表一起生成,以數(shù)組形式填寫(xiě) .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. 執(zhí)行操作 ag.execute(); System.out.println('======= 代碼生成完畢 ========'); }}

使用#

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合Swagger 3.x添加依賴(lài)

<!--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

配置類(lèi)

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配置類(lèi) * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */@Component@Data@ConfigurationProperties('swagger')@EnableOpenApipublic class SwaggerConfiguration { /** * 是否開(kāi)啟swagger,生產(chǎn)環(huán)境一般關(guān)閉,所以這里定義一個(gè)變量 */ private Boolean enable; /** * 項(xiàng)目應(yīng)用名 */ private String applicationName; /** * 項(xiàng)目版本信息 */ private String applicationVersion; /** * 項(xiàng)目描述信息 */ private String applicationDescription; @Bean public Docket docket(){ return new Docket(DocumentationType.OAS_30) .pathMapping('/') // 定義是否開(kāi)啟swagger,false為關(guān)閉,可以通過(guò)變量控制,線(xiàn)上關(guān)閉 .enable(enable) //配置api文檔元信息 .apiInfo(apiInfo()) // 選擇哪些接口作為swagger的doc發(fā)布 .select() //apis() 控制哪些接口暴露給swagger, // RequestHandlerSelectors.any() 所有都暴露 // RequestHandlerSelectors.basePackage('net.ybchen.*') 指定包位置 // withMethodAnnotation(ApiOperation.class)標(biāo)記有這個(gè)注解 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(); }}

啟動(dòng)測(cè)試

訪(fǎng)問(wèn)地址:http://localhost:9999/swagger-ui/index.html

注意:如果訪(fǎng)問(wèn)不成功,看是否攔截器攔截了相關(guān)資源!!!!!

SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

常用注解

@Api

用在controller類(lèi),描述API接口

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

@ApiOperation#

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

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

@ApiParam#

方法參數(shù)配置,用在入?yún)⑸厦妫枋鰠?shù)

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

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

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

@ApiModel#用于類(lèi),表示對(duì)類(lèi)進(jìn)行說(shuō)明,用于參數(shù),用實(shí)體類(lèi)接收@ApiModelProperty#用于方法,字段;表示對(duì)model屬性的說(shuō)明或者數(shù)據(jù)操作更改value:字段說(shuō)明name:重寫(xiě)屬性名稱(chēng)dataType:重寫(xiě)屬性類(lèi)型required:是否必填example:舉例說(shuō)明hidden:隱藏@Data@ApiModel('用戶(hù)基本信息')

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

@ApiResponse#描述接口響應(yīng)

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

項(xiàng)目源碼下載

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

到此這篇關(guān)于SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI的文章就介紹到這了,更多相關(guān)SpringBoot Lombok+MybatisPlus+SwaggerUI內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲乱码国产乱码精品精剪 | 性一交一乱一伦一色一情孩交 | 欧美一区二区三区久久 | 日韩午夜视频在线 | 成 人 黄 色 片 在线播放 | 超碰av导航 | 奶头挺立呻吟高潮视频 | 国产精品久久久久久69 | 精品一区在线播放 | 一级黄色国产片 | 日本成熟老妇乱 | 成人涩涩 | 欧美一乱一性一交一视频 | 久草福利资源在线 | 免费一级片 | 无码人妻av一区二区三区波多野 | 麻豆文化传媒精品一区 | 亚洲精品国偷拍自产在线观看蜜桃 | 精品一区二区亚洲 | 成人免费无码大片a毛片抽搐色欲 | 婷婷四房播播 | 伊人蕉久中文字幕无码专区 | 中文字幕少妇在线三级hd | 亚洲精品无线乱码一区 | 看片在线| 在熟睡夫面前侵犯我在线播放 | www欧美国产 | 国产成人精品综合在线观看 | 永久中文字幕 | 在线超碰av | 日本午夜视频 | 韩国三级hd中文字幕叫床 | 青青草无码免费一二三区 | 亚洲狼人av | 国产成人久久精品麻豆二区 | 亚洲三级在线免费观看 | 肥臀浪妇太爽了快点再快点 | 影音先锋男人的天堂 | 播放灌醉水嫩大学生国内精品 | 91av在线视频播放 | 色婷婷狠 | 国产一区二区在线免费 | 中文字幕在线不卡视频 | 国产精品野外av久久久 | 亚洲精品喷潮一区二区三区 | 君岛美绪在线 | 91国产在线播放 | 国产精品嫩草影院九色 | 精品人妻大屁股白浆无码 | 国产ts在线| 精品久久久99 | 国产日韩欧美一区二区宅男 | 水野朝阳av一区二区三区 | 青青伊人影院 | 久久视频中文字幕 | 午夜影院h | 国产一区二区三区不卡av | 九九视频在线观看视频6 | 麻豆av免费在线 | 两个女人互添下身爱爱 | 亚洲激情 | 四虎影视免费永久在线 | 成人一级片在线观看 | 天堂俺去俺来也www 天堂俺去俺来也www久久婷婷 | 久久久欧美 | 久久久无码精品一区二区三区蜜桃 | www.黄色毛片| 亚洲天堂网在线观看视频 | 亚洲永久免费 | 深夜福利成人 | 免费看黄色大片 | 欧美顶级少妇做爰hd | 国产又黄又硬又湿又黄的故事 | 亚洲天堂在线视频播放 | 欧美日韩一级二级 | 国产精品人人做人人爽 | 国内精品伊人久久久久网站 | 好吊妞视频在线观看 | 日韩视频在线观看免费视频 | av在线亚洲天堂 | 欧美日韩一卡2卡三卡4卡 乱码欧美孕交 | 五月激情婷婷丁香 | 国产人妖乱国产精品人妖 | 午夜在线视频观看日韩17c | 337p粉嫩大胆色噜噜噜噜 | 久久99精品久久只有精品 | 久久情趣视频 | 亚洲国产成人av毛片大全 | 亚洲精品色视频 | 福利一区二区在线观看 | 在线成人一区二区 | 深夜精品 | 公的~yin之手筱田优中文字幕 | 九九在线中文字幕无码 | 国产精品久久久久久久久久99 | 大香伊在人线免97 | 一级大片网站 | 色中色成人导航 | 国色天香一卡2卡三卡4卡乱码 | 欧美日韩免费一区二区 | 欧美日韩亚洲中文字幕一区二区三区 | 探花系列在线观看 | 天天做天天摸天天爽天天爱 | 国产婷婷色一区二区三区四区 | 中日韩黄色片 | 亚洲色图激情 | 国产欧美日韩在线观看 | 在线播放无码高潮的视频 | 久久久久久久久久网 | 欧美日韩精品一区二区三区蜜桃 | 日韩插 | 日韩免费专区 | 一区二区中文字幕 | 婷婷中文| 中文字幕丰满人伦在线 | 亚洲国产精品久久久久秋霞 | av久色 | 欧美人与动牲交免费观看网 | 午夜xxxx| 日韩成人激情 | 亚洲a色| 农村妇女毛片精品久久久 | www婷婷av久久久影片 | 国产主播大尺度精品福利免费 | 狠狠色噜噜狠狠狠狠米奇777 | 嫩草视频在线观看 | 久久天天躁狠狠躁夜夜网站 | 国产一区二区三区影院 | 亚洲男人最新版本天堂 | 日韩精品久 | 亚洲三区av | 欧美激情综合色综合啪啪五月 | 亚洲国产日韩一区 | 日日夜夜精品免费 | 女朋友闺蜜奶好大下面好紧视频 | 羞羞avtv| 香港三级午夜理伦三级 | 女人夜夜春高潮爽a∨片传媒 | 国产在线观看第一页 | 一亚洲乱亚洲乱妇23p | 国产精品精品软件 | 日本综合视频 | 又爽又黄无遮挡高潮视频网站 | 91日韩视频| 天天射日日 | 女同互慰高潮呻吟免费播放 | 九色视频导航 | 91成年影院 | 免费又黄又粗又爽大片69 | 中文字幕av一区二区三区 | 成人情趣片在线观看免费 | 欧美性高潮视频 | 亚洲性天堂 | 国产91成人欧美精品另类动态 | 中日韩文字幕无线网站2013 | 国产呻吟对白刺激无套视频在线 | 黄色免费视频网站 | 艹少妇视频 | 91精品国产福利在线观看的优点 | 久久三| 污片在线看| 九九九国产视频 | 全黄一级裸片视频 | 久久精品国产99精品国产2021 | 成人福利在线视频 | 成人aaa视频 | 欧美狂野另类xxxxoooo | 无码高潮爽到爆的喷水视频 | 国产女无套免费网站 | 九色影视 | 四虎成人永久免费视频 | 欧美在线观看一区 | 男人疯狂高潮呻吟视频 | 日韩福利一区二区 | 国产粉嫩高中好第一次不戴 | 欧美极品少妇xxxxⅹ喷水 | 一区二区三区精 | 99精品视频99| 男人午夜av | 业余 自由 性别 成熟偷窥 | 中文字幕精品三区 | 欧美久久久久久 | 三级网址在线 | 日韩欧美亚洲天堂 | 红杏成人免费视频 | 超碰97成人 | 一个人免费在线观看视频 | 日韩欧美国产三级 | 久久人人爽人人爽人人片av不 | 亚洲tv久久爽久久爽 | 日本少妇被黑人xxxxx | 最近中文字幕免费mv在线视频 | 欧美黄色大片视频 | 日韩一级在线视频 | 少妇毛片久久久久久久久竹菊影院 | 国产男女做爰免费网站 | a色视频| 天堂久久一区二区 | 国产精欧美一区二区三区 | 欧美xxxx×黑人性爽 | 九草在线观看 | 国产激情综合五月久久 | 国产农村妇女aaaaa视频 | 最新国产在线 | 天天躁夜夜躁天干天干200 | 中文字幕在线一区二区三区 | 精品久久久久久 | 国产美女视频国产视视频 | 亚洲理论中文字幕 | 欧洲美女粗暴牲交免费观看 | 色婷婷在线播放 | 天码av无码一区二区三区四区 | 黑人巨茎大战欧美白妇 | 能在线观看的av网站 | 久久久久免费观看 | 欧美一区二区三区性视频 | 色婷婷六月 | 色一情一乱| 亚洲天堂2017无码中文 | www超碰在线com| 国产aaa级片 | 亚洲天堂2014| 国产成人鲁鲁免费视频a | 91香蕉视频黄色 | 九九热在线精品 | 久久中文综合 | 久久精品国产久精国产 | 国产乱人激情h在线观看 | 性做久久久久久 | 亚洲欧美日本国产高清 | 丰满肉嫩西川结衣av | 偷拍精偷拍精品欧洲亚洲网站 | 欧美日韩一区二区三区69堂 | 日韩av一级| 国产99久久久国产 | 欧美激情精品久久久久久变态 | 国产特级全黄寡妇毛片 | 精品国产va久久久久久久冰 | 91喷水视频| 青草青草视频2免费观看 | 成人在线视频网 | 影音先锋日韩精品 | 国产成人黄色av | 国产一区二区三区久久久久久久久 | 欧美jizz18 | 中文字幕亚洲图片 | 日韩高清专区 | av网站观看| 91精品国产91久久久久久久久久久久 | 亚洲福利天堂 | 非洲人与性动交ccoo | 五十路亲子中出在线观看 | 性乡下性大开放 | 精品国产片一区二区三区 | 5g影院天天爽入口入口 | 国产97在线 | 亚洲 | 成人黄色毛片 | wwwxx在线观看| 精品无人乱码一区二区三区 | 色欧美日韩| 成人欧美一区二区三区 | 神马久久久久久久久久 | 中文字幕 亚洲一区 | 亚洲精品久久久久玩吗 | 久久羞羞| www国产亚洲精品久久麻豆 | 欧美日韩高清丝袜 | 亚洲片在线观看 | 中国xxx农村性视频 欧美寡妇xxxx黑人猛交 | 久久婷婷成人综合色综合 | 色又黄又爽网站www久久 | 肉体裸交137日本大胆摄影 | av地址在线 | 亚洲嫩草影院 | 久久久久国产精品夜夜夜夜夜 | 菠萝蜜视频在线观看入口 | 久久久精品一区 | 帮老师解开蕾丝奶罩吸乳网站 | 国产免费永久精品无码 | 成年女人免费碰碰视频 | 永久免费未满蜜桃 | 青青草视频在线观看 | 日本黄页网站免费观看 | 日韩不卡| 内射爽无广熟女亚洲 | 日本一级黄色 | 成人精品视频一区二区三区尤物 | 久久久久久久久久久小说 | 91亚洲国产成人久久精品麻豆 | 91精品国产色综合久久不卡蜜臀 | 亚洲精品女人 | 男人的天堂在线视频 | 国产在线精品成人免费怡红院 | 久久久午夜精品理论片中文字幕 | 91精品国产99久久久 | 亚洲综合久久一区二区 | 黄色国产精品视频 | 超色视频 | 国产精品资源一区二区 | 久久精品人妻一区二区蜜桃 | 国产免费内射又粗又爽密桃视频 | 欧美日比视频 | 美女内射毛片在线看3d | 无码人妻丰满熟妇区五十路百度 | 丰满岳妇乱一区二区三区 | 久久与婷婷 | 国产成人在线免费 | 99久久欧美日韩国产二区 | 无码人妻av一二区二区三区 | 日韩国产精品久久久久久亚洲 | 性一交一乱一色一免费无遮挡 | 国产又粗又硬又大爽黄老大爷视频 | 麻花豆传媒剧国产免费mv在线 | 伊人网综合 | 在线视频 91| 40岁丰满东北少妇毛片 | 有码一区二区三区 | 午夜欧美成人 | 丝袜五月天 | 欧美成人激情在线 | 国产一区二区三区中文字幕 | 国产精品一二三区成毛片视频 | 国产精品国产三级国产专播 | 亚洲精品一区中文字幕 | 在线精品一区二区 | 色5月婷婷 | 亚洲欧洲无码av不卡在线 | 女性女同性aⅴ免费观女性恋 | 午夜高清福利 | 国产伊人自拍 | 国产美女爆我菊免费观看88av | 日韩福利网 | 一本a道v久大 | 国产精品无码久久av | 国产成人精品aa毛片 | 色婷婷亚洲 | 日韩在线一区二区三区免费视频 | 国产美女视频国产视视频 | 亚洲 小说区 图片区 都市 | 欧美性做爰免费观看 | 朝鲜一级黄色片 | youjizzcom日本| 久久伊人一区 | 爆乳2把你榨干哦ova在线观看 | 久久综合久久网 | 国产精品国产三级国产aⅴ浪潮 | 无遮挡1000部拍拍拍免费 | 日本一级特黄高潮 | 海角社区在线视频播放观看 | 久久婷婷网站 | 狠狠干综合网 | 欧美喷潮久久久xxxxx | 久久亚洲区 | 一级黄色片毛片 | 免费人成年激情视频在线观看 | 91激情视频在线 | 成人国产一区二区三区精品麻豆 | 亚洲天堂2017无码 | 91麻豆精品国产91久久久更新时间 | 国产三区在线播放 | 欧美成人一区二区三区在线观看 | 又大又粗弄得我出好多水 | 天堂在线免费观看视频 | 久久精品日日躁夜夜躁 | 亚洲午夜精品久久久 | 国产影片中文字幕 | 777久久久 | 亚洲一区二区三区乱码aⅴ 亚洲一区二区三区日本久久九 | av网址在线播放 | 亚洲丁香花色 | 亚洲区一区二区三区 | 日韩欧美区 | 欧美国产精品一二三 | 黄网站色大毛片 | 爱情岛av亚洲论坛自拍品质 | 麻豆天天躁天天揉揉av | 久草老司机 | 成年人黄视频 | 精品日韩中文字幕 | 精品久久久久久无码国产 | 国产交换配乱淫视频a免费 国产精成人品免费观看 | 自慰无码一区二区三区 | 日本一级二级三级久久久 | 国产综合久久久久 | 亚洲精品系列 | 久久综合日本 | 色又黄又爽18禁免费视频 | 亚洲国产日韩精品一区二区三区 | 亚洲大胆视频 | 五月婷婷欧美 | 精品三级在线观看 | 激情内射日本一区二区三区 | 亚洲精品ww| 羞羞的网站在线观看 | 波多野结衣av高清一区二区三区 | 日本欧美在线播放 | 国产成年免费视频 | 亚洲的天堂av无码 | 一本一本久久a久久精品综合麻豆 | jizz自拍| 丰满少妇大力进入 | 久久视频在线视频 | 亚色网站 | 草综合 | av在线综合网 | 波多野结衣中文一区 | 久久久久9999| 亚洲综合色区中文字幕 | 精品国产一区二区在线 | 噜噜噜噜香蕉私人 | 人人超人人超碰超国产97超碰 | 成人片在线播放 | 日日躁夜夜躁狠狠躁 | 国产自产在线视频一区 | 国产伦精品一区二区三区在线观看 | 色网站免费观看 | 中文字幕久久熟女人妻av免费 | 精品无码一区二区三区在线 | 欧美激情视频一区二区三区 | 国产成人无码精品久久久露脸 | 中文在线视频观看 | 日本在线一本 | 偷国产乱人伦偷精品视频 | 日韩在线观看视频网站 | 太粗太长太硬高潮了av | 中文字幕蜜桃 | 久久久日韩精品一区二区 | 小蜜蜂www视频在线观看高清 | 久久久久女教师免费一区 | 久久这里只有精品99 | 涩涩鲁亚洲精品一区二区 | 国产精品久久久久影院老司 | 伊人久久大香网 | 国产一区免费在线 | 欧美精品一级二级三级 | 欧美伊人精品成人久久综合97 | 国产一级做a爰片久久毛片男男 | wwwxxx在线观看 | 精品国产一区二区三区粉芽 | 69xxⅹ性视频免费 | 成人黄色激情网 | 伊人青青久久 | 古装三级做爰在线观看 | 亚洲精品中文字幕乱码无线 | 日韩第一色 | 99精品国产一区二区三区不卡 | 国产精品毛片无码 | 日本中文在线 | 任你躁在线精品免费 | 久久久久成人网站 | 色婷婷av一区二区三区之红樱桃 | 天堂а√在线地址中文在线 | 久久久久久久久久久网 | 伊人yinren22综合开心 | 天天射射综合 | 一个色影院 | 欧美极品少妇xxxxⅹ喷水 | 青青免费视频 | 99热网站| 韩国三级大全久久网站 | 特黄视频在线观看 | 973理论片235影院9 | 九九少妇 | 成人精品在线 | 日韩av专区片 | 黑人巨大精品欧美一区二区免费 | 欧美午夜精品久久久 | 黄色视屏在线免费观看 | 国产精品不卡在线观看 | 国产视频福利 | 中文av一区二区 | av看片网站| 精品欧美一区二区三区 | 国产88久久久国产精品免费二区 | 国精产品一区一区三区视频 | 欧美日韩一区二区在线 | 久久99热这里只频精品6 | 男男啪啪激烈高潮cc漫画免费 | 高清乱码毛片入口 | 99色在线视频| 天天狠狠操 | 极品美女极度色诱视频在线 | 天天看a | 色淫av蜜桃臀少妇 | 久久尤物免费一区二区三区 | 综合99 | 99精品自拍| 怡春院欧美| 黄色一及片 | 欧美精品一区二区久久婷婷 | 中文字幕在线观看国产 | 波多野结衣一二三区 | 国产黑色丝袜呻吟在线91 | 深夜久久 | 成人精品国产 | 黄色资源在线观看 | 亚洲国产精品人人做人人爱 | 日韩av大片 | 性欧美8khd高清极品 | 激情丁香 | 人妻无码一区二区三区四区 | 欧美在线性视频 | 先锋资源中文字幕 | 久久婷婷国产综合精品 | 国产精品成人免费一区二区视频 | 免费看欧美中韩毛片影院 | 欧美在线观看视频一区 | 最新超碰在线 | 亚洲wwwwww| www色网站 | 国产喷潮| 美女热逼 | 色欲综合久久中文字幕网 | 老熟妇高潮一区二区三区 | 天天天干干干 | 天天插夜夜操 | 女女互磨互喷水高潮les呻吟 | 青草青在线视频在线观看 | 亚洲天堂欧美 | 日韩在线资源 | 国产天码视频网站 | 一区二区国产在线 | 久久国产自偷自偷免费一区调 | av毛片久久| 国产在线啪 | 97超碰在线播放 | 亚洲欧洲在线播放 | 久久久国产精品入口麻豆 | 欧美成人天堂 | 色猫咪免费人成网站在线观看 | 欧美在线免费播放 | 天堂俺去俺来也www色官网 | 亚洲人成人网站色www | 日韩午夜高清 | 给个av网站 | 久久人妻无码一区二区 | 免费国产玉足脚交视频 | 永久免费看毛片 | 国产成人无码免费视频在线 | 岛国av动作片在线观看 | 色婷五月天 | 99久久免费精品 | 亚洲第一a在线观看网站 | 天天综合欧美 | 天天躁日日躁狠狠躁2018小说 | 欧美一区二区最爽乱淫视频免费看 | 丁香桃色午夜亚洲一区二区三区 | 已婚少妇美妙人妻系列 | 美女无遮挡免费视频网站 | 69精品| 再深点灬舒服灬太大了快点91 | 亚州av在线 | 91精品91久久久中77777 | 亚洲另类激情视频 | 92电影网午夜福利 | 国产98在线传媒麻豆有限公司 | 成年人一级黄色片 | 精品国产一区二区三区久久狼 | 福利免费观看 | 国产日韩欧美一区 | 亚洲男人天堂2020 | 久久久人成影片一区二区三区 | 狂野欧美性猛交xxxxx视频 | 五月婷婷综合在线 | 136fldh导航福利微拍 | 乱人伦精品视频在线观看 | 又粗又硬又大又爽免费视频播放 | 青青视频免费 | 日韩毛片子 | 超碰人人网 | 久久精品中文无码资源站 | 综合色88| 黄色国产片| 久热中文字幕在线 | 天天精品综合 | 伊人色综合久久天天五月婷 | 亚洲成人在线网站 | 日本精品在线播放 | 大肉大捧一进一出好爽视色大师 | 日本午夜在线视频 | 91视频这里只有精品 | 91丨九色 | 天天躁日日躁狠狠躁av麻豆男男 | 国产精品成人va在线观看 | 51免费动漫网永久入口 | 手机免费看av片 | 97人人模人人爽人人少妇 | 亚洲国产另类久久久精品网站 | 日韩精品av久久有码一区浪潮 | 高潮内射免费看片 | 亚洲黄色在线播放 | 亚洲午夜精品久久久久久久久久久久 | 全部免费毛片在线播放 | 超碰国产在线观看 | 有一婷婷色 | 国产精品a成v人在线播放 | 欧美精品一区二区三区久久久竹菊 | 久久精品国产99国产精品亚洲 | 老色批永久免费网站www | 99草草国产熟女视频在线 | 在线观看中文字幕第一页 | 久久久久久久久久久久久久久久久久久 | 操女人视频网站 | 日日噜噜夜夜狠狠久久波多野 | 91蜜桃在线观看 | 狠狠躁18三区二区一区 | 无码国模国产在线观看 | 青青草日本 | 欧美1区2区3区 | 亚洲精品国产品国语在线观看 | 国产黄大片在线观看 | 亚洲欧美国产一区二区 | 毛片网站在线免费观看 | 国产成a人亚洲精v品在线观看 | 天天操天天添 |