服务器之家

服务器之家 > 正文

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

时间:2021-08-21 15:31     来源/作者:陈彦斌

导读

  • 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代码的精简提供了一种方式

添加依赖

  1. <!--lombok-->
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. <version>1.18.16</version>
  6. <!--scope=provided,说明它是在编译阶段生效,不需要打入包中,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件-->
  7. <scope>provided</scope>
  8. </dependency>

常见注解@Getter/@Setter#

  • 作用类上,生成所有成员变量的getter/setter方法
  • 作用于成员变量上,生成该成员变量的getter/setter方法
  • 方法控制访问级别set和get注解加上@Getter(AccessLevel.PROTECTED)

编译查看字节码

  1. mvn compile

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

  1. package com.ybchen.shopmanager.model;
  2.  
  3. import lombok.AccessLevel;
  4. import lombok.Getter;
  5. import lombok.Setter;
  6.  
  7. /**
  8. * @Description:
  9. * @Author:chenyanbin
  10. * @Date:2021/3/2 下午9:43
  11. * @Versiion:1.0
  12. */
  13. @Getter
  14. @Setter
  15. public class User {
  16. //不想生成get方法
  17. @Getter(AccessLevel.NONE)
  18. int id;
  19. //只会去生成get
  20. final String name = "alex";
  21. String phone;
  22. //静态成员变量不会生成set/get方法
  23. static final String pwd = "123";
  24. }

@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确保存储对象的唯一值,并判断是否同一个对象呢?

  1. 依据hashCodeequals进行判断
  2. 所以Set存储的对象必须重写这两个方法,判断两个对象是否一样
  3. 首先判断插入对象的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的基础上只做强增不做改变,为简化开发,提高效率

数据库脚本

  1. /*
  2. Navicat Premium Data Transfer
  3.  
  4. Source Server : localhost
  5. Source Server Type : MySQL
  6. Source Server Version : 50728
  7. Source Host : localhost:3306
  8. Source Schema : shop
  9.  
  10. Target Server Type : MySQL
  11. Target Server Version : 50728
  12. File Encoding : 65001
  13.  
  14. Date: 04/03/2021 22:17:20
  15. */
  16.  
  17. SET NAMES utf8mb4;
  18. SET FOREIGN_KEY_CHECKS = 0;
  19.  
  20. -- ----------------------------
  21. -- Table structure for address
  22. -- ----------------------------
  23. DROP TABLE IF EXISTS `address`;
  24. CREATE TABLE `address` (
  25. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  26. `user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
  27. `default_status` int(1) DEFAULT NULL COMMENT '是否默认收货地址:0->否;1->是',
  28. `receive_name` varchar(64) DEFAULT NULL COMMENT '收发货人姓名',
  29. `phone` varchar(64) DEFAULT NULL COMMENT '收货人电话',
  30. `province` varchar(64) DEFAULT NULL COMMENT '省/直辖市',
  31. `city` varchar(64) DEFAULT NULL COMMENT '市',
  32. `region` varchar(64) DEFAULT NULL COMMENT '区',
  33. `detail_address` varchar(200) DEFAULT NULL COMMENT '详细地址',
  34. `create_time` datetime DEFAULT NULL,
  35. PRIMARY KEY (`id`)
  36. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电商-公司收发货地址表';
  37.  
  38. -- ----------------------------
  39. -- Records of address
  40. -- ----------------------------
  41. BEGIN;
  42. COMMIT;
  43.  
  44. -- ----------------------------
  45. -- Table structure for banner
  46. -- ----------------------------
  47. DROP TABLE IF EXISTS `banner`;
  48. CREATE TABLE `banner` (
  49. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  50. `img` varchar(524) DEFAULT NULL COMMENT '图片',
  51. `url` varchar(524) DEFAULT NULL COMMENT '跳转地址',
  52. `weight` int(11) DEFAULT NULL COMMENT '权重',
  53. `version` int(11) DEFAULT '1',
  54. `deleted` int(11) DEFAULT '0' COMMENT '0是未删除,1是已经删除',
  55. PRIMARY KEY (`id`)
  56. ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;
  57.  
  58. -- ----------------------------
  59. -- Records of banner
  60. -- ----------------------------
  61. BEGIN;
  62. INSERT INTO `banner` VALUES (1, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 1, 2, 1);
  63. INSERT INTO `banner` VALUES (2, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 3, 1, 0);
  64. INSERT INTO `banner` VALUES (3, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 2, 1, 0);
  65. INSERT INTO `banner` VALUES (7, 'werw', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  66. INSERT INTO `banner` VALUES (8, '666666', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  67. INSERT INTO `banner` VALUES (9, 'sdfds', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  68. INSERT INTO `banner` VALUES (10, '323232', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  69. INSERT INTO `banner` VALUES (11, '532', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  70. INSERT INTO `banner` VALUES (12, '6666', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0);
  71. COMMIT;
  72.  
  73. -- ----------------------------
  74. -- Table structure for coupon
  75. -- ----------------------------
  76. DROP TABLE IF EXISTS `coupon`;
  77. CREATE TABLE `coupon` (
  78. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  79. `category` varchar(11) DEFAULT NULL COMMENT '优惠卷类型[NEW_USER注册赠券,TASK任务卷,PROMOTION促销劵]',
  80. `publish` varchar(11) DEFAULT NULL COMMENT '发布状态, PUBLISH发布,DRAFT草稿,OFFLINE下线',
  81. `coupon_img` varchar(524) DEFAULT NULL COMMENT '优惠券图片',
  82. `coupon_title` varchar(128) DEFAULT NULL COMMENT '优惠券标题',
  83. `price` decimal(16,2) DEFAULT NULL COMMENT '抵扣价格',
  84. `user_limit` int(11) DEFAULT NULL COMMENT '每人限制张数',
  85. `start_time` datetime DEFAULT NULL COMMENT '优惠券开始有效时间',
  86. `end_time` datetime DEFAULT NULL COMMENT '优惠券失效时间',
  87. `publish_count` int(11) DEFAULT NULL COMMENT '优惠券总量',
  88. `stock` int(11) DEFAULT '0' COMMENT '库存',
  89. `add_one` int(11) DEFAULT NULL COMMENT '是否叠加0是不行,1是可以',
  90. `create_time` datetime DEFAULT NULL,
  91. `condition_price` decimal(16,2) DEFAULT NULL COMMENT '满多少才可以使用',
  92. PRIMARY KEY (`id`)
  93. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  94.  
  95. -- ----------------------------
  96. -- Records of coupon
  97. -- ----------------------------
  98. BEGIN;
  99. COMMIT;
  100.  
  101. -- ----------------------------
  102. -- Table structure for product
  103. -- ----------------------------
  104. DROP TABLE IF EXISTS `product`;
  105. CREATE TABLE `product` (
  106. `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  107. `title` varchar(128) DEFAULT NULL COMMENT '标题',
  108. `cover_img` varchar(128) DEFAULT NULL COMMENT '封面图',
  109. `detail` varchar(256) DEFAULT '' COMMENT '详情',
  110. `old_price` decimal(16,2) DEFAULT NULL COMMENT '老价格',
  111. `price` decimal(16,2) DEFAULT NULL COMMENT '新价格',
  112. `stock` int(11) DEFAULT NULL COMMENT '库存',
  113. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  114. `lock_stock` int(11) DEFAULT '0' COMMENT '锁定库存',
  115. PRIMARY KEY (`id`)
  116. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
  117.  
  118. -- ----------------------------
  119. -- Records of product
  120. -- ----------------------------
  121. BEGIN;
  122. COMMIT;
  123.  
  124. -- ----------------------------
  125. -- Table structure for product_order
  126. -- ----------------------------
  127. DROP TABLE IF EXISTS `product_order`;
  128. CREATE TABLE `product_order` (
  129. `id` bigint(11) NOT NULL AUTO_INCREMENT,
  130. `out_trade_no` varchar(64) DEFAULT NULL COMMENT '订单唯一标识',
  131. `state` varchar(11) DEFAULT NULL COMMENT 'NEW 未支付订单,PAY已经支付订单,CANCEL超时取消订单',
  132. `create_time` datetime DEFAULT NULL COMMENT '订单生成时间',
  133. `total_fee` decimal(16,2) DEFAULT NULL COMMENT '订单总金额',
  134. `pay_fee` decimal(16,2) DEFAULT NULL COMMENT '订单实际支付价格',
  135. `pay_type` varchar(64) DEFAULT NULL COMMENT '支付类型,微信-银行-支付宝',
  136. `nickname` varchar(64) DEFAULT NULL COMMENT '昵称',
  137. `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
  138. `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  139. `del` int(5) DEFAULT '0' COMMENT '0表示未删除,1表示已经删除',
  140. `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  141. `order_type` varchar(32) DEFAULT NULL COMMENT '订单类型 DAILY普通单,PROMOTION促销订单',
  142. `receiver_address` varchar(1024) DEFAULT NULL COMMENT '收货地址 json存储',
  143. PRIMARY KEY (`id`)
  144. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  145.  
  146. -- ----------------------------
  147. -- Records of product_order
  148. -- ----------------------------
  149. BEGIN;
  150. COMMIT;
  151.  
  152. -- ----------------------------
  153. -- Table structure for product_order_item
  154. -- ----------------------------
  155. DROP TABLE IF EXISTS `product_order_item`;
  156. CREATE TABLE `product_order_item` (
  157. `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  158. `product_order_id` bigint(11) DEFAULT NULL COMMENT '订单号',
  159. `out_trade_no` varchar(32) DEFAULT NULL,
  160. `product_id` bigint(11) DEFAULT NULL COMMENT '产品id',
  161. `product_name` varchar(128) DEFAULT NULL COMMENT '商品名称',
  162. `product_img` varchar(524) DEFAULT NULL COMMENT '商品图片',
  163. `buy_num` int(11) DEFAULT NULL COMMENT '购买数量',
  164. `create_time` datetime DEFAULT NULL,
  165. `total_fee` decimal(16,2) DEFAULT NULL COMMENT '购物项商品总价格',
  166. `pay_fee` decimal(16,0) DEFAULT NULL COMMENT '购物项商品支付总价格',
  167. PRIMARY KEY (`id`)
  168. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  169.  
  170. -- ----------------------------
  171. -- Records of product_order_item
  172. -- ----------------------------
  173. BEGIN;
  174. COMMIT;
  175.  
  176. -- ----------------------------
  177. -- Table structure for user
  178. -- ----------------------------
  179. DROP TABLE IF EXISTS `user`;
  180. CREATE TABLE `user` (
  181. `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  182. `name` varchar(128) DEFAULT NULL COMMENT '昵称',
  183. `pwd` varchar(124) DEFAULT NULL COMMENT '密码',
  184. `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
  185. `slogan` varchar(524) DEFAULT NULL COMMENT '用户签名',
  186. `sex` tinyint(2) DEFAULT '1' COMMENT '0表示女,1表示男',
  187. `points` int(10) DEFAULT '0' COMMENT '积分',
  188. `create_time` datetime DEFAULT NULL,
  189. `mail` varchar(64) DEFAULT NULL COMMENT '邮箱',
  190. `secret` varchar(12) DEFAULT NULL COMMENT '盐,用于个人敏感信息处理',
  191. PRIMARY KEY (`id`),
  192. UNIQUE KEY `mail_idx` (`mail`)
  193. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  194.  
  195. -- ----------------------------
  196. -- Records of user
  197. -- ----------------------------
  198. BEGIN;
  199. COMMIT;
  200.  
  201. SET FOREIGN_KEY_CHECKS = 1;

pom.xml

  1. <!--mysql-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. </dependency>
  6. <!--mybatis plus和spring boot整合-->
  7. <dependency>
  8. <groupId>com.baomidou</groupId>
  9. <artifactId>mybatis-plus-boot-starter</artifactId>
  10. <version>3.4.0</version>
  11. </dependency>
  12. <?xml version="1.0" encoding="UTF-8"?>
  13. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  14. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  15. <modelVersion>4.0.0</modelVersion>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.4.3</version>
  20. <relativePath/> <!-- lookup parent from repository -->
  21. </parent>
  22. <groupId>com.ybchen</groupId>
  23. <artifactId>shop-manager</artifactId>
  24. <version>0.0.1-SNAPSHOT</version>
  25. <name>shop-manager</name>
  26. <description>Demo project for Spring Boot</description>
  27. <properties>
  28. <java.version>1.8</java.version>
  29. </properties>
  30. <dependencies>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-web</artifactId>
  34. </dependency>
  35.  
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. <!--lombok-->
  42. <dependency>
  43. <groupId>org.projectlombok</groupId>
  44. <artifactId>lombok</artifactId>
  45. <version>1.18.16</version>
  46. <!--scope=provided,说明它是在编译阶段生效,不需要打入包中,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件-->
  47. <scope>provided</scope>
  48. </dependency>
  49. <!--mysql-->
  50. <dependency>
  51. <groupId>mysql</groupId>
  52. <artifactId>mysql-connector-java</artifactId>
  53. </dependency>
  54. <!--mybatis plus和spring boot整合-->
  55. <dependency>
  56. <groupId>com.baomidou</groupId>
  57. <artifactId>mybatis-plus-boot-starter</artifactId>
  58. <version>3.4.0</version>
  59. </dependency>
  60. </dependencies>
  61.  
  62. <build>
  63. <plugins>
  64. <plugin>
  65. <groupId>org.springframework.boot</groupId>
  66. <artifactId>spring-boot-maven-plugin</artifactId>
  67. </plugin>
  68. </plugins>
  69. </build>
  70.  
  71. <!-- 代码库 -->
  72. <repositories>
  73. <repository>
  74. <id>maven-ali</id>
  75. <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
  76. <releases>
  77. <enabled>true</enabled>
  78. </releases>
  79. <snapshots>
  80. <enabled>true</enabled>
  81. <updatePolicy>always</updatePolicy>
  82. <checksumPolicy>fail</checksumPolicy>
  83. </snapshots>
  84. </repository>
  85. </repositories>
  86. <pluginRepositories>
  87. <pluginRepository>
  88. <id>public</id>
  89. <name>aliyun nexus</name>
  90. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  91. <releases>
  92. <enabled>true</enabled>
  93. </releases>
  94. <snapshots>
  95. <enabled>false</enabled>
  96. </snapshots>
  97. </pluginRepository>
  98. </pluginRepositories>
  99. </project>

完整pom.xml配置文件

application.properties

  1. # 端口号
  2. server.port=9999
  3. #===========数据库相关=============
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
  6. spring.datasource.username=root
  7. spring.datasource.password=root

配置SpringBoot扫描路径

  启动类上添加:@MapperScan("Mapper全包路径")

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合MybatisPlus

统一接口返回协议

  1. package com.ybchen.shopmanager.utils;
  2.  
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6.  
  7. import java.io.Serializable;
  8.  
  9. @Data
  10. @AllArgsConstructor
  11. @NoArgsConstructor
  12. public class JsonData implements Serializable {
  13. /**
  14. * 状态码 0 表示成功,1 表示处理中,-1表示失败
  15. */
  16. private Integer code;
  17. /**
  18. * 数据
  19. */
  20. private Object data;
  21. /**
  22. * 描述信息
  23. */
  24. private String msg;
  25.  
  26. /**
  27. * 成功,无传入数据
  28. *
  29. * @return
  30. */
  31. public static JsonData buildSuccess() {
  32. return new JsonData(0, null, null);
  33. }
  34.  
  35. /**
  36. * 成功,有传入数据
  37. *
  38. * @param data 数据
  39. * @return
  40. */
  41. public static JsonData buildSuccess(Object data) {
  42. return new JsonData(0, data, null);
  43. }
  44.  
  45. /**
  46. * 失败,有返回错误信息
  47. *
  48. * @param msg 描述信息
  49. * @return
  50. */
  51. public static JsonData buildError(String msg) {
  52. return new JsonData(-1, null, msg);
  53. }
  54.  
  55. /**
  56. * 失败,有状态码,描述信息
  57. *
  58. * @param code 状态码
  59. * @param msg 描述信息
  60. * @return
  61. */
  62. public static JsonData buildError(Integer code, String msg) {
  63. return new JsonData(code, null, msg);
  64. }
  65.  
  66. /**
  67. * 是否返回成功
  68. * @param jsonData
  69. * @return
  70. */
  71. public static boolean isSuccess(JsonData jsonData) {
  72. return jsonData.getCode() == 0;
  73. }
  74. }

实体类

  1. package com.ybchen.shopmanager.model;
  2.  
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.Data;
  5.  
  6. /**
  7. * @Description:轮播图
  8. * @Author:chenyanbin
  9. * @Date:2021/3/4 下午11:00
  10. * @Versiion:1.0
  11. */
  12. @Data
  13. //数据库表名
  14. @TableName("banner")
  15. public class BannerDO {
  16. /**
  17. * 主键
  18. */
  19. private Integer id;
  20. /**
  21. * 图片
  22. */
  23. private String img;
  24. /**
  25. * url跳转地址
  26. */
  27. private String url;
  28. /**
  29. * 权重
  30. */
  31. private Integer weight;
  32. /**
  33. * 版本号
  34. */
  35. private Integer version;
  36. /**
  37. * 0是未删除,1是已经删除
  38. */
  39. private Integer deleted;
  40. }

service

  1. package com.ybchen.shopmanager.service;
  2.  
  3. import com.ybchen.shopmanager.model.BannerDO;
  4.  
  5. import java.util.List;
  6.  
  7. public interface BannerService {
  8. List<BannerDO> list();
  9. }
  10. package com.ybchen.shopmanager.service.impl;
  11.  
  12. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  13. import com.ybchen.shopmanager.mapper.BannerMapper;
  14. import com.ybchen.shopmanager.model.BannerDO;
  15. import com.ybchen.shopmanager.service.BannerService;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18.  
  19. import java.util.List;
  20.  
  21. /**
  22. * @Description:轮播图Service
  23. * @Author:chenyanbin
  24. * @Date:2021/3/4 下午11:04
  25. * @Versiion:1.0
  26. */
  27. @Service
  28. public class BannerServiceImpl implements BannerService {
  29. @Autowired
  30. private BannerMapper bannerMapper;
  31. @Override
  32. public List<BannerDO> list() {
  33. return bannerMapper.selectList(new QueryWrapper<>());
  34. }
  35. }

Controller

  1. package com.ybchen.shopmanager.controller;
  2.  
  3. import com.ybchen.shopmanager.service.BannerService;
  4. import com.ybchen.shopmanager.utils.JsonData;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. /**
  11. * @Description:轮播图Controller
  12. * @Author:chenyanbin
  13. * @Date:2021/3/4 下午11:06
  14. * @Versiion:1.0
  15. */
  16. @RestController
  17. @RequestMapping("api/v1/banner")
  18. public class BannerController {
  19. @Autowired
  20. private BannerService bannerService;
  21. @GetMapping("list")
  22. public JsonData list(){
  23. return JsonData.buildSuccess(bannerService.list());
  24. }
  25. }

测试

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

单元测试+控制台打印sql

单元测试

  1. package com.ybchen.shopmanager;
  2.  
  3. import com.ybchen.shopmanager.model.BannerDO;
  4. import com.ybchen.shopmanager.service.BannerService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.junit.jupiter.api.Test;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9.  
  10. import java.util.List;
  11.  
  12. //classes=启动类.class
  13. @SpringBootTest(classes = ShopManagerApplication.class)
  14. @Slf4j
  15. public class BannerTest {
  16. @Autowired
  17. private BannerService bannerService;
  18.  
  19. @Test
  20. public void testBannerTest() {
  21. List<BannerDO> list = bannerService.list();
  22. log.info("轮播图列表:{}", list);
  23. }
  24. }

配置文件

application.properties

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

测试

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

BaseMapperMapper

继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能

  1. /*
  2. * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. * <p>
  8. * https://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.baomidou.mybatisplus.core.mapper;
  17.  
  18. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  19. import com.baomidou.mybatisplus.core.metadata.IPage;
  20. import com.baomidou.mybatisplus.core.toolkit.Constants;
  21. import org.apache.ibatis.annotations.Param;
  22.  
  23. import java.io.Serializable;
  24. import java.util.Collection;
  25. import java.util.List;
  26. import java.util.Map;
  27.  
  28. /*
  29.  
  30. :`
  31. .:,
  32. :::,,.
  33. :: `::::::
  34. ::` `,:,` .:`
  35. `:: `::::::::.:` `:';,`
  36. ::::, .:::` `@++++++++:
  37. `` :::` @+++++++++++#
  38. :::, #++++++++++++++`
  39. ,: `::::::;'##++++++++++
  40. .@#@;` ::::::::::::::::::::;
  41. #@####@, :::::::::::::::+#;::.
  42. @@######+@:::::::::::::. #@:;
  43. , @@########':::::::::::: .#''':`
  44. ;##@@@+:##########@::::::::::: @#;.,:.
  45. #@@@######++++#####'::::::::: .##+,:#`
  46. @@@@@#####+++++'#####+::::::::` ,`::@#:`
  47. `@@@@#####++++++'#####+#':::::::::::@.
  48. @@@@######+++++''#######+##';::::;':,`
  49. @@@@#####+++++'''#######++++++++++`
  50. #@@#####++++++''########++++++++'
  51. `#@######+++++''+########+++++++;
  52. `@@#####+++++''##########++++++,
  53. @@######+++++'##########+++++#`
  54. @@@@#####+++++############++++;
  55. ;#@@@@@####++++##############+++,
  56. @@@@@@@@@@@###@###############++'
  57. @#@@@@@@@@@@@@###################+:
  58. `@#@@@@@@@@@@@@@@###################'`
  59. :@#@@@@@@@@@@@@@@@@@##################,
  60. ,@@@@@@@@@@@@@@@@@@@@################;
  61. ,#@@@@@@@@@@@@@@@@@@@##############+`
  62. .#@@@@@@@@@@@@@@@@@@#############@,
  63. @@@@@@@@@@@@@@@@@@@###########@,
  64. :#@@@@@@@@@@@@@@@@##########@,
  65. `##@@@@@@@@@@@@@@@########+,
  66. `+@@@@@@@@@@@@@@@#####@:`
  67. `:@@@@@@@@@@@@@@##@;.
  68. `,'@@@@##@@@+;,`
  69. ``...``
  70.  
  71. _ _ /_ _ _/_. ____ / _
  72. / / //_//_//_|/ /_\ /_///_/_\ Talk is cheap. Show me the code.
  73. _/ /
  74. */
  75.  
  76. /**
  77. * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
  78. * <p>这个 Mapper 支持 id 泛型</p>
  79. *
  80. * @author hubin
  81. * @since 2016-01-23
  82. */
  83. public interface BaseMapper<T> extends Mapper<T> {
  84.  
  85. /**
  86. * 插入一条记录
  87. *
  88. * @param entity 实体对象
  89. */
  90. int insert(T entity);
  91.  
  92. /**
  93. * 根据 ID 删除
  94. *
  95. * @param id 主键ID
  96. */
  97. int deleteById(Serializable id);
  98.  
  99. /**
  100. * 根据 columnMap 条件,删除记录
  101. *
  102. * @param columnMap 表字段 map 对象
  103. */
  104. int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  105.  
  106. /**
  107. * 根据 entity 条件,删除记录
  108. *
  109. * @param wrapper 实体对象封装操作类(可以为 null)
  110. */
  111. int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
  112.  
  113. /**
  114. * 删除(根据ID 批量删除)
  115. *
  116. * @param idList 主键ID列表(不能为 null 以及 empty)
  117. */
  118. int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  119.  
  120. /**
  121. * 根据 ID 修改
  122. *
  123. * @param entity 实体对象
  124. */
  125. int updateById(@Param(Constants.ENTITY) T entity);
  126.  
  127. /**
  128. * 根据 whereEntity 条件,更新记录
  129. *
  130. * @param entity 实体对象 (set 条件值,可以为 null)
  131. * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
  132. */
  133. int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
  134.  
  135. /**
  136. * 根据 ID 查询
  137. *
  138. * @param id 主键ID
  139. */
  140. T selectById(Serializable id);
  141.  
  142. /**
  143. * 查询(根据ID 批量查询)
  144. *
  145. * @param idList 主键ID列表(不能为 null 以及 empty)
  146. */
  147. List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  148.  
  149. /**
  150. * 查询(根据 columnMap 条件)
  151. *
  152. * @param columnMap 表字段 map 对象
  153. */
  154. List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  155.  
  156. /**
  157. * 根据 entity 条件,查询一条记录
  158. *
  159. * @param queryWrapper 实体对象封装操作类(可以为 null)
  160. */
  161. T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  162.  
  163. /**
  164. * 根据 Wrapper 条件,查询总记录数
  165. *
  166. * @param queryWrapper 实体对象封装操作类(可以为 null)
  167. */
  168. Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  169.  
  170. /**
  171. * 根据 entity 条件,查询全部记录
  172. *
  173. * @param queryWrapper 实体对象封装操作类(可以为 null)
  174. */
  175. List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  176.  
  177. /**
  178. * 根据 Wrapper 条件,查询全部记录
  179. *
  180. * @param queryWrapper 实体对象封装操作类(可以为 null)
  181. */
  182. List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  183.  
  184. /**
  185. * 根据 Wrapper 条件,查询全部记录
  186. * <p>注意: 只返回第一个字段的值</p>
  187. *
  188. * @param queryWrapper 实体对象封装操作类(可以为 null)
  189. */
  190. List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  191.  
  192. /**
  193. * 根据 entity 条件,查询全部记录(并翻页)
  194. *
  195. * @param page 分页查询条件(可以为 RowBounds.DEFAULT)
  196. * @param queryWrapper 实体对象封装操作类(可以为 null)
  197. */
  198. <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  199.  
  200. /**
  201. * 根据 Wrapper 条件,查询全部记录(并翻页)
  202. *
  203. * @param page 分页查询条件
  204. * @param queryWrapper 实体对象封装操作类
  205. */
  206. <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  207. }

 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:拼接or
between:两个值中间
notBetween:不在两个值中间
like:模糊匹配
notLike:不像
likeLeft:左匹配
likeRight:右边匹配
isNull:字段为空
in:in查询
groupBy:分组
orderByAsc:升序
orderByDesc:降序
having:having查询
分页插件#
配置类#

  1. package com.ybchen.shopmanager.config;
  2.  
  3. import com.baomidou.mybatisplus.annotation.DbType;
  4. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  5. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8.  
  9. /**
  10. * @Description:分页插件配置
  11. * @Author:chenyanbin
  12. * @Date:2021/3/5 下午10:32
  13. * @Versiion:1.0
  14. */
  15. @Configuration
  16. public class MybatisPlusPageConfig {
  17.  
  18. /**
  19. * 旧版本
  20. */
  21. // @Bean
  22. // public PaginationInterceptor paginationInterceptor() {
  23. // PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  24. // return paginationInterceptor;
  25. // }
  26.  
  27. /**
  28. * 新的分页插件,一级和二级缓存遵循mybatis的规则
  29. * 需要设置 MybatisConfiguration#useDeprecatedExecutor=false 避免缓存出现问题
  30. */
  31. @Bean
  32. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  33. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  34. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  35. return mybatisPlusInterceptor;
  36. }
  37. }

演示类

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

自定义xml的sql脚本

新建xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!--这个名称空间是Mapper接口的路径-->
  4. <mapper namespace="com.ybchen.shopmanager.mapper.BannerMapper">
  5. <select id="getList" resultType="com.ybchen.shopmanager.model.BannerDO">
  6. select * from banner
  7. </select>
  8. </mapper>

BannerMapper.java添加方法

  1. package com.ybchen.shopmanager.mapper;
  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.ybchen.shopmanager.model.BannerDO;
  5.  
  6. import java.util.List;
  7.  
  8. /**
  9. * @Description:轮播图Mapper
  10. * @Author:chenyanbin
  11. * @Date:2021/3/4 下午11:03
  12. * @Versiion:1.0
  13. */
  14. public interface BannerMapper extends BaseMapper<BannerDO> {
  15. List<BannerDO> getList();
  16. }

配置文件告诉mapper.xml路径

application.properties

  1. # 默认配置路径
  2. mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

全局配置文件

注意config-location和configuration不能同时出现

修改配置文件

application.properties

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

新建mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <settings>
  5. <!--控制台输出日志-->
  6. <setting name="logImpl" value="STDOUT_LOGGING"/>
  7. </settings>
  8. </configuration>

测试

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

配置实体类别名

修改application.properties

  1. # 配置实体类别名
  2. mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model

测试

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

mybatis plus下划线转驼峰

默认就是true

修改application.properties

  1. # mybatis plus下划线转驼峰
  2. mybatis-plus.configuration.map-underscore-to-camel-case=true

配置全局默认主键类型

实体类上就不用加 @TableId(value="id",type=IdType.AUTO)

修改application.properties

  1. # 配置全局默认主键规则
  2. mybatis-plus.global-config.db-config.id-type=auto

完整application.properties

  1. # 端口号
  2. server.port=9999
  3. #===========数据库相关=============
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
  6. spring.datasource.username=root
  7. spring.datasource.password=root
  8. # 配置mybatis plus打印sql日志
  9. #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  10. # 默认配置路径
  11. mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml
  12. #配置全局配置文件!!!!
  13. mybatis-plus.config-location = classpath:mybatis-config.xml
  14. # 配置实体类别名
  15. mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model
  16. # mybatis plus下划线转驼峰
  17. mybatis-plus.configuration.map-underscore-to-camel-case=true
  18. # 配置全局默认主键规则
  19. mybatis-plus.global-config.db-config.id-type=auto

乐观锁

  大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般通过为数据库表增加一个“version”字段来实现。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据,库表对应记录的当前版本信息进行比较,如果提交的数据,版本号大于数据库表当前的版本号,则予以更新,否则认为是过期数据。

实体类增加@version

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

增加乐观锁插件

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

  1. package com.ybchen.shopmanager.config;
  2.  
  3. import com.baomidou.mybatisplus.annotation.DbType;
  4. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  5. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  6. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9.  
  10. /**
  11. * @Description:分页插件配置
  12. * @Author:chenyanbin
  13. * @Date:2021/3/5 下午10:32
  14. * @Versiion:1.0
  15. */
  16. @Configuration
  17. public class MybatisPlusPageConfig {
  18.  
  19. /**
  20. * 旧版本
  21. */
  22. // @Bean
  23. // public PaginationInterceptor paginationInterceptor() {
  24. // PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  25. // return paginationInterceptor;
  26. // }
  27.  
  28. /**
  29. * 新的分页插件,一级和二级缓存遵循mybatis的规则
  30. * 需要设置 MybatisConfiguration#useDeprecatedExecutor=false 避免缓存出现问题
  31. */
  32. @Bean
  33. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  34. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  35. //分页插件
  36. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  37. //乐观锁插件
  38. mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  39. return mybatisPlusInterceptor;
  40. }
  41. }

使用

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

  1. # 逻辑删除,删除是1
  2. mybatis-plus.global-config.db-config.logic-delete-value=1
  3. # 逻辑删除,未删除是0
  4. mybatis-plus.global-config.db-config.logic-not-delete-value=0
  5. # 如果java实体类没加注解@TableLogic,则可以配置这个,推荐这里配置
  6. mybatis-plus.global-config.db-config.logic-delete-field=deleted

代码生成器#
添加依赖#

  1. <!-- 代码自动生成依赖 begin -->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-generator</artifactId>
  5. <version>3.4.1</version>
  6. </dependency>
  7. <!-- velocity -->
  8. <dependency>
  9. <groupId>org.apache.velocity</groupId>
  10. <artifactId>velocity-engine-core</artifactId>
  11. <version>2.0</version>
  12. </dependency>
  13. <!-- 代码自动生成依赖 end-->

生成器类#

  1. package com.ybchen.shopmanager;
  2.  
  3. import com.baomidou.mybatisplus.annotation.DbType;
  4. import com.baomidou.mybatisplus.annotation.IdType;
  5. import com.baomidou.mybatisplus.generator.AutoGenerator;
  6. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  7. import com.baomidou.mybatisplus.generator.config.GlobalConfig;
  8. import com.baomidou.mybatisplus.generator.config.PackageConfig;
  9. import com.baomidou.mybatisplus.generator.config.StrategyConfig;
  10. import com.baomidou.mybatisplus.generator.config.rules.DateType;
  11. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  12.  
  13. /**
  14. * @Description:代码生成器
  15. * @Author:chenyanbin
  16. * @Date:2021/3/6 下午5:10
  17. * @Versiion:1.0
  18. */
  19. public class MyBatisPlusGenerator {
  20. public static void main(String[] args) {
  21. //1. 全局配置
  22. GlobalConfig config = new GlobalConfig();
  23. // 是否支持AR模式
  24. config.setActiveRecord(true)
  25. // 作者
  26. .setAuthor("chenyanbin")
  27. // 生成路径,最好使用绝对路径,window路径是不一样的
  28. .setOutputDir("/Users/chenyanbin/IdeaProjects/shop-manager")
  29. // 文件覆盖
  30. .setFileOverride(true)
  31. // 主键策略
  32. .setIdType(IdType.AUTO)
  33.  
  34. .setDateType(DateType.ONLY_DATE)
  35. // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
  36. .setServiceName("%sService")
  37.  
  38. //实体类结尾名称
  39. .setEntityName("%sDO")
  40.  
  41. //生成基本的resultMap
  42. .setBaseResultMap(true)
  43.  
  44. //不使用AR模式
  45. .setActiveRecord(false)
  46.  
  47. //生成基本的SQL片段
  48. .setBaseColumnList(true);
  49.  
  50. //2. 数据源配置
  51. DataSourceConfig dsConfig = new DataSourceConfig();
  52. // 设置数据库类型
  53. dsConfig.setDbType(DbType.MYSQL)
  54. .setDriverName("com.mysql.cj.jdbc.Driver")
  55. .setUrl("jdbc:mysql://127.0.0.1:3306/shop?useSSL=false")
  56. .setUsername("root")
  57. .setPassword("root");
  58.  
  59. //3. 策略配置globalConfiguration中
  60. StrategyConfig stConfig = new StrategyConfig();
  61.  
  62. //全局大写命名
  63. stConfig.setCapitalMode(true)
  64. // 数据库表映射到实体的命名策略
  65. .setNaming(NamingStrategy.underline_to_camel)
  66.  
  67. //使用lombok
  68. .setEntityLombokModel(true)
  69.  
  70. //使用restcontroller注解
  71. .setRestControllerStyle(true)
  72.  
  73. // 生成的表, 支持多表一起生成,以数组形式填写
  74. .setInclude("product","banner","address","coupon","product_order");
  75.  
  76. //4. 包名策略配置
  77. PackageConfig pkConfig = new PackageConfig();
  78. pkConfig.setParent("net.mybatisplus")
  79. .setMapper("mapper")
  80. .setService("service")
  81. .setController("controller")
  82. .setEntity("model")
  83. .setXml("mapper");
  84.  
  85. //5. 整合配置
  86. AutoGenerator ag = new AutoGenerator();
  87. ag.setGlobalConfig(config)
  88. .setDataSource(dsConfig)
  89. .setStrategy(stConfig)
  90. .setPackageInfo(pkConfig);
  91.  
  92. //6. 执行操作
  93. ag.execute();
  94. System.out.println("======= 代码生成完毕 ========");
  95. }
  96. }

使用#

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

SpringBoot整合Swagger 3.x

添加依赖

  1. <!--springBoot整合swagger3.0-->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-boot-starter</artifactId>
  5. <version>3.0.0</version>
  6. </dependency>

修改application.properties

添加如下信息

  1. spring.application.name=shop-manager
  2. # ===== 自定义swagger配置 ===== #
  3. swagger.enable=true
  4. swagger.application-name= ${spring.application.name}
  5. swagger.application-version=1.0
  6. swagger.application-description=shop api

配置类

  1. package com.ybchen.shopmanager.config;
  2.  
  3. import io.swagger.annotations.ApiOperation;
  4. import lombok.Data;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.stereotype.Component;
  8. import springfox.documentation.builders.ApiInfoBuilder;
  9. import springfox.documentation.builders.PathSelectors;
  10. import springfox.documentation.builders.RequestHandlerSelectors;
  11. import springfox.documentation.oas.annotations.EnableOpenApi;
  12. import springfox.documentation.service.ApiInfo;
  13. import springfox.documentation.service.Contact;
  14. import springfox.documentation.spi.DocumentationType;
  15. import springfox.documentation.spring.web.plugins.Docket;
  16.  
  17. /**
  18. * @Description:swagger配置类
  19. * @Author:chenyanbin
  20. * @Date:2021/3/5 下午10:32
  21. * @Versiion:1.0
  22. */
  23. @Component
  24. @Data
  25. @ConfigurationProperties("swagger")
  26. @EnableOpenApi
  27. public class SwaggerConfiguration {
  28.  
  29. /**
  30. * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量
  31. */
  32. private Boolean enable;
  33.  
  34. /**
  35. * 项目应用名
  36. */
  37. private String applicationName;
  38.  
  39. /**
  40. * 项目版本信息
  41. */
  42. private String applicationVersion;
  43.  
  44. /**
  45. * 项目描述信息
  46. */
  47. private String applicationDescription;
  48.  
  49. @Bean
  50. public Docket docket(){
  51.  
  52. return new Docket(DocumentationType.OAS_30)
  53. .pathMapping("/")
  54. // 定义是否开启swagger,false为关闭,可以通过变量控制,线上关闭
  55. .enable(enable)
  56. //配置api文档元信息
  57. .apiInfo(apiInfo())
  58. // 选择哪些接口作为swagger的doc发布
  59. .select()
  60. //apis() 控制哪些接口暴露给swagger,
  61. // RequestHandlerSelectors.any() 所有都暴露
  62. // RequestHandlerSelectors.basePackage("net.ybchen.*") 指定包位置
  63. // withMethodAnnotation(ApiOperation.class)标记有这个注解 ApiOperation
  64. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  65. .paths(PathSelectors.any())
  66. .build();
  67.  
  68. }
  69.  
  70. private ApiInfo apiInfo() {
  71. return new ApiInfoBuilder()
  72. .title(applicationName)
  73. .description(applicationDescription)
  74. .contact(new Contact("陈彦斌", "https://www.cnblogs.com/chenyanbin/", "543210188@qq.com"))
  75. .version(applicationVersion)
  76. .build();
  77. }
  78. }

启动测试

  访问地址:http://localhost:9999/swagger-ui/index.html

  注意:如果访问不成功,看是否拦截器拦截了相关资源!!!!!

SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

常用注解

@Api

用在controller类,描述API接口

  1. @Api(tags = "用户模块",value = "用户UserController")
  2. public class UserController {
  3. }

@ApiOperation#

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

  1. @ApiOperation("分页用户列表")
  2. @GetMapping("list")
  3. public JsonData list(){
  4. return JsonData.buildSuccess();
  5. }

@ApiParam#

方法参数配置,用在入参上面,描述参数

  1. @ApiOperation("用户登录")
  2. @PostMapping("login")
  3. public JsonData login(
  4. @ApiParam(name = "phone", value = "手机号",example = "13888888888")
  5. @RequestParam("phone") String phone,
  6. @ApiParam(name = "pwd", value = "密码",example = "123456")
  7. @RequestParam("pwd")String pwd){
  8. return JsonData.buildSuccess();
  9. }

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

  1. @ApiIgnore
  2. @ApiOperation("删除用户")
  3. @DeleteMapping("/delete/{id}")
  4. public JsonData deleteById(@PathVariable int id) {
  5. return JsonData.buildSuccess();
  6. }

@ApiModel#
用于类,表示对类进行说明,用于参数,用实体类接收
@ApiModelProperty#
用于方法,字段;表示对model属性的说明或者数据操作更改
value:字段说明
name:重写属性名称
dataType:重写属性类型
required:是否必填
example:举例说明
hidden:隐藏
@Data
@ApiModel("用户基本信息")

  1. public class SaveUserRequest {
  2. private int age;
  3. private String pwd;
  4. @ApiModelProperty(value ="【必填】邮箱",required = true)
  5. private String email;
  6. @ApiModelProperty("【必填】手机号")
  7. private String phone;
  8. @ApiModelProperty(value="创建时间")
  9. private Date createTime;
  10. }

@ApiResponse#
描述接口响应

  1. @ApiOperation("用户登录")
  2. @PostMapping("login")
  3. @ApiResponses({
  4. @ApiResponse(responseCode = CodeStatus.SUCCESS, description = "保存成功"),
  5. @ApiResponse(responseCode = CodeStatus.FAIL, description = "保存失败")
  6. })
  7. public JsonData login(
  8. @ApiParam(name = "phone", value = "手机号",example = "13888888888")
  9. @RequestParam("phone") String phone,
  10. @ApiParam(name = "pwd", value = "密码",example = "123456")
  11. @RequestParam("pwd")String pwd){
  12. return JsonData.buildSuccess();
  13. }

项目源码下载

链接: https://pan.baidu.com/s/1OaOG0xK6jl8zDweAMkggAQ 提取码: ed54

到此这篇关于SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI的文章就介绍到这了,更多相关SpringBoot Lombok+MybatisPlus+SwaggerUI内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/chenyanbin/p/mybatis-plus.html

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部