導讀
- Lombok:可以讓你的POJO代碼特別簡潔,不止簡單在BO/VO/DTO/DO等大量使用,還有設計模式,物件對比等
- MybatisPlus:增加版Mybatis,基礎的資料庫CRUD、分頁等可以直接生成使用,避免了大量的重復低效代碼,還有資料庫自動Java類,sql檔案等等,比傳統的更賤簡介易用
- SwaggerUI:介面檔案自動生成,對接前端和測驗更加方便,基于業界的OpennApi規范,采用Swagger3.x版本,
技術堆疊
SpringBoot2.4+ MybatisPlus+Lombok+Swagger3.x+jdk8+IDEA
在線構建專案
點我直達

什么是lombok
官網
點我直達
一個優秀的Java代碼庫,簡化了Java的編碼,為Java代碼的精簡提供了一種方式
添加依賴
<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!--scope=provided,說明它是在編譯階段生效,不需要打入包中,Lombok在編譯期將帶Lombok注解的Java檔案正確編譯為完整的Class檔案--> <scope>provided</scope> </dependency>
常見注解@Getter/@Setter
- 作用類上,生成所有成員變數的getter/setter方法
- 作用于成員變數上,生成該成員變數的getter/setter方法
- 方法控制訪問級別set和get注解加上@Getter(AccessLevel.PROTECTED)
編譯查看位元組碼
mvn compile


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 @Setter public class User { //不想生成get方法 @Getter(AccessLevel.NONE) int id; //只會去生成get final String name = "alex"; String phone; //靜態成員變數不會生成set/get方法 static final String pwd = "123"; }
@NonNull
- 作用于方法上或者屬性,用于非空判斷,如果為空則拋例外

@NoArgsContructor
- 生成無參構造器

@AllArgsConstructor
- 生成全參構造器

@RequiredArgsConstructor
指定引數的建構式,有以下的特征的欄位
- final型別未被初始化的屬性,標記了@NonNull的屬性
- 注意:@NoArgsConstructor不能添加

@ToString
- List或者其他集合除錯不方便
- 控制臺或者日志輸出物件,默認列印的是記憶體地址
- 作用于類,覆寫默認的toString()方法

不包括某個欄位
@ToString(exclude={"age"})
只輸出某個欄位
@ToString(of={"name"})

為什么物件要重寫hashcode和equal方法
HashCode方法
- 頂級類Object里面的方法,所有類都是繼承Object的,回傳值Int型別
- 根據一定的hash規則(存盤地址,欄位,或者長度等),映射成一個數值,即散列值
Equals方法
- 頂級類Object里面的方法,所有類都是繼承Object的,回傳值boolean型別
- 根據自定義的匹配規則,用于匹配兩個物件是否一樣,一般邏輯如下
1、判斷地址是否一樣 2、非空判斷和class型別判斷 3、強轉 4、物件里面的欄位一一匹配
決議
如果兩個物件相等,那么它們的hashCode()值一定相同,如果兩個物件hashCode()相等,它們并不一定相等,在散串列中hashCode()相等,即兩個鍵值的哈希值相等,然后哈希值相等,并不一定得出鍵值對相等,就出現所謂的哈希沖突場景,還需要equals方法判斷物件是否相等,
應用場景
當向集合中插入物件時,如何判別在集合中是否已經存在該物件,比如Set確保存盤物件的唯一值,并判斷是否同一個物件呢?
依據hashCode和equals進行判斷
所以Set存盤的物件必須重寫這兩個方法,判斷兩個物件是否一樣
首先判斷插入物件的hashCode值是否存在,hashCode值不存在則直接插入集合;值存在則還需要判斷equals方法判斷物件是否相等

@EqualsAndHashCode
- 作用于類,覆寫默認的equals和hashCode,作用于全部屬性
- 不包含某個屬性
- @EqualsAndHashCode(exclude={"id"})
- 只輸出某個屬性
- @EqualsAndHashCode(of={"id"})

@Data
- 作用于類上,是以下注解的集合
- @ToString
- @EqualsAndHashCode
- @Getter
- @Setter
- @RequiredArgsConstructor

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

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

MybatisPlus
介紹
- 官網:點我直達
- 是一個mybatis的增強工具,在Mybatis的基礎上只做強增不做改變,為簡化開發,提高效率
資料庫腳本
/* Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50728 Source Host : localhost:3306 Source Schema : shop Target Server Type : MySQL Target Server Version : 50728 File Encoding : 65001 Date: 04/03/2021 22:17:20 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for address -- ---------------------------- DROP TABLE IF EXISTS `address`; CREATE TABLE `address` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL COMMENT '用戶id', `default_status` int(1) DEFAULT NULL COMMENT '是否默認識訓地址:0->否;1->是', `receive_name` varchar(64) DEFAULT NULL COMMENT '收發貨人姓名', `phone` varchar(64) DEFAULT NULL COMMENT '識訓人電話', `province` varchar(64) DEFAULT NULL COMMENT '省/直轄市', `city` varchar(64) DEFAULT NULL COMMENT '市', `region` varchar(64) DEFAULT NULL COMMENT '區', `detail_address` varchar(200) DEFAULT NULL COMMENT '詳細地址', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='電商-公司收發貨地址表'; -- ---------------------------- -- Records of address -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for banner -- ---------------------------- DROP TABLE IF EXISTS `banner`; CREATE TABLE `banner` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `img` varchar(524) DEFAULT NULL COMMENT '圖片', `url` varchar(524) DEFAULT NULL COMMENT '跳轉地址', `weight` int(11) DEFAULT NULL COMMENT '權重', `version` int(11) DEFAULT '1', `deleted` int(11) DEFAULT '0' COMMENT '0是未洗掉,1是已經洗掉', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of banner -- ---------------------------- BEGIN; INSERT INTO `banner` VALUES (1, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 1, 2, 1); INSERT INTO `banner` VALUES (2, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 3, 1, 0); INSERT INTO `banner` VALUES (3, 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 'https://www.cnblogs.com/chenyanbin/', 2, 1, 0); INSERT INTO `banner` VALUES (7, 'werw', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); INSERT INTO `banner` VALUES (8, '666666', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); INSERT INTO `banner` VALUES (9, 'sdfds', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); INSERT INTO `banner` VALUES (10, '323232', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); INSERT INTO `banner` VALUES (11, '532', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); INSERT INTO `banner` VALUES (12, '6666', 'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg', 2, 1, 0); COMMIT; -- ---------------------------- -- Table structure for coupon -- ---------------------------- DROP TABLE IF EXISTS `coupon`; CREATE TABLE `coupon` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `category` varchar(11) DEFAULT NULL COMMENT '優惠卷型別[NEW_USER注冊贈券,TASK任務卷,PROMOTION促銷劵]', `publish` varchar(11) DEFAULT NULL COMMENT '發布狀態, PUBLISH發布,DRAFT草稿,OFFLINE下線', `coupon_img` varchar(524) DEFAULT NULL COMMENT '優惠券圖片', `coupon_title` varchar(128) DEFAULT NULL COMMENT '優惠券標題', `price` decimal(16,2) DEFAULT NULL COMMENT '抵扣價格', `user_limit` int(11) DEFAULT NULL COMMENT '每人限制張數', `start_time` datetime DEFAULT NULL COMMENT '優惠券開始有效時間', `end_time` datetime DEFAULT NULL COMMENT '優惠券失效時間', `publish_count` int(11) DEFAULT NULL COMMENT '優惠券總量', `stock` int(11) DEFAULT '0' COMMENT '庫存', `add_one` int(11) DEFAULT NULL COMMENT '是否疊加0是不行,1是可以', `create_time` datetime DEFAULT NULL, `condition_price` decimal(16,2) DEFAULT NULL COMMENT '滿多少才可以使用', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of coupon -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for product -- ---------------------------- DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) DEFAULT NULL COMMENT '標題', `cover_img` varchar(128) DEFAULT NULL COMMENT '封面圖', `detail` varchar(256) DEFAULT '' COMMENT '詳情', `old_price` decimal(16,2) DEFAULT NULL COMMENT '老價格', `price` decimal(16,2) DEFAULT NULL COMMENT '新價格', `stock` int(11) DEFAULT NULL COMMENT '庫存', `create_time` datetime DEFAULT NULL COMMENT '創建時間', `lock_stock` int(11) DEFAULT '0' COMMENT '鎖定庫存', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of product -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for product_order -- ---------------------------- DROP TABLE IF EXISTS `product_order`; CREATE TABLE `product_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `out_trade_no` varchar(64) DEFAULT NULL COMMENT '訂單唯一標識', `state` varchar(11) DEFAULT NULL COMMENT 'NEW 未支付訂單,PAY已經支付訂單,CANCEL超時取消訂單', `create_time` datetime DEFAULT NULL COMMENT '訂單生成時間', `total_fee` decimal(16,2) DEFAULT NULL COMMENT '訂單總金額', `pay_fee` decimal(16,2) DEFAULT NULL COMMENT '訂單實際支付價格', `pay_type` varchar(64) DEFAULT NULL COMMENT '支付型別,微信-銀行-支付寶', `nickname` varchar(64) DEFAULT NULL COMMENT '昵稱', `head_img` varchar(524) DEFAULT NULL COMMENT '頭像', `user_id` int(11) DEFAULT NULL COMMENT '用戶id', `del` int(5) DEFAULT '0' COMMENT '0表示未洗掉,1表示已經洗掉', `update_time` datetime DEFAULT NULL COMMENT '更新時間', `order_type` varchar(32) DEFAULT NULL COMMENT '訂單型別 DAILY普通單,PROMOTION促銷訂單', `receiver_address` varchar(1024) DEFAULT NULL COMMENT '識訓地址 json存盤', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of product_order -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for product_order_item -- ---------------------------- DROP TABLE IF EXISTS `product_order_item`; CREATE TABLE `product_order_item` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `product_order_id` bigint(11) DEFAULT NULL COMMENT '訂單號', `out_trade_no` varchar(32) DEFAULT NULL, `product_id` bigint(11) DEFAULT NULL COMMENT '產品id', `product_name` varchar(128) DEFAULT NULL COMMENT '商品名稱', `product_img` varchar(524) DEFAULT NULL COMMENT '商品圖片', `buy_num` int(11) DEFAULT NULL COMMENT '購買數量', `create_time` datetime DEFAULT NULL, `total_fee` decimal(16,2) DEFAULT NULL COMMENT '購物項商品總價格', `pay_fee` decimal(16,0) DEFAULT NULL COMMENT '購物項商品支付總價格', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of product_order_item -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL COMMENT '昵稱', `pwd` varchar(124) DEFAULT NULL COMMENT '密碼', `head_img` varchar(524) DEFAULT NULL COMMENT '頭像', `slogan` varchar(524) DEFAULT NULL COMMENT '用戶簽名', `sex` tinyint(2) DEFAULT '1' COMMENT '0表示女,1表示男', `points` int(10) DEFAULT '0' COMMENT '積分', `create_time` datetime DEFAULT NULL, `mail` varchar(64) DEFAULT NULL COMMENT '郵箱', `secret` varchar(12) DEFAULT NULL COMMENT '鹽,用于個人敏感資訊處理', PRIMARY KEY (`id`), UNIQUE KEY `mail_idx` (`mail`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- BEGIN; COMMIT; SET FOREIGN_KEY_CHECKS = 1;建表陳述句
添加依賴
pom.xml
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus和spring boot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ybchen</groupId> <artifactId>shop-manager</artifactId> <version>0.0.1-SNAPSHOT</version> <name>shop-manager</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!--scope=provided,說明它是在編譯階段生效,不需要打入包中,Lombok在編譯期將帶Lombok注解的Java檔案正確編譯為完整的Class檔案--> <scope>provided</scope> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus和spring boot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- 代碼庫 --> <repositories> <repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>完整pom.xml
組態檔
application.properties
# 埠號 server.port=9999 #===========資料庫相關============= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root
配置SpringBoot掃描路徑
啟動類上添加:@MapperScan("Mapper全包路徑")

SpringBoot整合MybatisPlus
統一介面回傳協議
package com.ybchen.shopmanager.utils; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class JsonData implements Serializable { /** * 狀態碼 0 表示成功,1 表示處理中,-1表示失敗 */ private Integer code; /** * 資料 */ private Object data; /** * 描述資訊 */ private String msg; /** * 成功,無傳入資料 * * @return */ public static JsonData buildSuccess() { return new JsonData(0, null, null); } /** * 成功,有傳入資料 * * @param data 資料 * @return */ public static JsonData buildSuccess(Object data) { return new JsonData(0, data, null); } /** * 失敗,有回傳錯誤資訊 * * @param msg 描述資訊 * @return */ public static JsonData buildError(String msg) { return new JsonData(-1, null, msg); } /** * 失敗,有狀態碼,描述資訊 * * @param code 狀態碼 * @param msg 描述資訊 * @return */ public static JsonData buildError(Integer code, String msg) { return new JsonData(code, null, msg); } /** * 是否回傳成功 * @param jsonData * @return */ public static boolean isSuccess(JsonData jsonData) { return jsonData.getCode() == 0; } }
物體類
package com.ybchen.shopmanager.model; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @Description:輪播圖 * @Author:chenyanbin * @Date:2021/3/4 下午11:00 * @Versiion:1.0 */ @Data //資料庫表名 @TableName("banner") public class BannerDO { /** * 主鍵 */ private Integer id; /** * 圖片 */ private String img; /** * url跳轉地址 */ private String url; /** * 權重 */ private Integer weight; /** * 版本號 */ private Integer version; /** * 0是未洗掉,1是已經洗掉 */ private Integer deleted; }
Service
package com.ybchen.shopmanager.service; import com.ybchen.shopmanager.model.BannerDO; import java.util.List; public interface BannerService { List<BannerDO> list(); }
package com.ybchen.shopmanager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ybchen.shopmanager.mapper.BannerMapper; import com.ybchen.shopmanager.model.BannerDO; import com.ybchen.shopmanager.service.BannerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @Description:輪播圖Service * @Author:chenyanbin * @Date:2021/3/4 下午11:04 * @Versiion:1.0 */ @Service public 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()); } }
測驗

單元測驗+控制臺列印sql
單元測驗
package com.ybchen.shopmanager; import com.ybchen.shopmanager.model.BannerDO; import com.ybchen.shopmanager.service.BannerService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; //classes=啟動類.class @SpringBootTest(classes = ShopManagerApplication.class) @Slf4j public 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
測驗

BaseMapper
- Mapper繼承該介面后,無需撰寫mapper.xml檔案,即可獲得CRUD功能
/* * Copyright (c) 2011-2020, baomidou ([email protected]). * <p> * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * https://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.core.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; /* :` .:, :::,,. :: `:::::: ::` `,:,` .:` `:: `::::::::.:` `:';,` ::::, .:::` `@++++++++: `` :::` @+++++++++++# :::, #++++++++++++++` ,: `::::::;'##++++++++++ .@#@;` ::::::::::::::::::::; #@####@, :::::::::::::::+#;::. @@######+@:::::::::::::. #@:; , @@########':::::::::::: .#''':` ;##@@@+:##########@::::::::::: @#;.,:. #@@@######++++#####'::::::::: .##+,:#` @@@@@#####+++++'#####+::::::::` ,`::@#:` `@@@@#####++++++'#####+#':::::::::::@. @@@@######+++++''#######+##';::::;':,` @@@@#####+++++'''#######++++++++++` #@@#####++++++''########++++++++' `#@######+++++''+########+++++++; `@@#####+++++''##########++++++, @@######+++++'##########+++++#` @@@@#####+++++############++++; ;#@@@@@####++++##############+++, @@@@@@@@@@@###@###############++' @#@@@@@@@@@@@@###################+: `@#@@@@@@@@@@@@@@###################'` :@#@@@@@@@@@@@@@@@@@##################, ,@@@@@@@@@@@@@@@@@@@@################; ,#@@@@@@@@@@@@@@@@@@@##############+` .#@@@@@@@@@@@@@@@@@@#############@, @@@@@@@@@@@@@@@@@@@###########@, :#@@@@@@@@@@@@@@@@##########@, `##@@@@@@@@@@@@@@@########+, `+@@@@@@@@@@@@@@@#####@:` `:@@@@@@@@@@@@@@##@;. `,'@@@@##@@@+;,` ``...`` _ _ /_ _ _/_. ____ / _ / / //_//_//_|/ /_\ /_///_/_\ Talk is cheap. Show me the code. _/ / */ /** * Mapper 繼承該介面后,無需撰寫 mapper.xml 檔案,即可獲得CRUD功能 * <p>這個 Mapper 支持 id 泛型</p> * * @author hubin * @since 2016-01-23 */ public interface BaseMapper<T> extends Mapper<T> { /** * 插入一條記錄 * * @param entity 物體物件 */ int insert(T entity); /** * 根據 ID 洗掉 * * @param id 主鍵ID */ int deleteById(Serializable id); /** * 根據 columnMap 條件,洗掉記錄 * * @param columnMap 表欄位 map 物件 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據 entity 條件,洗掉記錄 * * @param wrapper 物體物件封裝操作類(可以為 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 洗掉(根據ID 批量洗掉) * * @param idList 主鍵ID串列(不能為 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 根據 ID 修改 * * @param entity 物體物件 */ int updateById(@Param(Constants.ENTITY) T entity); /** * 根據 whereEntity 條件,更新記錄 * * @param entity 物體物件 (set 條件值,可以為 null) * @param updateWrapper 物體物件封裝操作類(可以為 null,里面的 entity 用于生成 where 陳述句) */ int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); /** * 根據 ID 查詢 * * @param id 主鍵ID */ T selectById(Serializable id); /** * 查詢(根據ID 批量查詢) * * @param idList 主鍵ID串列(不能為 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 查詢(根據 columnMap 條件) * * @param columnMap 表欄位 map 物件 */ List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根據 entity 條件,查詢一條記錄 * * @param queryWrapper 物體物件封裝操作類(可以為 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢總記錄數 * * @param queryWrapper 物體物件封裝操作類(可以為 null) */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 entity 條件,查詢全部記錄 * * @param queryWrapper 物體物件封裝操作類(可以為 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄 * * @param queryWrapper 物體物件封裝操作類(可以為 null) */ List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄 * <p>注意: 只回傳第一個欄位的值</p> * * @param queryWrapper 物體物件封裝操作類(可以為 null) */ List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 entity 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 物體物件封裝操作類(可以為 null) */ <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件 * @param queryWrapper 物體物件封裝操作類 */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); }
Mybatis plus常用注解
- @TableName:用于定義表名
- @TableId:用于定義表的主鍵
- value:用于定義主鍵欄位名
- type:用于定義主鍵型別(主鍵策略 IdType)
- IdType.AUTO:主鍵自增,系統分配,不需要手動輸入
- IdType.NODE:未設定主鍵
- IdType.INPUT:需要自己輸入主鍵值
- IdType.ASSIGN_ID:系統分配ID,用于數值型資料(Long,對應mysql中的BIGINT型別)
- IdType.ASSIGN_UUID:系統分配uuid,用于字串型資料
- TableField:用于定義表的非主鍵欄位
- value:用于定義非主鍵欄位名,用于別名匹配,假如java物件和資料庫屬性不一樣
- exist:用于指明是否為資料表的欄位,true表示是,false為不是
- fill:用于指定欄位填充策略,一般用于填充:創建時間、修改時間等欄位
- FieldFill.DEFAULT:默認不填充
- FieldFill.INSERT:插入時填充
- FieldFill.UPDATE:更新時填充
- FieldFill.INSERT_UPDATE:插入、更新時填充
QueryWrapper/LambdaQueryWrapper
可以封裝sql物件,包括where條件,order by排序
- eq:等于
- ne:不等于
- gt:大于
- ge:大于等于
- lt:小于
- le:小于等于
- or:拼接or
- between:兩個值中間
- notBetween:不在兩個值中間
- like:模糊匹配
- notLike:不像
- likeLeft:左匹配
- likeRight:右邊匹配
- isNull:欄位為空
- in:in查詢
- groupBy:分組
- orderByAsc:升序
- orderByDesc:降序
- having:having查詢
分頁插件
配置類
package com.ybchen.shopmanager.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Description:分頁插件配置 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */ @Configuration public class MybatisPlusPageConfig { /** * 舊版本 */ // @Bean // public PaginationInterceptor paginationInterceptor() { // PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // return paginationInterceptor; // } /** * 新的分頁插件,一級和二級快取遵循mybatis的規則 * 需要設定 MybatisConfiguration#useDeprecatedExecutor=false 避免快取出現問題 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; } }
演示

自定義xml的sql腳本
新建xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--這個名稱空間是Mapper介面的路徑--> <mapper namespace="com.ybchen.shopmanager.mapper.BannerMapper"> <select id="getList" resultType="com.ybchen.shopmanager.model.BannerDO"> select * from banner </select> </mapper>
BannerMapper.java添加方法
package com.ybchen.shopmanager.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ybchen.shopmanager.model.BannerDO; import java.util.List; /** * @Description:輪播圖Mapper * @Author:chenyanbin * @Date:2021/3/4 下午11:03 * @Versiion:1.0 */ public interface BannerMapper extends BaseMapper<BannerDO> { List<BannerDO> getList(); }
組態檔告訴mapper.xml路徑
application.properties
# 默認配置路徑
mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml
測驗

全域組態檔
- 注意config-location和configuration不能同時出現
修改組態檔
application.properties
#配置全域組態檔!!!!
mybatis-plus.config-location = classpath:mybatis-config.xml
新建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!--控制臺輸出日志--> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration>
測驗

配置物體類別名
修改application.properties
# 配置物體類別名
mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model
測驗

mybatis plus下劃線轉駝峰
- 默認就是true
修改application.properties
# mybatis plus下劃線轉駝峰
mybatis-plus.configuration.map-underscore-to-camel-case=true
配置全域默認主鍵型別
- 物體類上就不用加 @TableId(value="https://www.cnblogs.com/chenyanbin/archive/2021/03/06/id",type=IdType.AUTO)
修改application.properties
# 配置全域默認主鍵規則
mybatis-plus.global-config.db-config.id-type=auto
完整application.properties
# 埠號 server.port=9999 #===========資料庫相關============= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root # 配置mybatis plus列印sql日志 #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 默認配置路徑 mybatis-plus.mapper-locations=classpath*:/mapper/*Mapper.xml #配置全域組態檔!!!! mybatis-plus.config-location = classpath:mybatis-config.xml # 配置物體類別名 mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model # mybatis plus下劃線轉駝峰 mybatis-plus.configuration.map-underscore-to-camel-case=true # 配置全域默認主鍵規則 mybatis-plus.global-config.db-config.id-type=auto
樂觀鎖
大多是基于資料版本(Version)記錄機制實作,即為資料增加一個版本標識,在基于資料庫表的版本解決方案中,一般通過為資料庫表增加一個“version”欄位來實作,讀取資料時,將此版本號一同讀出,之后更新時,對此版本號加一,此時,將提交資料的版本資料與資料,庫表對應記錄的當前版本資訊進行比較,如果提交的資料,版本號大于資料庫表當前的版本號,則予以更新,否則認為是過期資料,
物體類增加@version

增加樂觀鎖插件

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


注意
- 樂觀鎖資料型別支持int、Integer、long、timestamp
- 僅支持updateById和update方法
邏輯洗掉
公司在設計規范中都加入了邏輯洗掉的強制規定,運營人員可以分析和審查資料,也方便將資料沉淀下來用于商業分析,
資料量過多,也會采用資料倉庫,通過監聽應用資料庫的資料變化,進行遷移到資料倉庫,
方式一
- 資料庫增加deleted欄位,0是未洗掉,1表示洗掉
- 物體類增加屬性配置@TableLogic
- 查詢的時候會自動拼接上deleted=0的檢索條件



方式二
修改application.properties

# 邏輯洗掉,洗掉是1
mybatis-plus.global-config.db-config.logic-delete-value=https://www.cnblogs.com/chenyanbin/archive/2021/03/06/1
# 邏輯洗掉,未洗掉是0
mybatis-plus.global-config.db-config.logic-not-delete-value=0
# 如果java物體類沒加注解@TableLogic,則可以配置這個,推薦這里配置
mybatis-plus.global-config.db-config.logic-delete-field=deleted
代碼生成器
添加依賴
<!-- 代碼自動生成依賴 begin --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <!-- velocity --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <!-- 代碼自動生成依賴 end-->
生成器類
package com.ybchen.shopmanager; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; /** * @Description:代碼生成器 * @Author:chenyanbin * @Date:2021/3/6 下午5:10 * @Versiion:1.0 */ public class MyBatisPlusGenerator { public static void main(String[] args) { //1. 全域配置 GlobalConfig config = new GlobalConfig(); // 是否支持AR模式 config.setActiveRecord(true) // 作者 .setAuthor("chenyanbin") // 生成路徑,最好使用絕對路徑,window路徑是不一樣的 .setOutputDir("/Users/chenyanbin/IdeaProjects/shop-manager") // 檔案覆寫 .setFileOverride(true) // 主鍵策略 .setIdType(IdType.AUTO) .setDateType(DateType.ONLY_DATE) // 設定生成的service介面的名字的首字母是否為I,默認Service是以I開頭的 .setServiceName("%sService") //物體類結尾名稱 .setEntityName("%sDO") //生成基本的resultMap .setBaseResultMap(true) //不使用AR模式 .setActiveRecord(false) //生成基本的SQL片段 .setBaseColumnList(true); //2. 資料源配置 DataSourceConfig dsConfig = new DataSourceConfig(); // 設定資料庫型別 dsConfig.setDbType(DbType.MYSQL) .setDriverName("com.mysql.cj.jdbc.Driver") .setUrl("jdbc:mysql://127.0.0.1:3306/shop?useSSL=false") .setUsername("root") .setPassword("root"); //3. 策略配置globalConfiguration中 StrategyConfig stConfig = new StrategyConfig(); //全域大寫命名 stConfig.setCapitalMode(true) // 資料庫表映射到物體的命名策略 .setNaming(NamingStrategy.underline_to_camel) //使用lombok .setEntityLombokModel(true) //使用restcontroller注解 .setRestControllerStyle(true) // 生成的表, 支持多表一起生成,以陣列形式填寫 .setInclude("product","banner","address","coupon","product_order"); //4. 包名策略配置 PackageConfig pkConfig = new PackageConfig(); pkConfig.setParent("net.mybatisplus") .setMapper("mapper") .setService("service") .setController("controller") .setEntity("model") .setXml("mapper"); //5. 整合配置 AutoGenerator ag = new AutoGenerator(); ag.setGlobalConfig(config) .setDataSource(dsConfig) .setStrategy(stConfig) .setPackageInfo(pkConfig); //6. 執行操作 ag.execute(); System.out.println("======= 代碼生成完畢 ========"); } }
使用

SpringBoot整合Swagger 3.x
添加依賴
<!--springBoot整合swagger3.0--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
修改application.properties
添加如下資訊
spring.application.name=shop-manager
# ===== 自定義swagger配置 ===== #
swagger.enable=true
swagger.application-name= ${spring.application.name}
swagger.application-version=1.0
swagger.application-description=shop api
配置類
package com.ybchen.shopmanager.config; import io.swagger.annotations.ApiOperation; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; /** * @Description:swagger配置類 * @Author:chenyanbin * @Date:2021/3/5 下午10:32 * @Versiion:1.0 */ @Component @Data @ConfigurationProperties("swagger") @EnableOpenApi public class SwaggerConfiguration { /** * 是否開啟swagger,生產環境一般關閉,所以這里定義一個變數 */ private Boolean enable; /** * 專案應用名 */ private String applicationName; /** * 專案版本資訊 */ private String applicationVersion; /** * 專案描述資訊 */ private String applicationDescription; @Bean public Docket docket(){ return new Docket(DocumentationType.OAS_30) .pathMapping("/") // 定義是否開啟swagger,false為關閉,可以通過變數控制,線上關閉 .enable(enable) //配置api檔案元資訊 .apiInfo(apiInfo()) // 選擇哪些介面作為swagger的doc發布 .select() //apis() 控制哪些介面暴露給swagger, // RequestHandlerSelectors.any() 所有都暴露 // RequestHandlerSelectors.basePackage("net.ybchen.*") 指定包位置 // withMethodAnnotation(ApiOperation.class)標記有這個注解 ApiOperation .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(applicationName) .description(applicationDescription) .contact(new Contact("陳彥斌", "https://www.cnblogs.com/chenyanbin/", "[email protected]")) .version(applicationVersion) .build(); } }
啟動測驗
訪問地址:http://localhost:9999/swagger-ui/index.html
注意:如果訪問不成功,看是否攔截器攔截了相關資源!!!!!

常用注解
@Api
- 用在controller類,描述API介面
@Api(tags = "用戶模塊",value = "https://www.cnblogs.com/chenyanbin/archive/2021/03/06/用戶UserController") public class UserController { }
@ApiOperation
- 介面配置,用在方法上,描述介面方法
@ApiOperation("分頁用戶串列")
@GetMapping("list")
public JsonData list(){
?
return JsonData.buildSuccess();
}
@ApiParam
- 方法引數配置,用在入參上面,描述引數
@ApiOperation("用戶登錄")
@PostMapping("login")
public JsonData login(
@ApiParam(name = "phone", value = "https://www.cnblogs.com/chenyanbin/archive/2021/03/06/手機號",example = "13888888888")
@RequestParam("phone") String phone,
?
@ApiParam(name = "pwd", value = "https://www.cnblogs.com/chenyanbin/archive/2021/03/06/密碼",example = "123456")
@RequestParam("pwd")String pwd){
?
return JsonData.buildSuccess();
}
@Apilgnore
- 忽略此介面不生成檔案
@ApiIgnore @ApiOperation("洗掉用戶") @DeleteMapping("/delete/{id}") public JsonData deleteById(@PathVariable int id) { return JsonData.buildSuccess(); }
@ApiModel
- 用于類,表示對類進行說明,用于引數,用物體類接收
@ApiModelProperty
- 用于方法,欄位;表示對model屬性的說明或者資料操作更改
- value:欄位說明
- name:重寫屬性名稱
- dataType:重寫屬性型別
- required:是否必填
- example:舉例說明
- hidden:隱藏
@Data @ApiModel("用戶基本資訊") public class SaveUserRequest { ? private int age; ? private String pwd; ? @ApiModelProperty(value ="【必填】郵箱",required = true) private String email; ? @ApiModelProperty("【必填】手機號") private String phone; ? @ApiModelProperty(value="創建時間") private Date createTime; ? }
@ApiResponse
- 描述介面回應
@ApiOperation("用戶登錄")
@PostMapping("login")
@ApiResponses({
@ApiResponse(responseCode = CodeStatus.SUCCESS, description = "保存成功"),
@ApiResponse(responseCode = CodeStatus.FAIL, description = "保存失敗")
})
public JsonData login(
@ApiParam(name = "phone", value = "https://www.cnblogs.com/chenyanbin/archive/2021/03/06/手機號",example = "13888888888")
@RequestParam("phone") String phone,
?
@ApiParam(name = "pwd", value = "https://www.cnblogs.com/chenyanbin/archive/2021/03/06/密碼",example = "123456")
@RequestParam("pwd")String pwd){
?
return JsonData.buildSuccess();
}
專案原始碼下載
鏈接: https://pan.baidu.com/s/1w9i5T8lqURG4vkVTdlhvdA 密碼: ur4q
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266923.html
標籤:其他
上一篇:有關時差換算的代碼優化
下一篇:JavaSE總結
