Mybatis plue(二) 核心功能

news/2024/7/27 22:14:58/文章来源:https://blog.csdn.net/Misnearch/article/details/137295612

核心功能

P5 条件构造器

mybatisplus支持各种复杂的where条件,可以满足日常开发的所有需求

wrapper就是条件构造器,wrapper就是顶层的,

在这里插入图片描述

示例:

  • 查询出名字带0,存款大于等于1000的人的id,username,info,balance字段
@Testvoid testQueryWrapper() {// 1.构建查询条件,可以wrapper.实现,也可以下方的链式编程QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").ge("balance", 1000);// 2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}
  • 更新用户名为jack的用户的余额为2000
@Testvoid testQueryWrapper() {// 1.构建查询条件,可以wrapper.实现,也可以下方的链式编程QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").ge("balance", 1000);// 2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

P6 核心功能-自定义SQL

什么时候自定义SQL:构造where语句时,可以利用mybatis plus构造复杂的where条件,然后自定义SQL语句中剩下的部分。

例如:需要将id在指定范围的用户的余额扣减指定值,可以怎么做?

手写SQL:

<update id = "updateBalanceByIds">UPDATE userSET balance = balance - #{amount}WHERE id IN<foreach collection="ids" separator="," item="id" open="(" close=")">#{id}</foreach>
</update>

以上用mp实现,如下,但是将sql写在了业务层中,不提倡

List<Long> ids = List.of(1L, 2L, 4L);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id", ids);
userMapper.update(null, wrapper);

这里就用到自定义SQL,即使用mybatisplus构建where条件,但是更新查询的sql语句还是自己在mapper中写,然后将条件传递到mapper中去即可。例如下面的步骤:

  • 基于wrapper构建where条件
@Testvoid testMyCustomSqlUpdate() {// 自定义sql的实现List<Long> ids = List.of(1L, 2L, 4L);int amount = 200;// 定义条件QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);// 调用自定义的方法userMapper.updateBalanceByIds(wrapper, amount);}
  • 在mapper方法参数中用param注解声明wrapper变量名,必须是ew
    void updateBalanceByIds(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("amount") int amount);
  • 自定义sql
  <update id="updateBalanceByIds">UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}</update>

P7 核心功能-Iservice接口基本用法

接口基本上还是增删改查,但是很多基本用法,例如批量新增, 批量删除等操作

业务层我们知道,要定义接口并实现,如果接口继承了mybatisplus的IService,但是没有实现里面的方法也是不行的,所以mybatis plus也提供了实现类ServiceImpl,

在这里插入图片描述

例如接口的继承:public interface IUserService extends IService<User> ,IService中指定泛型

例如实现类的继承,需要加上两个ServiceImpl<M extends BaseMapper, T extends Object>

P8 核心功能-IService开发基础业务接口

例如:
在这里插入图片描述

这里介绍一个知识点,在controller中注入service,之前是使用@autowired,这里不用这种注解,spring中推荐使用构造函数,例如下面:

 private final IUserService userService;public UserController(IUserService userService) {this.userService = userService;
}

但是上述方法中,如果有多个成员变量名,则还要继续增加,不是很方便

因此可以使用lombok注解,不是全参构造,而是@RequireArgsConstructor,同时给service加上final,表名是一个常量,则在类初始化过程中就必须会完成变量的初始化。

在保存新增的时候要先考虑mybatis plus有没有实现方法。

实现新增接口中可能会遇到属性拷贝的问题,这里介绍一下:通过源码可知,BeanUtils.copyProperties通过java反射将类中当前属性字段对应的内容复制到另外一个类中,属性必须具有get/set方法,不然拷贝值为null。

当然这里遇到新增时拷贝的user中info为空的原因不是因为没有get、set方法,而是因为User实体类中的info属性的注解使用了类型转换器,JacksonTypeHandler.class被指定为类型转换器,这意味着该字段的数据将通过Jackson库进行序列化和反序列化。Jackson库通常用于处理JSON数据,因此,这个注解可能用于将数据库中的JSON格式数据与Java对象进行映射和转换。例如在数据库中存储的信息为:{"age": 24, "intro": "英文老师", "gender": "female"},所以新增的时候也要传入json格式数据。

例如:

import org.springframework.beans.BeanUtils;
BeanUtils.copyProperties(userFormDTO, user);

P9 核心功能-IService开发复杂业务接口

例如扣减用户余额,不能直接写sql对用户进行扣减,要充分考虑各种状态,例如用户状态,用户余额等。

业务实现示例:

  @Override@Transactionalpublic void deductBalance(Long id, Integer money){// 获取当前用户User user = this.getById(id);// 判断当前状态if (user == null || user.getStatus() == UserStatus.FROZEN){throw new RuntimeException("用户状态异常");}// 检查余额if (user.getBalance() < money){throw new RuntimeException("用户余额不足");}// 实现mapper方式userMapper.deductBalance(id, money);}

P10 核心功能-IService的Lambda方法

lambda的查询

例如:实现一个根据复杂条件查询用户的接口,查询条件为:

  • name,可以为空

  • status,可以为空

  • minBalance,最小余额可以为空

  • maxBalance,最大余额,可以为空

实现:

controller实现一个请求实体对象接受请求,并在业务层处理,最终返回用户信息,也用VO实体封装,

例如controller的实现

   @ApiOperation("根据复杂条件查询用户")@GetMapping("/list")public List<UserVO> queryUsers(UserQuery userQuery){// 将请求传过来的实体中的信息获取传到业务层List<User> users = userService.queryUsers(userQuery.getName(), userQuery.getStatus(), userQuery.getMinBalance(), userQuery.getMaxBalance());return BeanUtil.copyToList(users, UserVO.class);}

使用lamdaquery可直接构建条件。

    @Overridepublic List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {return lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).ge(minBalance != null, User::getBalance, minBalance).le(maxBalance != null, User::getBalance, maxBalance).list();}

lambda的更新

例如更新余额操作,

   lambdaUpdate().set(User::getBalance, remainBalance).set(remainBalance == 0, User::getStatus, UserStatus.FROZEN).eq(User::getId, id).eq(User::getBalance, user.getBalance()) // 乐观锁,避免多线性造成.update(); // 上述只是构建条件,这一句是执行更新

P11 核心功能-IService的批量新增

例如:批量插入10万条数据,

  • 尝试使用for循环依次插入,时间勉勉强强

  • 使用批量插入,考虑到一次网络请求数据量的大小,可以分10x1000进行插入,进行批量新增,效率提升接近10倍,saveBatch,会先预编译成sql语句,但是也是一条条的执行

  • 把上述预编译sql变换成一条条的数据插入,例如下面的方式,虽然数据很对,但是只有一条sql语句,这样才是真正的批处理

    • 使用mybatis plus的批处理,开启rewriteBatchedStatements=true参数(指重写批处理语句,是mysql里面的配置,默认false,改写为true则会转写为下面的形式,实际上是mysql驱动实现的,不是mybatis plus的原因)

在这里插入图片描述

实现配置的操作如下所示:末尾加上这个参数并修改为true

spring:
datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

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

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

相关文章

Oracle Cloud公布 | 每小时 126 亿次 SQL 数据库查询

广而告之&#xff1a;2024 年数据技术嘉年华大会将于 4 月12-13 日在北京召开&#xff0c;春暖花开之际&#xff0c;数据库行业蓬勃发展之时&#xff0c;广邀天下豪杰&#xff0c;相聚北京&#xff0c;共论数据库技术发展的创新与未来。 注册&#xff1a;https://www.modb.pro/…

Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如门控循环…

安卓Android 架构模式及UI布局设计

文章目录 一、Android UI 简介1.1 在手机UI设计中&#xff0c;坚持的原则是什么1.2 安卓中的架构模式1.2.1 MVC (Model-View-Controller)设计模式优缺点 1.2.2 MVP(Model-View-Presenter)设计模式MVP与MVC关系&#xff1a; 1.2.3 MVVM(Model—View—ViewModel ) 设计模式1.2.4 …

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

政务AI交互数字人推动政务“人工智能+”建设

传统的政务平台大多是单向与用户互动&#xff0c;缺乏即时反馈&#xff0c;导致用户需要花费大量时间理解信息&#xff0c;并难以提出问题得到及时解答。 AI交互数字人凭借其智能性&#xff0c;可以在政务网页、政务业务办理大厅一体机、政务APP/小程序等终端设备中&#xff0…

OSPF中配置静态路由实验简述

静态路由协议和OSPF&#xff08;开放最短路径优先&#xff09;协议是两种常见的路由协议&#xff0c;它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表&#xff0c;不会自动适应网络拓扑变化&#xff0c;适用于小型网络或者网络拓扑变化…

非关系型数据库(缓存数据库)redis的基础认知与安装

目录 一.关系型数据库和非关系型数据库 关系型数据库 非关系型数据库 关系数据库与非关系型数据库的区别 ①非关系数据 关系型数据库 非关系型数据库产生背景 数据存储流向 非关系型数据库 关系数据库 二.redis的简介 1.概念 2.Redis 具有以下几个优点: 3.Redi…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—天津大学专场

时间&#xff1a;2024年4月12日&#xff08;星期五&#xff09;14:00 地点&#xff1a;天津大学北洋园校区55楼B204 报名链接&#xff1a;https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业的数…

java 8 stream api将List<T>转换成树形结构

1、新建实体类 package com.example.springboot3.entity;import lombok.Builder; import lombok.Data;import java.util.List;Data Builder public class Menu {/*** id*/public Integer id;/*** 名称*/public String name;/*** 父id &#xff0c;根节点为0*/public Integer p…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

【2023】kafka入门学习与使用(kafka-2)

目录&#x1f4bb; 一、基本介绍1、产生背景2、 消息队列介绍2.1、消息队列的本质作用2.2、消息队列的使用场景2.3、消息队列的两种模式2.4、消息队列选型&#xff1a; 二、kafka组件1、核心组件概念2、架构3、基本使用3.1、消费消息3.2、单播和多播消息的实现 4、主题和分区4.…

AR智能眼镜解决方案_MTK平台安卓主板硬件芯片方案开发

AR智能眼镜&#xff0c;是一个可以让现场作业更智能的综合管控设备。采用移动互联网、大数据和云计算等技术&#xff0c;现场数据的采集与分析&#xff1b;同时实现前端现场作业和后端管理的实时连动、信息的同步传输与存储。让前端现场作业更加智能&#xff0c;后端管理更加高…

Java8 Stream API全面解析——高效流式编程的秘诀

文章目录 什么是 Stream Api?快速入门流的操作创建流中间操作filter 过滤map 数据转换flatMap 合并流distinct 去重sorted 排序limit 限流skip 跳过peek 操作 终结操作forEach 遍历forEachOrdered 有序遍历count 统计数量min 最小值max 最大值reduce 聚合collect 收集anyMatch…

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock)&#xff0c;主要功能有时钟&#xff0c…

Linux-3 yum和vim

目录 本节目标&#xff1a; Linux 软件包管理器 yum 什么是软件包 1.yum是什么&#xff1f;软件包&#xff1f; 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件&#xff1f; 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

Red Hat配置本地yum源

Red Hat配置本地yum源 创建本地源文件夹 mkdir -p /mnt/cdrom挂载镜像文件至指定的目录 mount /dev/cdrom /mnt/cdrom备份本地源 cp -rf /etc/yum.repos.d /etc/yum.repos.d_$(date %Y%m%d_%H%M%S)删除默认原本地源 rm -rf /etc/yum.repos.d/*配置本地源&#xff0c;创建…

苹果应用上架攻略

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍&#xff1a;1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node&#xff08;数据节点&#xff09; 1.2.2MHA Manager&#xff08;管理节点&#xff09; 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

数据结构——第5章 树和二叉树

1 二叉树 二叉树和树都属于树形结构&#xff0c;但两者互不包含。即二叉树不是特殊的树。 1.1 二叉树的基本概念 1.2 二叉树的顺序存储 仅适用于完全二叉树 #define MaxSize 100 typedef int ElemType; typedef struct TreeNode{ElemType value;//结点中的数据元素bool isE…