SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI
导读
- 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代码的精简提供了一种方式
添加依赖
org.projectlombok lombok 1.18.16 provided
常见注解@Getter/@Setter#
- 作用类上,生成所有成员变量的getter/setter方法
- 作用于成员变量上,生成该成员变量的getter/setter方法
- 方法控制访问级别set和get注解加上@Getter(AccessLevel.PROTECTED)
编译查看字节码
mvncompile
packagecom.ybchen.shopmanager.model; importlombok.AccessLevel; importlombok.Getter; importlombok.Setter; /** *@Description: *@Author:chenyanbin *@Date:2021/3/2下午9:43 *@Versiion:1.0 */ @Getter @Setter publicclassUser{ //不想生成get方法 @Getter(AccessLevel.NONE) intid; //只会去生成get finalStringname="alex"; Stringphone; //静态成员变量不会生成set/get方法 staticfinalStringpwd="123"; }
@NonNull
作用于方法上或者属性,用于非空判断,如果为空则抛异常
@NoArgsContructor
生成无参构造器
@AllArgsConstructor
生成全参构造器
@RequiredArgsConstructor
指定参数的构造函数,有以下的特征的字段
- final类型未被初始化的属性,标记了@NonNull的属性
- 注意:@NoArgsConstructor不能添加
@ToStringList或者其他集合调试不方便控制台或者日志输出对象,默认打印的是内存地址作用于类,覆盖默认的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的基础上只做强增不做改变,为简化开发,提高效率
数据库脚本
/* NavicatPremiumDataTransfer SourceServer:localhost SourceServerType:MySQL SourceServerVersion:50728 SourceHost:localhost:3306 SourceSchema:shop TargetServerType:MySQL TargetServerVersion:50728 FileEncoding:65001 Date:04/03/202122:17:20 */ SETNAMESutf8mb4; SETFOREIGN_KEY_CHECKS=0; ------------------------------ --Tablestructureforaddress ------------------------------ DROPTABLEIFEXISTS`address`; CREATETABLE`address`( `id`bigint(20)unsignedNOTNULLAUTO_INCREMENT, `user_id`bigint(20)DEFAULTNULLCOMMENT'用户id', `default_status`int(1)DEFAULTNULLCOMMENT'是否默认收货地址:0->否;1->是', `receive_name`varchar(64)DEFAULTNULLCOMMENT'收发货人姓名', `phone`varchar(64)DEFAULTNULLCOMMENT'收货人电话', `province`varchar(64)DEFAULTNULLCOMMENT'省/直辖市', `city`varchar(64)DEFAULTNULLCOMMENT'市', `region`varchar(64)DEFAULTNULLCOMMENT'区', `detail_address`varchar(200)DEFAULTNULLCOMMENT'详细地址', `create_time`datetimeDEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='电商-公司收发货地址表'; ------------------------------ --Recordsofaddress ------------------------------ BEGIN; COMMIT; ------------------------------ --Tablestructureforbanner ------------------------------ DROPTABLEIFEXISTS`banner`; CREATETABLE`banner`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `img`varchar(524)DEFAULTNULLCOMMENT'图片', `url`varchar(524)DEFAULTNULLCOMMENT'跳转地址', `weight`int(11)DEFAULTNULLCOMMENT'权重', `version`int(11)DEFAULT'1', `deleted`int(11)DEFAULT'0'COMMENT'0是未删除,1是已经删除', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=13DEFAULTCHARSET=utf8mb4; ------------------------------ --Recordsofbanner ------------------------------ BEGIN; INSERTINTO`banner`VALUES(1,'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg','https://www.cnblogs.com/chenyanbin/',1,2,1); INSERTINTO`banner`VALUES(2,'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg','https://www.cnblogs.com/chenyanbin/',3,1,0); INSERTINTO`banner`VALUES(3,'https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg','https://www.cnblogs.com/chenyanbin/',2,1,0); INSERTINTO`banner`VALUES(7,'werw','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); INSERTINTO`banner`VALUES(8,'666666','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); INSERTINTO`banner`VALUES(9,'sdfds','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); INSERTINTO`banner`VALUES(10,'323232','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); INSERTINTO`banner`VALUES(11,'532','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); INSERTINTO`banner`VALUES(12,'6666','https://images.cnblogs.com/cnblogs_com/chenyanbin/1560326/o_qianxun.jpg',2,1,0); COMMIT; ------------------------------ --Tablestructureforcoupon ------------------------------ DROPTABLEIFEXISTS`coupon`; CREATETABLE`coupon`( `id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id', `category`varchar(11)DEFAULTNULLCOMMENT'优惠卷类型[NEW_USER注册赠券,TASK任务卷,PROMOTION促销劵]', `publish`varchar(11)DEFAULTNULLCOMMENT'发布状态,PUBLISH发布,DRAFT草稿,OFFLINE下线', `coupon_img`varchar(524)DEFAULTNULLCOMMENT'优惠券图片', `coupon_title`varchar(128)DEFAULTNULLCOMMENT'优惠券标题', `price`decimal(16,2)DEFAULTNULLCOMMENT'抵扣价格', `user_limit`int(11)DEFAULTNULLCOMMENT'每人限制张数', `start_time`datetimeDEFAULTNULLCOMMENT'优惠券开始有效时间', `end_time`datetimeDEFAULTNULLCOMMENT'优惠券失效时间', `publish_count`int(11)DEFAULTNULLCOMMENT'优惠券总量', `stock`int(11)DEFAULT'0'COMMENT'库存', `add_one`int(11)DEFAULTNULLCOMMENT'是否叠加0是不行,1是可以', `create_time`datetimeDEFAULTNULL, `condition_price`decimal(16,2)DEFAULTNULLCOMMENT'满多少才可以使用', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4; ------------------------------ --Recordsofcoupon ------------------------------ BEGIN; COMMIT; ------------------------------ --Tablestructureforproduct ------------------------------ DROPTABLEIFEXISTS`product`; CREATETABLE`product`( `id`bigint(11)unsignedNOTNULLAUTO_INCREMENT, `title`varchar(128)DEFAULTNULLCOMMENT'标题', `cover_img`varchar(128)DEFAULTNULLCOMMENT'封面图', `detail`varchar(256)DEFAULT''COMMENT'详情', `old_price`decimal(16,2)DEFAULTNULLCOMMENT'老价格', `price`decimal(16,2)DEFAULTNULLCOMMENT'新价格', `stock`int(11)DEFAULTNULLCOMMENT'库存', `create_time`datetimeDEFAULTNULLCOMMENT'创建时间', `lock_stock`int(11)DEFAULT'0'COMMENT'锁定库存', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8mb4; ------------------------------ --Recordsofproduct ------------------------------ BEGIN; COMMIT; ------------------------------ --Tablestructureforproduct_order ------------------------------ DROPTABLEIFEXISTS`product_order`; CREATETABLE`product_order`( `id`bigint(11)NOTNULLAUTO_INCREMENT, `out_trade_no`varchar(64)DEFAULTNULLCOMMENT'订单唯一标识', `state`varchar(11)DEFAULTNULLCOMMENT'NEW未支付订单,PAY已经支付订单,CANCEL超时取消订单', `create_time`datetimeDEFAULTNULLCOMMENT'订单生成时间', `total_fee`decimal(16,2)DEFAULTNULLCOMMENT'订单总金额', `pay_fee`decimal(16,2)DEFAULTNULLCOMMENT'订单实际支付价格', `pay_type`varchar(64)DEFAULTNULLCOMMENT'支付类型,微信-银行-支付宝', `nickname`varchar(64)DEFAULTNULLCOMMENT'昵称', `head_img`varchar(524)DEFAULTNULLCOMMENT'头像', `user_id`int(11)DEFAULTNULLCOMMENT'用户id', `del`int(5)DEFAULT'0'COMMENT'0表示未删除,1表示已经删除', `update_time`datetimeDEFAULTNULLCOMMENT'更新时间', `order_type`varchar(32)DEFAULTNULLCOMMENT'订单类型DAILY普通单,PROMOTION促销订单', `receiver_address`varchar(1024)DEFAULTNULLCOMMENT'收货地址json存储', PRIMARYKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8; ------------------------------ --Recordsofproduct_order ------------------------------ BEGIN; COMMIT; ------------------------------ --Tablestructureforproduct_order_item ------------------------------ DROPTABLEIFEXISTS`product_order_item`; CREATETABLE`product_order_item`( `id`bigint(11)unsignedNOTNULLAUTO_INCREMENT, `product_order_id`bigint(11)DEFAULTNULLCOMMENT'订单号', `out_trade_no`varchar(32)DEFAULTNULL, `product_id`bigint(11)DEFAULTNULLCOMMENT'产品id', `product_name`varchar(128)DEFAULTNULLCOMMENT'商品名称', `product_img`varchar(524)DEFAULTNULLCOMMENT'商品图片', `buy_num`int(11)DEFAULTNULLCOMMENT'购买数量', `create_time`datetimeDEFAULTNULL, `total_fee`decimal(16,2)DEFAULTNULLCOMMENT'购物项商品总价格', `pay_fee`decimal(16,0)DEFAULTNULLCOMMENT'购物项商品支付总价格', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4; ------------------------------ --Recordsofproduct_order_item ------------------------------ BEGIN; COMMIT; ------------------------------ --Tablestructureforuser ------------------------------ DROPTABLEIFEXISTS`user`; CREATETABLE`user`( `id`bigint(11)unsignedNOTNULLAUTO_INCREMENT, `name`varchar(128)DEFAULTNULLCOMMENT'昵称', `pwd`varchar(124)DEFAULTNULLCOMMENT'密码', `head_img`varchar(524)DEFAULTNULLCOMMENT'头像', `slogan`varchar(524)DEFAULTNULLCOMMENT'用户签名', `sex`tinyint(2)DEFAULT'1'COMMENT'0表示女,1表示男', `points`int(10)DEFAULT'0'COMMENT'积分', `create_time`datetimeDEFAULTNULL, `mail`varchar(64)DEFAULTNULLCOMMENT'邮箱', `secret`varchar(12)DEFAULTNULLCOMMENT'盐,用于个人敏感信息处理', PRIMARYKEY(`id`), UNIQUEKEY`mail_idx`(`mail`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; ------------------------------ --Recordsofuser ------------------------------ BEGIN; COMMIT; SETFOREIGN_KEY_CHECKS=1;
pom.xml
mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.4.0 4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.3 com.ybchen shop-manager 0.0.1-SNAPSHOT shop-manager DemoprojectforSpringBoot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.projectlombok lombok 1.18.16 provided mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.4.0 org.springframework.boot spring-boot-maven-plugin maven-ali http://maven.aliyun.com/nexus/content/groups/public// true true always fail public aliyunnexus http://maven.aliyun.com/nexus/content/groups/public/ true false
完整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
统一接口返回协议
packagecom.ybchen.shopmanager.utils; importlombok.AllArgsConstructor; importlombok.Data; importlombok.NoArgsConstructor; importjava.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor publicclassJsonDataimplementsSerializable{ /** *状态码0表示成功,1表示处理中,-1表示失败 */ privateIntegercode; /** *数据 */ privateObjectdata; /** *描述信息 */ privateStringmsg; /** *成功,无传入数据 * *@return */ publicstaticJsonDatabuildSuccess(){ returnnewJsonData(0,null,null); } /** *成功,有传入数据 * *@paramdata数据 *@return */ publicstaticJsonDatabuildSuccess(Objectdata){ returnnewJsonData(0,data,null); } /** *失败,有返回错误信息 * *@parammsg描述信息 *@return */ publicstaticJsonDatabuildError(Stringmsg){ returnnewJsonData(-1,null,msg); } /** *失败,有状态码,描述信息 * *@paramcode状态码 *@parammsg描述信息 *@return */ publicstaticJsonDatabuildError(Integercode,Stringmsg){ returnnewJsonData(code,null,msg); } /** *是否返回成功 *@paramjsonData *@return */ publicstaticbooleanisSuccess(JsonDatajsonData){ returnjsonData.getCode()==0; } }
实体类
packagecom.ybchen.shopmanager.model; importcom.baomidou.mybatisplus.annotation.TableName; importlombok.Data; /** *@Description:轮播图 *@Author:chenyanbin *@Date:2021/3/4下午11:00 *@Versiion:1.0 */ @Data //数据库表名 @TableName("banner") publicclassBannerDO{ /** *主键 */ privateIntegerid; /** *图片 */ privateStringimg; /** *url跳转地址 */ privateStringurl; /** *权重 */ privateIntegerweight; /** *版本号 */ privateIntegerversion; /** *0是未删除,1是已经删除 */ privateIntegerdeleted; }
service
packagecom.ybchen.shopmanager.service; importcom.ybchen.shopmanager.model.BannerDO; importjava.util.List; publicinterfaceBannerService{ Listlist(); } packagecom.ybchen.shopmanager.service.impl; importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper; importcom.ybchen.shopmanager.mapper.BannerMapper; importcom.ybchen.shopmanager.model.BannerDO; importcom.ybchen.shopmanager.service.BannerService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Service; importjava.util.List; /** *@Description:轮播图Service *@Author:chenyanbin *@Date:2021/3/4下午11:04 *@Versiion:1.0 */ @Service publicclassBannerServiceImplimplementsBannerService{ @Autowired privateBannerMapperbannerMapper; @Override publicList list(){ returnbannerMapper.selectList(newQueryWrapper<>()); } }
Controller
packagecom.ybchen.shopmanager.controller; importcom.ybchen.shopmanager.service.BannerService; importcom.ybchen.shopmanager.utils.JsonData; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; /** *@Description:轮播图Controller *@Author:chenyanbin *@Date:2021/3/4下午11:06 *@Versiion:1.0 */ @RestController @RequestMapping("api/v1/banner") publicclassBannerController{ @Autowired privateBannerServicebannerService; @GetMapping("list") publicJsonDatalist(){ returnJsonData.buildSuccess(bannerService.list()); } }
测试
单元测试+控制台打印sql
单元测试
packagecom.ybchen.shopmanager; importcom.ybchen.shopmanager.model.BannerDO; importcom.ybchen.shopmanager.service.BannerService; importlombok.extern.slf4j.Slf4j; importorg.junit.jupiter.api.Test; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.test.context.SpringBootTest; importjava.util.List; //classes=启动类.class @SpringBootTest(classes=ShopManagerApplication.class) @Slf4j publicclassBannerTest{ @Autowired privateBannerServicebannerService; @Test publicvoidtestBannerTest(){ Listlist=bannerService.list(); log.info("轮播图列表:{}",list); } }
配置文件
application.properties
#配置mybatisplus打印sql日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
测试
BaseMapperMapper
继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能
/* *Copyright(c)2011-2020,baomidou(jobob@qq.com). **LicensedundertheApacheLicense,Version2.0(the"License");youmaynot *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof *theLicenseat *
*https://www.apache.org/licenses/LICENSE-2.0 *
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder *theLicense. */ packagecom.baomidou.mybatisplus.core.mapper; importcom.baomidou.mybatisplus.core.conditions.Wrapper; importcom.baomidou.mybatisplus.core.metadata.IPage; importcom.baomidou.mybatisplus.core.toolkit.Constants; importorg.apache.ibatis.annotations.Param; importjava.io.Serializable; importjava.util.Collection; importjava.util.List; importjava.util.Map; /* :` .:, :::,,. ::`:::::: ::``,:,`.:` `::`::::::::.:``:';,` ::::,.:::``@++++++++: ``:::`@+++++++++++# :::,#++++++++++++++` ,:`::::::;'##++++++++++ .@#@;`::::::::::::::::::::; #@####@,:::::::::::::::+#;::. @@######+@:::::::::::::.#@:; ,@@########'::::::::::::.#''':` ;##@@@+:##########@:::::::::::@#;.,:. #@@@######++++#####':::::::::.##+,:#` @@@@@#####+++++'#####+::::::::`,`::@#:` `@@@@#####++++++'#####+#':::::::::::@. @@@@######+++++''#######+##';::::;':,` @@@@#####+++++'''#######++++++++++` #@@#####++++++''########++++++++' `#@######+++++''+########+++++++; `@@#####+++++''##########++++++, @@######+++++'##########+++++#` @@@@#####+++++############++++; ;#@@@@@####++++##############+++, @@@@@@@@@@@###@###############++' @#@@@@@@@@@@@@###################+: `@#@@@@@@@@@@@@@@###################'` :@#@@@@@@@@@@@@@@@@@##################, ,@@@@@@@@@@@@@@@@@@@@################; ,#@@@@@@@@@@@@@@@@@@@##############+` .#@@@@@@@@@@@@@@@@@@#############@, @@@@@@@@@@@@@@@@@@@###########@, :#@@@@@@@@@@@@@@@@##########@, `##@@@@@@@@@@@@@@@########+, `+@@@@@@@@@@@@@@@#####@:` `:@@@@@@@@@@@@@@##@;. `,'@@@@##@@@+;,` ``...`` __/___/_.____/_ ////_//_//_|//_\/_///_/_\Talkischeap.Showmethecode. _// */ /** *Mapper继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能 *
这个Mapper支持id泛型
* *@authorhubin *@since2016-01-23 */ publicinterfaceBaseMapperextendsMapper { /** *插入一条记录 * *@paramentity实体对象 */ intinsert(Tentity); /** *根据ID删除 * *@paramid主键ID */ intdeleteById(Serializableid); /** *根据columnMap条件,删除记录 * *@paramcolumnMap表字段map对象 */ intdeleteByMap(@Param(Constants.COLUMN_MAP)Map columnMap); /** *根据entity条件,删除记录 * *@paramwrapper实体对象封装操作类(可以为null) */ intdelete(@Param(Constants.WRAPPER)Wrapper wrapper); /** *删除(根据ID批量删除) * *@paramidList主键ID列表(不能为null以及empty) */ intdeleteBatchIds(@Param(Constants.COLLECTION)CollectionidList); /** *根据ID修改 * *@paramentity实体对象 */ intupdateById(@Param(Constants.ENTITY)Tentity); /** *根据whereEntity条件,更新记录 * *@paramentity实体对象(set条件值,可以为null) *@paramupdateWrapper实体对象封装操作类(可以为null,里面的entity用于生成where语句) */ intupdate(@Param(Constants.ENTITY)Tentity,@Param(Constants.WRAPPER)Wrapper updateWrapper); /** *根据ID查询 * *@paramid主键ID */ TselectById(Serializableid); /** *查询(根据ID批量查询) * *@paramidList主键ID列表(不能为null以及empty) */ List selectBatchIds(@Param(Constants.COLLECTION)CollectionidList); /** *查询(根据columnMap条件) * *@paramcolumnMap表字段map对象 */ List selectByMap(@Param(Constants.COLUMN_MAP)Map columnMap); /** *根据entity条件,查询一条记录 * *@paramqueryWrapper实体对象封装操作类(可以为null) */ TselectOne(@Param(Constants.WRAPPER)Wrapper queryWrapper); /** *根据Wrapper条件,查询总记录数 * *@paramqueryWrapper实体对象封装操作类(可以为null) */ IntegerselectCount(@Param(Constants.WRAPPER)Wrapper queryWrapper); /** *根据entity条件,查询全部记录 * *@paramqueryWrapper实体对象封装操作类(可以为null) */ List selectList(@Param(Constants.WRAPPER)Wrapper queryWrapper); /** *根据Wrapper条件,查询全部记录 * *@paramqueryWrapper实体对象封装操作类(可以为null) */ List
Mybatisplus常用注解#
- @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条件,orderby排序
eq:等于
ne:不等于
gt:大于
ge:大于等于
lt:小于
le:小于等于
or:拼接or
between:两个值中间
notBetween:不在两个值中间
like:模糊匹配
notLike:不像
likeLeft:左匹配
likeRight:右边匹配
isNull:字段为空
in:in查询
groupBy:分组
orderByAsc:升序
orderByDesc:降序
having:having查询
分页插件#
配置类#
packagecom.ybchen.shopmanager.config; importcom.baomidou.mybatisplus.annotation.DbType; importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; /** *@Description:分页插件配置 *@Author:chenyanbin *@Date:2021/3/5下午10:32 *@Versiion:1.0 */ @Configuration publicclassMybatisPlusPageConfig{ /** *旧版本 */ //@Bean //publicPaginationInterceptorpaginationInterceptor(){ //PaginationInterceptorpaginationInterceptor=newPaginationInterceptor(); //returnpaginationInterceptor; //} /** *新的分页插件,一级和二级缓存遵循mybatis的规则 *需要设置MybatisConfiguration#useDeprecatedExecutor=false避免缓存出现问题 */ @Bean publicMybatisPlusInterceptormybatisPlusInterceptor(){ MybatisPlusInterceptormybatisPlusInterceptor=newMybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL)); returnmybatisPlusInterceptor; } }
演示类
自定义xml的sql脚本
新建xml
select*frombanner
BannerMapper.java添加方法
packagecom.ybchen.shopmanager.mapper; importcom.baomidou.mybatisplus.core.mapper.BaseMapper; importcom.ybchen.shopmanager.model.BannerDO; importjava.util.List; /** *@Description:轮播图Mapper *@Author:chenyanbin *@Date:2021/3/4下午11:03 *@Versiion:1.0 */ publicinterfaceBannerMapperextendsBaseMapper{ List 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
测试
配置实体类别名
修改application.properties
#配置实体类别名 mybatis-plus.type-aliases-package=com.ybchen.shopmanager.model
测试
mybatisplus下划线转驼峰
默认就是true
修改application.properties
#mybatisplus下划线转驼峰 mybatis-plus.configuration.map-underscore-to-camel-case=true
配置全局默认主键类型
实体类上就不用加@TableId(value="id",type=IdType.AUTO)
修改application.properties
#配置全局默认主键规则 mybatis-plus.global-config.db-config.id-type=auto
完整application.properties
#端口号 server.port=9999 #===========数据库相关============= spring.datasource.driver-class-name=com.mysql.cj.jdbc.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 #配置mybatisplus打印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 #mybatisplus下划线转驼峰 mybatis-plus.configuration.map-underscore-to-camel-case=true #配置全局默认主键规则 mybatis-plus.global-config.db-config.id-type=auto
乐观锁
大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般通过为数据库表增加一个“version”字段来实现。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据,库表对应记录的当前版本信息进行比较,如果提交的数据,版本号大于数据库表当前的版本号,则予以更新,否则认为是过期数据。
实体类增加@version
增加乐观锁插件
packagecom.ybchen.shopmanager.config; importcom.baomidou.mybatisplus.annotation.DbType; importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; importcom.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; /** *@Description:分页插件配置 *@Author:chenyanbin *@Date:2021/3/5下午10:32 *@Versiion:1.0 */ @Configuration publicclassMybatisPlusPageConfig{ /** *旧版本 */ //@Bean //publicPaginationInterceptorpaginationInterceptor(){ //PaginationInterceptorpaginationInterceptor=newPaginationInterceptor(); //returnpaginationInterceptor; //} /** *新的分页插件,一级和二级缓存遵循mybatis的规则 *需要设置MybatisConfiguration#useDeprecatedExecutor=false避免缓存出现问题 */ @Bean publicMybatisPlusInterceptormybatisPlusInterceptor(){ MybatisPlusInterceptormybatisPlusInterceptor=newMybatisPlusInterceptor(); //分页插件 mybatisPlusInterceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL)); //乐观锁插件 mybatisPlusInterceptor.addInnerInterceptor(newOptimisticLockerInnerInterceptor()); returnmybatisPlusInterceptor; } }
使用
注意
- 乐观锁数据类型支持int、Integer、long、timestamp
- 仅支持updateById和update方法
逻辑删除
公司在设计规范中都加入了逻辑删除的强制规定,运营人员可以分析和审查数据,也方便将数据沉淀下来用于商业分析。
数据量过多,也会采用数据仓库,通过监听应用数据库的数据变化,进行迁移到数据仓库。
方式一
- 数据库增加deleted字段,0是未删除,1表示删除
- 实体类增加属性配置@TableLogic
- 查询的时候会自动拼接上deleted=0的检索条件
方式二
修改application.properties
#逻辑删除,删除是1 mybatis-plus.global-config.db-config.logic-delete-value=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
代码生成器#
添加依赖#
com.baomidou mybatis-plus-generator 3.4.1 org.apache.velocity velocity-engine-core 2.0
生成器类#
packagecom.ybchen.shopmanager; importcom.baomidou.mybatisplus.annotation.DbType; importcom.baomidou.mybatisplus.annotation.IdType; importcom.baomidou.mybatisplus.generator.AutoGenerator; importcom.baomidou.mybatisplus.generator.config.DataSourceConfig; importcom.baomidou.mybatisplus.generator.config.GlobalConfig; importcom.baomidou.mybatisplus.generator.config.PackageConfig; importcom.baomidou.mybatisplus.generator.config.StrategyConfig; importcom.baomidou.mybatisplus.generator.config.rules.DateType; importcom.baomidou.mybatisplus.generator.config.rules.NamingStrategy; /** *@Description:代码生成器 *@Author:chenyanbin *@Date:2021/3/6下午5:10 *@Versiion:1.0 */ publicclassMyBatisPlusGenerator{ publicstaticvoidmain(String[]args){ //1.全局配置 GlobalConfigconfig=newGlobalConfig(); //是否支持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.数据源配置 DataSourceConfigdsConfig=newDataSourceConfig(); //设置数据库类型 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中 StrategyConfigstConfig=newStrategyConfig(); //全局大写命名 stConfig.setCapitalMode(true) //数据库表映射到实体的命名策略 .setNaming(NamingStrategy.underline_to_camel) //使用lombok .setEntityLombokModel(true) //使用restcontroller注解 .setRestControllerStyle(true) //生成的表,支持多表一起生成,以数组形式填写 .setInclude("product","banner","address","coupon","product_order"); //4.包名策略配置 PackageConfigpkConfig=newPackageConfig(); pkConfig.setParent("net.mybatisplus") .setMapper("mapper") .setService("service") .setController("controller") .setEntity("model") .setXml("mapper"); //5.整合配置 AutoGeneratorag=newAutoGenerator(); ag.setGlobalConfig(config) .setDataSource(dsConfig) .setStrategy(stConfig) .setPackageInfo(pkConfig); //6.执行操作 ag.execute(); System.out.println("=======代码生成完毕========"); } }
使用#
SpringBoot整合Swagger3.x
添加依赖
io.springfox springfox-boot-starter 3.0.0
修改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=shopapi
配置类
packagecom.ybchen.shopmanager.config; importio.swagger.annotations.ApiOperation; importlombok.Data; importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.stereotype.Component; importspringfox.documentation.builders.ApiInfoBuilder; importspringfox.documentation.builders.PathSelectors; importspringfox.documentation.builders.RequestHandlerSelectors; importspringfox.documentation.oas.annotations.EnableOpenApi; importspringfox.documentation.service.ApiInfo; importspringfox.documentation.service.Contact; importspringfox.documentation.spi.DocumentationType; importspringfox.documentation.spring.web.plugins.Docket; /** *@Description:swagger配置类 *@Author:chenyanbin *@Date:2021/3/5下午10:32 *@Versiion:1.0 */ @Component @Data @ConfigurationProperties("swagger") @EnableOpenApi publicclassSwaggerConfiguration{ /** *是否开启swagger,生产环境一般关闭,所以这里定义一个变量 */ privateBooleanenable; /** *项目应用名 */ privateStringapplicationName; /** *项目版本信息 */ privateStringapplicationVersion; /** *项目描述信息 */ privateStringapplicationDescription; @Bean publicDocketdocket(){ returnnewDocket(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(); } privateApiInfoapiInfo(){ returnnewApiInfoBuilder() .title(applicationName) .description(applicationDescription) .contact(newContact("陈彦斌","https://www.cnblogs.com/chenyanbin/","543210188@qq.com")) .version(applicationVersion) .build(); } }
启动测试
访问地址:http://localhost:9999/swagger-ui/index.html
注意:如果访问不成功,看是否拦截器拦截了相关资源!!!!!
常用注解
@Api
用在controller类,描述API接口
@Api(tags="用户模块",value="用户UserController") publicclassUserController{ }
@ApiOperation#
接口配置,用在方法上,描述接口方法
@ApiOperation("分页用户列表") @GetMapping("list") publicJsonDatalist(){ returnJsonData.buildSuccess(); }
@ApiParam#
方法参数配置,用在入参上面,描述参数
@ApiOperation("用户登录") @PostMapping("login") publicJsonDatalogin( @ApiParam(name="phone",value="手机号",example="13888888888") @RequestParam("phone")Stringphone, @ApiParam(name="pwd",value="密码",example="123456") @RequestParam("pwd")Stringpwd){ returnJsonData.buildSuccess(); }
@Apilgnore#
忽略此接口不生成文档
@ApiIgnore @ApiOperation("删除用户") @DeleteMapping("/delete/{id}") publicJsonDatadeleteById(@PathVariableintid){ returnJsonData.buildSuccess(); }
@ApiModel#
用于类,表示对类进行说明,用于参数,用实体类接收
@ApiModelProperty#
用于方法,字段;表示对model属性的说明或者数据操作更改
value:字段说明
name:重写属性名称
dataType:重写属性类型
required:是否必填
example:举例说明
hidden:隐藏
@Data
@ApiModel("用户基本信息")
publicclassSaveUserRequest{ privateintage; privateStringpwd; @ApiModelProperty(value="【必填】邮箱",required=true) privateStringemail; @ApiModelProperty("【必填】手机号") privateStringphone; @ApiModelProperty(value="创建时间") privateDatecreateTime; }
@ApiResponse#
描述接口响应
@ApiOperation("用户登录") @PostMapping("login") @ApiResponses({ @ApiResponse(responseCode=CodeStatus.SUCCESS,description="保存成功"), @ApiResponse(responseCode=CodeStatus.FAIL,description="保存失败") }) publicJsonDatalogin( @ApiParam(name="phone",value="手机号",example="13888888888") @RequestParam("phone")Stringphone, @ApiParam(name="pwd",value="密码",example="123456") @RequestParam("pwd")Stringpwd){ returnJsonData.buildSuccess(); }
项目源码下载
链接:https://pan.baidu.com/s/1OaOG0xK6jl8zDweAMkggAQ提取码:ed54
到此这篇关于SpringBoot开发提速神器Lombok+MybatisPlus+SwaggerUI的文章就介绍到这了,更多相关SpringBootLombok+MybatisPlus+SwaggerUI内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。