Mybatis-plus-扩展功能
Mybatis-plus-扩展功能
一:代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
功能的演示:
我们安装这个mybatisplus插件:
安装成功后会在idea上方多出来一个其他的菜单选项:
我们选上面那个是连接数据库:
下面就是代码生成器:
这样填好直接生成就行了;
二:静态工具
案例:
在我们查询用户id时是在userservice中,如果我们还要去查询用户的所有地址呢,我们就要去注入addressservice,我们在查询地址的时候如果要查询用户信息又要注入userservice,这样就会造成循环依赖,我们就可以使用Db静态工具来指定要查询的类的字节码就行:
@Override
public UserVO queryandAddress(Long id) {User user = userMapper.selectById(id);UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);List<Address> list = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();if (CollUtil.isEmpty(list)){List<AddressVO> addressVOS = BeanUtil.copyToList(list, AddressVO.class);userVO.setAddressVOS(addressVOS);}return userVO;
}
我们这里使用的Db静态类的lambda查询,指定类,就会去查询指定类对应的数据库表,然后就是和之前一样设置条件,最后表明要返回的类型是list;
然后我们要将address集合转成addressvo的集合就需要使用BeanUtil的copyToList方法,可以使用CollUtil的isEmpty判断集合是否为空;
第二个功能:
@Override
public List<UserVO> querysandAddress(List<Long> ids) {List<User> users = listByIds(ids);if (CollUtil.isEmpty(users)){return Collections.emptyList();}List<UserVO> userVOS = BeanUtil.copyToList(users, UserVO.class);//将用户的id获取从列表中获取出来变成一个用户id的集合List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());List<Address> list = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();List<AddressVO> addressVOS = BeanUtil.copyToList(list, AddressVO.class);//将集合中的元素根据属性值的不同进行分组,得到的是一个map,map的键是分组的不同属性值,map的值是每个组的集合Map<Long, List<AddressVO>> map=new HashMap<>();if (CollUtil.isEmpty(addressVOS)){map = addressVOS.stream().collect(Collectors.groupingBy(AddressVO::getUserId));}for (UserVO userVO : userVOS) {userVO.setAddressVOS(map.get(userVO.getId()));}return userVOS;
}
代码解释:首先直接使用service中继承的方法listbyIds,传入一个id集合,获取的是用户集合,然后我们判断这个集合是否为空,为空就直接返回空集合:conllections.emptylist;然后我们直接将user这个集合拷贝成vo集合,然后因为我们传入的用户id有的存在,有点可能不存在,但是我们获取的user集合中的id都是存在的,所以我们就去将user集合中的每个user的id属性抽取出来单独称为一个集合:List userIds = users.stream().map(User::getId).collect(Collectors.toList());通过stream流来将其抽取出来,然后我们在根据这个获取的用户id去查询地址,然而我们并没有注入,我们直接使用db静态方法,使用方法lambdaQuery来进行处理,因为是集合我们不能使用eq所以我们使用in,然后获取到的是一个集合,我们直接将集合拷贝成vo集合,然后因为我们之后要为每个uservo设置一个地址集合,而我们获取的地址集合是所有的user的,所以我们要进行分组,我们可以使用stream流的方式进行分组: map = addressVOS.stream().
collect(Collectors.groupingBy(AddressVO::getUserId));这里groupby就是以什么为标准进行分组,获得一个map,map的键就是分组的依据,这里就是userid,map的值就是每个用户对应的地址集合;然后我们遍历uservo,将地址赋值给uservo就行了;
三:逻辑删除
比如我们在购物的时候,删除订单,订单的数据并没有被删除,而是被逻辑删除了;
配置了逻辑删除对应的字段名之后,之前的sql语句的执行都会去根据逻辑删除的字段去执行,比如删除就变成了把字段名的值改变一下,查询只会查询没有被逻辑删除的;
四:枚举处理器
在我们定义状态时通常会用数字来表示不同的状态,这样的话我们编写起来很不方便,所以我们引入了枚举类,直接将原来的状态的类型改为枚举的类型,然而我们数据库的类型还是数字的类型,那么我们就需要枚举处理器了,将枚举类中表示值的属性加上注解:
先定义一个枚举类;
package com.itheima.mp.enums;import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;@Getter
public enum UserStatus {NORMAL(1, "正常"),FREEZE(2, "冻结");private final int value;private final String desc;UserStatus(int value, String desc) {this.value = value;this.desc = desc;}
}
然后加上注解:
@EnumValue
private final int value;
private final String desc;
最后加上配置:
configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
然后如果我们想要返回给前端的值不是枚举的名字,我们就需要加上jsonvalue注解:
五:json类型处理器
就是我们将一些值存入数据库中时,数据库中的值是json的,我们之前都是使用字符串传的,当然这样json格式的我们一般使用对象,而我们使用对象的话,存入数据库中时又需要将对象转成json格式的,比较麻烦,我们可以配置json处理器,这样我们就可以将我们java中的对象转成json格式的字符串;
@TableField(typeHandler = JacksonTypeHandler.class)
private UserInfo info;
@TableName(autoResultMap = true)
public class User {
进行这两个配置:一个在属性上加上json处理器,一个在类名上加上自动转换注解;
六:分页插件
1:基本实现方式
使用分页插件的步骤:
1:首先是配置分页插件:
@Configuration
public class MybatisConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 初始化核心插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
定义一个配置类,里面声明一个bean,bean里初始化一个拦截器,相当于在使用mp的时候就会检查有没有配置这些插件,首先初始化核心插件,然后再去添加分页插件;
2:然后就能使用分页插件的相关api进行分页操作了
@Test
void testPageQuery() {Page<User> page = Page.of(1, 10);page.addOrder(new OrderItem("balance",true));//新版:page.addOrder(OrderItem.desc("balance"));Page<User> p = iUserService.page(page);List<User> records = p.getRecords();System.out.println(records);System.out.println(p.getTotal());
}
这里pageof设置分页参数,然后addorder是添加排序条件,true是升序,false是降序
然后就可以调用service中的page方法传入page对象,就获得了分页查询的结果,然后就能通过方法来获取结果
2:通用分页实体
定义一个实体类,专门设置一个pagequery来接收分页查询的条件:
@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {@ApiModelProperty("页码")private Long pageNo;@ApiModelProperty("页码")private Long pageSize;@ApiModelProperty("排序字段")private String sortBy;@ApiModelProperty("是否升序")private Boolean isAsc;
}
然后我们可以在一些实体类的请求实体类中继承pagequery,这样就能用请求实体类做分页查询的请求实体类:
@Data
@ApiModel(description = "用户查询条件实体")
public class UserQuery extends PageQuery {@ApiModelProperty("用户名关键字")private String name;@ApiModelProperty("用户状态:1-正常,2-冻结")private Integer status;@ApiModelProperty("余额最小值")private Integer minBalance;@ApiModelProperty("余额最大值")private Integer maxBalance;
}
再定义一个DTO来接收分页查询的返回值:
package com.itheima.mp.domain.dto;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.List;@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {@ApiModelProperty("总条数")private Long total;@ApiModelProperty("总页数")private Long pages;@ApiModelProperty("集合")private List<T> list;
}
使用泛型来表示可以接受不同类型的分页结果;
service中的实现:
@Override
public PageDTO<User> pageSelect(UserQuery userQuery) {Page<User> page = Page.of(userQuery.getPageNo(), userQuery.getPageSize());page.addOrder(new OrderItem(userQuery.getSortBy(), userQuery.getIsAsc()));Page<User> page1 = lambdaQuery().like(userQuery.getName() != null, User::getUsername, userQuery.getName()).eq(userQuery.getStatus() != null, User::getStatus, userQuery.getStatus()).page(page);return new PageDTO<User>(page1.getTotal(),page1.getPages(),page1.getRecords());
}
我们将分页条件封装成page对象的代码逻辑有点冗余,可以单独提出来,这样更加通用;
然后我们将page结果转成pageDTO也是,可以提出封装起来;
public <T> Page<T> toMpPage(OrderItem... items) {Page<T> page = Page.of(pageNo, pageSize);if (StrUtil.isNotBlank(sortBy)) {page.addOrder(new OrderItem(sortBy, isAsc));} else if (items != null) {page.addOrder(items);}return page;
}
封装page结果返回,接受的是默认排序的参数,可变参数:。。。;
T> Page toMpPage(OrderItem… items) {
Page page = Page.of(pageNo, pageSize);
if (StrUtil.isNotBlank(sortBy)) {
page.addOrder(new OrderItem(sortBy, isAsc));
} else if (items != null) {
page.addOrder(items);
}
return page;
}
> 封装page结果返回,接受的是默认排序的参数,可变参数:。。。;
相关文章:

Mybatis-plus-扩展功能
Mybatis-plus-扩展功能 一:代码生成器 AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 功能的演示:…...

【AI辅助】AWS Toolkit+AmazonQ
#偶然看到网上某up主用的这个AI工具,感觉还挺实用的,推荐大家~我们不可阻挡AI的攻势,但是成为利用它的人,也是反侵占的方式呢# AWS toolkit Amazon Q 安装 VScode--Extensions--搜索工具--安装 安装后,工具栏会多出对…...
云手机简述(概况,使用场景,自己部署云手机)
背景 最近经常会看到云手机的相关广告,手痒难耐,了解一下。 我的主要需求: Android 已 root,能够做一些自动化等高级功能。能够通过 远程adb 控制手机。能够尽量的少花钱,最好是能够提供动态创建删除手机的方式&…...

Java已死,大模型才是未来?
作者:不惑_ 引言 在数字技术的浪潮中,编程语言始终扮演着至关重要的角色。Java,自1995年诞生以来,便以其跨平台的特性和丰富的生态系统,成为了全球范围内开发者们最为青睐的编程语言之一 然而,随着技术的…...

NCCL安装(Ubuntu等)
目录 一、NCCL的定义二、安装NCCL的原因1、加速多GPU通信2、支持流行的深度学习框架3、提高计算效率4、易于使用和集成5、可扩展性 三、NCCL安装方法1、下载安装包2、更新APT数据库3、使用APT安装libnccl2包,另外,如果需要使用NCCL编译应用程序ÿ…...

加载视频显示 - python 实现
#-*-coding:utf-8-*- # date:2021-03-21 # Author: DataBall - Xian # Function: 加载视频并显示import cv2 if __name__ "__main__":#加载视频cap cv2.VideoCapture(./video/1.mp4)while True:ret, img cap.read()# 获取相机图像if ret True:# 如果 ret 返回值为…...
数据结构模拟题[五]
数据结构试卷(五) 一、选择题 (20 分) 1.数据的最小单位是( )。 (A) 数据项 (B) 数据类型 (C) 数据元素 (D) 数据变量 2.设一组初始记录关键字序列为 (50 ,40, 95,20…...

IDEA切换窗口快捷键失效
问题描述: 在idea中,如果切换窗口的快捷键(Alt Tab)失效了,可以通过清除缓存的方式修复...

QT中使用图表之QChart绘制X轴为日期时间轴的折线图
显然X轴是日期时间轴的话,那么我们使用的轴类就得是QDateTimeAxis QChart中日期时间轴的精度是毫秒 因此图表里面的数据的x值需要是一个毫秒数,才能显示出来 --------------------------------------------------------------------------------------…...

【传知代码】短期电力负荷(论文复现)
🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 备注前言介绍问题背景复现:一. 多维特征提取的提取框架:二. 论文中进行性能测试的MultiTag2Vec-STLF模型:三…...

ubuntu20.04 加固方案-设置重复登录失败后锁定时间限制
一、编辑PAM配置文件 打开终端。 使用文本编辑器(如vim)编辑/etc/pam.d/common-auth文件。 sudo vim /etc/pam.d/common-auth 二、添加配置参数 在打开的配置文件中,添加或修改以下参数: auth required pam_tally2.so deny5 un…...

【综合算法学习】(第十三篇)
目录 解数独(hard) 题目解析 讲解算法原理 编写代码 单词搜索(medium) 题目解析 解析算法原理 编写代码 解数独(hard) 题目解析 1.题目链接:. - 力扣(LeetCode)…...

Web3 Key Talking #4|Sui有何不同?及其发展路线图
活动时间: 2024 年 10 月 31 日(周四)20:00–21:00(UTC8) 会议链接: 腾讯会议 会议 ID :429–339–777 主持:Sanzhisanzhichazi1 嘉宾:uvdwangtxxl,Sui …...

Axios 请求超时设置无效的问题及解决方案
文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …...

数据结构+算法
一、数据结构 1、线性结构 数组: 访问:O(1)访问特定位置的元素;插入:O(n)最坏的情况发生在插入发生在数组的首部并需要移动所有元素时;删除:O(n)最坏的情况发生在删除数组的开头发生并需要移动第一元素后…...
利用ExcelJS封装一个excel表格的导出
ExcelJS 操作和写入Excel 文件。 直接上代码,js部分: exportFn.js import ExcelJS from exceljs; import { saveAs } from file-saver;export function exportExcleUtils(tHeader, filterVal, listData, fileName) {//设置工作簿属性const workbook ne…...

AI 原生时代,更要上云:百度智能云云原生创新实践
本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 我今天分享的主题,是谈谈在云计算和 AI 技术快速发展和深入落地的背景下,百度智能云在云原生的基础设施产品和技术层面做的一些创新实践。 毋庸置疑,过去十几年云计算和 AI 技术是…...
C语言程序编译运行
程序功能:使用 printf() 输出 “Hello, World!”。 C语言源程序: #include <stdio.h> int main() {// printf() 中字符串需要引号printf("Hello, World!");return 0; }编译过程: vim hello.c gcc hello.c -o hello ./hell…...

视频点播系统扩展示例
更多的前端页面(如视频详情页、用户注册页等)。更复杂的业务逻辑(如视频评论、搜索功能等)。安全性和权限管理(如用户角色管理、权限控制等)。其他技术细节(如文件上传、分页查询等)…...
echo $? —— Linux 中的退出状态码详解
在 Linux 系统中,echo $? 是一个非常重要的命令,用于显示上一条命令的退出状态码。这个小小的符号组合可以帮助我们判断命令是否成功执行,同时也为编写自动化脚本提供了基础支持。本文将详细介绍 echo $? 的用法及其在实际开发中的应用。 …...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...