Mybatis-plus-扩展功能

news2024/11/7 14:16:52

Mybatis-plus-扩展功能

一:代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

功能的演示:

relationship

我们安装这个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 {

    @Bean
    public 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结果返回,接受的是默认排序的参数,可变参数:。。。;

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

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

相关文章

数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程

数据可视化工具深入学习&#xff1a;Seaborn 与 Plotly 的详细教程 数据可视化是数据分析中不可或缺的一部分&#xff0c;能够有效地帮助我们理解数据、发现模式和传达信息。在众多可视化工具中&#xff0c;Seaborn 和 Plotly 是两个非常流行且强大的库。本文将深入探讨这两个…

DAY14|二叉树Part02|LeetCode: 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录 LeetCode: 226.翻转二叉树 基本思路 C代码 LeetCode: 101. 对称二叉树 基本思路 C代码 LeetCode: 104.二叉树的最大深度 基本思路 C代码 LeetCode: 111.二叉树的最小深度 基本思路 C代码 LeetCode: 226.翻转二叉树 力扣题目链接 文字讲解&#xff1a;LeetCode…

区块链国赛题目--食品溯源(模块三)

区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…

学习笔记:Netty网络编程框架

学习视频&#xff1a;Java网络编程教程——Netty深入浅出 参考笔记&#xff1a;网络编程 Netty 前言一、NIO 基础1. NIO三大核心组件1.1 缓冲区 Buffer1.1.1 创建Buffer的方式1.1.2 HeapByteBuffer与DirectByteBuffer1.1.3 Buffer初体验1.1.4 Buffer三个重要参数 1.2 通道 Chan…

牛客网剑指Offer-树篇-JZ27 二叉树的镜像

题目 来源&#xff1a;JZ27 二叉树的镜像 描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0≤n≤1000 &#xff0c; 二叉树每个节点的值 0≤val≤1000 要求&#xff1a; 空间复杂度 O(n) 。本题也有原地操作&#xff0c;即…

Axure设置文本——元件动作三

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;设置文本 主要内容&#xff1a;掌握文本框的类型、属性、设置文本赋值的过程 应用场景&#xff1a;各种输入框、数据的重复赋值&#xff1b;多种小…

关于前端程序员使用Idea快捷键配置的说明

相信很多前端程序员 转到后端第一件事就是安装Idea然后学习java&#xff0c;在这里面最难的不是java的语法&#xff0c;而是关于快捷键的修改&#xff0c;前端程序员用的最多的估计就是VsCode或者Webstorm&#xff0c;就拿我自己举例我经常使用Vscode&#xff0c;当我写完代码下…

11-Dockerfile

11-Dockerfile Dockerfile Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤&#xff1a; 编写Dockerfile文件docker build命令构建镜像docker run依据镜像运行容器实例 构建过程 Dockerfile编写&#xff1a…

【零售和消费品&存货】食品分类检测系统源码&数据集全套:改进yolo11-RepNCSPELAN_CAA

改进yolo11-goldyolo等200全套创新点大全&#xff1a;食品分类检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视…

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法

在当今科技日新月异的时代&#xff0c;行人入侵检测技术作为安全防护的重要组成部分&#xff0c;正经历着前所未有的发展。入侵检测算法平台部署LiteAIServer作为这一领域的佼佼者&#xff0c;凭借其卓越的技术实力与广泛的应用价值&#xff0c;正逐步成为守护公共安全的新利器…

命令如诗,步入Linux的晨曦:指令初学者的旅程(下)

文章目录 前言&#x1f99a;补充内容——管道管道的意义示例 &#x1f99a;11. cat - 显示文件内容11.1 显示文件内容11.2 连接多个文件并显示内容11.3 显示行号11.4 合并文件11.5 显示非打印字符11.6 将标准输入输出到文件 &#x1f99a;12. less - 分页查看文件内容12.1 基本…

【安全性分析】正式安全分析与非正式安全分析

安全性分析-系列文章目录 第一章 【安全性分析】正式安全分析与非正式安全分析 第二章 【安全性分析】BAN逻辑 (BAN Logic) 文章目录 安全性分析-系列文章目录前言一、正式安全分析1. 理想化模型(如随机预言机模型)2. 标准模型(Standard Model)3. 形式化验证4. 数学证明二…

kettle工具小经验

1、kettle本地连接数据库报错Error connecting to database: (using class oracle.jdbc.driver.OracleDriver) 原因&#xff1a;缺少jdbc jar包 处理&#xff1a;在data-integration\libswt\win64目录放一个jdbc jar包&#xff0c;我放的是ojdbc6.jar。 不知道为什么&#xff…

Android平台RTSP转RTMP推送之采集麦克风音频转发

技术背景 RTSP转RTMP推送&#xff0c;好多开发者第一想到的是采用ffmpeg命令行的形式&#xff0c;如果对ffmpeg比较熟&#xff0c;而且产品不要额外的定制和更高阶的要求&#xff0c;未尝不可&#xff0c;如果对产品稳定性、时延、断网重连等有更高的技术诉求&#xff0c;比较…

SSM旅游信息系统-计算机毕业设计源码00526

目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 旅游信息系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流…

「Mac畅玩鸿蒙与硬件7」鸿蒙开发环境配置篇7 - 使用命令行工具和本地模拟器管理项目

本篇将讲解在 macOS 上配置 HarmonyOS 开发环境的流程&#xff0c;聚焦 hvigorw 命令行工具的使用。我们将以创建 HelloWorld 项目为例&#xff0c;演示使用 hvigorw 进行项目构建、清理操作&#xff0c;并通过 DevEco Studio 的本地模拟器进行预览&#xff0c;帮助提升项目开发…

央国企信创替代,2027年目标百分达成!信创人才评价成标配?

在2027年之前&#xff0c;央国企实现100%的信创替代&#xff0c;标志着中国信息技术应用创新产业发展步入关键阶段。 这一目标不仅体现了国家对于科技自主可控的高度重视&#xff0c;也预示着国内信创产业将迎来前所未有的发展机遇。 一、政策与市场背景 自2020年以来&#xff…

BOE(京东方)全新一代发光器件赋能iQOO 13 全面引领柔性显示行业性能新高度

10月30日,备受瞩目的iQOO最新旗舰机——被誉为“性能之光”的iQOO 13在深圳震撼发布。该款机型由BOE(京东方)独供6.82英寸超旗舰2K LTPO直屏,行业首发搭载全新一代Q10发光器件,在画面表现、护眼舒适度及性能功耗方面均达到行业领先水准,并以“直屏超窄边”的设计为用户呈现了前…

Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景

介绍 网络爬虫&#xff08;Web Crawler&#xff09;是自动化的数据采集工具&#xff0c;用于从网络上提取所需的数据。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;很多网站增加了复杂的防护机制&#xff0c;使得数据采集变得更加困难。在这种情况下&#xff0c;Pyt…

【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据

【SAP Hana】X-DOC&#xff1a;数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS&#xff0c;从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…