MyBatis-plus(下)

目录

静态工具

逻辑删除

枚举处理器

​编辑​编辑JSON处理器 

分页插件

案例 



静态工具

只有save与update不需要传class字节码

UserController:

MyServiceImpl: 

改造根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址 

 @Overridepublic List<UserVO> queryUserAndAddressByIds(List<Long> ids) {//查询用户List<User> users = listByIds(ids);if (CollUtil.isEmpty(users)){return Collections.emptyList();}//查询地址//获取用户id集合List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());//根据用户id查询地址List<Address> address = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();//转换地址voList<AddressVO> addressVOList = BeanUtil.copyToList(address, AddressVO.class);//用户地址集合分组处理,相同用户的放入一个集合(组)中Map<Long, List<AddressVO>> addressMap=new HashMap<>(0);if (CollUtil.isNotEmpty(addressVOList)) {addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));}//转VO返回List<UserVO> list=new ArrayList<>(users.size());for (User user : users) {UserVO vo = BeanUtil.copyProperties(user, UserVO.class);list.add(vo);vo.setAddresses(addressMap.get(user.getId()));}return list;}

 

逻辑删除

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可: 

mybatis-plus:global-config:db-config:logic-delete-field: deleted #全局逻辑制除的实体字段名,字段类型可以是boolean、integerlogic-delete-value: 1 #逻辑已删除值(默认为 1)logic-not-delete-value: 0 #逻辑未删除值(默认为 0)

 逻辑删除本身也有自己的问题,比如:

  • 会导致数据库表垃圾数据越来越多,影响查询效率
  • SQL中全都需要对逻辑删除字段做判断,影响查询效率

因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法

枚举处理器

在application.yml中配置全局枚举处理器: 

mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

package com.yjj.mp.enums;import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;@Getter
public enum UserStatus {NORMAL(1, "正常"),FROZEN(2, "冻结"),;@EnumValueprivate final int value;private final String desc;UserStatus(int value, String desc) {this.value = value;this.desc = desc;}
}

 

将类型改为UserStatus枚举类型

 

 

可以看到运行程序之后显示的是NORMAL,如果想要看到显示状态的话,就加上JsonValue注解

JSON处理器 

 

写一个UserInfo类

package com.yjj.mp.domain.po;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserInfo {private Integer age;private String intro;private String gender;
}

在User类上加上@TableName(value = "user",autoResultMap = true)

然后之前写的测试就要修改了

现在再测试的话

 

分页插件

 首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件

MyBatisConfig配置类:

package com.yjj.mp.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;@Configuration
public class MyBatisConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();//创建分页插件PaginationInnerInterceptor paginationInnerInterceptor=new PaginationInnerInterceptor(DbType.MYSQL);paginationInnerInterceptor.setMaxLimit(1000L);//添加分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}
}

测试代码:

 @Testvoid testPageQuery(){int pageNo=1,pageSize=10;//准备分页条件Page<User> page = Page.of(pageNo, pageSize);//排序条件page.addOrder(new OrderItem("balance",true));page.addOrder(new OrderItem("id",true));Page<User> p = myUserService.page(page);//解析long total = p.getTotal();System.out.println("total ="+total);long pages = p.getPages();System.out.println("pages ="+pages);List<User> users = p.getRecords();users.forEach(user -> System.out.println(user));}

案例 

请求方式        GET

请求路径        /users/page

请求参数       

 "pageNo":1

"pageSize": 5,

"sortBy":"balance"

"isAsc":false,

"name": "jack",

"statub":1

返回值


特殊说明

如果排序字段为空,默认按照更新时间排序,排序字段不为空,则按照排序字段排序 

controller层:

service接口层

 

先写个PageQuery,再让UserQuery继承PageQuery

package com.yjj.mp.query;import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {@ApiModelProperty("页码")private Integer pageNo=1;@ApiModelProperty("页码")private Integer pageSize=5;@ApiModelProperty("排序字段")private String  sortBy;@ApiModelProperty("是否升序")private Boolean isAsc=true;public <T> Page<T> toMapPage(OrderItem ... items){//分页查询Page<T> page = Page.of(pageNo, pageSize);//排序条件if (StrUtil.isNotEmpty(sortBy)) {//不为空page.addOrder(new OrderItem(sortBy, isAsc));}else if (items!=null){//为空,默认按照更新时间排序page.addOrder(items);}return page;}public <T> Page<T> toMapPage(String defaultSortBy,Boolean defaultAsc){return toMapPage(new OrderItem(defaultSortBy,defaultAsc));}public <T> Page<T> toMapPageDefaultSortByCreateTime(){return toMapPage(new OrderItem("create_time",false));}public <T> Page<T> toMapPageDefaultSortByUpdateTime(){return toMapPage(new OrderItem("update_time",false));}
}

PageDTO :

package com.yjj.mp.domain.dto;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.Collections;
import java.util.List;@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {@ApiModelProperty("总条数")private Long total;@ApiModelProperty("总页数")private Long pages;@ApiModelProperty("集合")private List<T> list;public static <PO,VO> PageDTO<VO> of(Page<PO> p,Class<VO> clazz){PageDTO<VO> dto = new PageDTO<>();//总条数dto.setTotal(p.getTotal());//总页数dto.setPages(p.getPages());//当前页数据List<PO> records = p.getRecords();if (CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}List<VO> vos = BeanUtil.copyToList(records, clazz);dto.setList(vos);//返回return dto;}
}

 service层:

@Overridepublic PageDTO<UserVO> queryUsersPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();//构建查询条件Page<User> page = query.toMapPageDefaultSortByUpdateTime();//分页查询Page<User> p = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).page(page);//封装VO结果return PageDTO.of(p,UserVO.class);}


努力遇见更好的自己!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器内存

一、容器内存概述 容器本质上还是一个进程&#xff0c;是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的&#xff0c;这块主要涉及三部分内容&#xff1a;RSS&#xff0c;page cache和swap这三部分&#xff0c;容器基于memory Cgroup对内存进行限制…

用国内镜像安装docker 和 docker-compose (ubuntu)

替代方案&#xff0c;改用国内的镜像站(网易镜像&#xff09; 1.清除旧版本&#xff08;可选操作&#xff09; for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done 2.安装docker apt-get update 首先安装依赖 apt-g…

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…

mysql创建表的规范

名称 建表的时候&#xff0c;给表&#xff0c;字段和索引起个好名字 见名知意&#xff1a;好的名字能够降低沟通和维护的成本名字不宜过长&#xff0c;尽量控制在30个字符以内 大小写 名字尽量都用小写字母&#xff0c;因为从视觉上&#xff0c;小写字母更容易让人读懂全部大写…

Linux嵌入式中MQTT的使用

MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0…

驾驭npm更新之力:深入掌握npm update命令的精髓

驾驭npm更新之力&#xff1a;深入掌握npm update命令的精髓 在JavaScript和Node.js的世界中&#xff0c;npm&#xff08;Node Package Manager&#xff09;作为默认的包管理器&#xff0c;扮演着至关重要的角色。它不仅用于安装和管理项目依赖&#xff0c;还提供了更新这些依赖…

SpringBoot3.3集成knif4j-swagger文档方式和使用案例

springboot3 集成 knif4j &#xff1a; 访问地址&#xff1a; swagger 接口文档默认地址&#xff1a;http://localhost:8080/swagger-ui.html# Knife4j 接口文档默认地址&#xff1a;http://127.0.0.1:8080/doc.html Maven: <dependency><groupId>com.github.x…

2024 COMMUNITY DAY User Group 社区嘉年华 云计算与 AI 技术交融盛会共筑多元智慧未来

亚马逊云科技User Group&#xff0c;深圳 Community Day 活动流程抢先知道&#xff01; ⏰ 7月7日 &#x1f3e0; 深圳南山区香港中文大学 &#x1f4e3;主论坛国际大咖云集&#xff0c;共襄科技盛宴&#xff01; &#x1f389;三大主题论坛&#xff1a;人工智能、大数据、动…

MyBatis系列三: XxxMapper.xml-SQL映射文件

XxxMapper.xml-SQL映射文件 官方文档基本介绍详细说明基本使用parameterType(输入参数类型)传入HashMapresultMap(结果集映射) 官方文档 文档地址: https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html 基本介绍 1.MyBatis的真正强大在于它的语句映射(在XxxMapper.xml配置…

2024年06月CCF-GESP编程能力等级认证Python编程一级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( ) A. 1 B. 2 C…

React@16.x(45)路由v5.x(10)源码(2)- history

目录 1&#xff0c;作用1.1&#xff0c;createBrowserHistory1.2&#xff0c;createHashHistory1.3&#xff0c;createMemoryHistory 2&#xff0c;history 对象的属性2.1&#xff0c;action2.2&#xff0c;push / replace / go / goBack / goForward2.3&#xff0c;location2.…

网络配线架的隐藏功能

网络布线是确保现代信息社会高效运转的关键技术之一。在这一领域&#xff0c;网络配线架扮演着至关重要 的角色。它不仅仅是一个简单的物理连接点&#xff0c;更拥有许多隐藏功能&#xff0c;这些功能极大地提升了网络的 效率、稳定性和可管理性。 1、集中管理 网络配线架提…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

经典FC游戏web模拟器--EmulatorJS

简介 EmulatorJS是一个基于JavaScript和Webassembly技术的虚拟环境的实现&#xff0c;可以在网页中运行各种经典FC游戏系统&#xff0c;支持任天堂、世嘉、雅达利等经典红白机。EmulatorJS的诞生使得诸如超级玛丽、坦克大战、魂斗罗等经典FC游戏能够以一种全新的方式回归。本文…

SAP MM模块的ATP检查

前面几篇文章都演示和说明ATP的一些设置和操作&#xff0c;通常情况下ATP的检查PP模块&#xff0c;SD模块用的相对来说是比较多的&#xff0c;但是实际上MM模块也会遵循ATP的可用性的检查规则。 当我们在做311、301等移动类型时&#xff0c;系统会根据相应的可用性检查规则&am…

Linux常用指令汇总

Linux常用指令汇总 Cfilt 功能&#xff1a;解析C程序中被修饰的符号&#xff0c;比如变量与函数名称。 示例&#xff1a; 解析编译器 g 修饰的函数名称。 cfilt -s gnu-v3 _Z5printRKSs print(std::basic_string<char, std::char_traits<char>, std::allocator<…

Django 多对多关系

多对多关系作用 Django 中&#xff0c;多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说&#xff0c;多对多关系允许一个模型的实例与另一个模型的多个实例相关联&#xff0c;反之亦然。这在很多实际应用场景中非常有用&#xff0c;比如&#xff1a; 博…

【每日一个Git命令: cherry-pick】

git cherry-pick 命令的作用是将指定的提交&#xff08;commit&#xff09;应用到其他分支上。这个命令允许你选择一个或多个已有的提交&#xff0c;并将它们作为新的提交引入到当前分支中。 这个过程不会改变项目的历史记录&#xff0c;因为它实际上是创建了这些提交的副本。…

BMA530 运动传感器

型号简介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备而设计&…

24/07/02数据结构(1.1201)算法效率顺序表

数据结构基本内容:1.时间复杂度 空间复杂度2.顺序表链表3.栈 队列4.二叉树5.排序 数据结构是存储,组织数据的方式.指相互之间存在一种或多种特定关系的数据元素的集合 算法是定义良好的计算过程.取一个或一组值为输入并产生一个或一组值为输出. 需要知道虽然选择题有20-30个…