Mybatis plue(二) 核心功能

核心功能

P5 条件构造器

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

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

在这里插入图片描述

示例:

  • 查询出名字带0,存款大于等于1000的人的id,username,info,balance字段

    @Test
    void 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

    @Test
    void 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 user
     SET 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条件
@Test
    void 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
    @Transactional
    public 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可直接构建条件。

    @Override
    public 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

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

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

相关文章

QT 使用QXmlStreamReader/QXmlStreamWriter和QDomDocument俩种方式读写XML文件

文章目录 效果图使用QDomElement读写读取 XML 文档创建或修改 XML 文档 使用QXmlStreamReader和QXmlStreamWriter读写QXmlStreamReaderQXmlStreamWriter 俩种方式的优缺点QXmlStreamReader/QXmlStreamWriterQDomDocument选择建议 总结 效果图 我们可以直接将控件或其他配置的值…

html引入json文本测试数据

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 复现bug时&#xff0c;可以这样给前端准备测试数据。 dayData.json存放测试数据&#xff0c;只需声明为变量即可 这里不用管ide中的报错。 <!DOCTYPE html> <html lang"en">…

一个对我触动很深的生活理念

经常有读者对我的写作过程感到好奇&#xff0c;会问&#xff1a;你是用什么工具来写作的呢&#xff1f;在他们的想象中&#xff0c;可能觉得我有一套非常复杂的知识管理和写作流程&#xff0c;能够快速地组织和安排材料&#xff0c;从而让写作变得非常轻松。 其实不是的。有一段…

VScode-配置文件

导入配置文件 ShiftCtrlp 输入&#xff1a; import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件

Linux_进程的优先级环境变量上下文切换

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量4.1 查看当前shell环境下的环境变量与内容 一、进程的优先级 什么是优先级&#xff1f; 指定一个进程获取某种资源的先后顺序本质是进程获取cpu资源的优先顺序 为什么要有优先级 进程访问的资源&am…

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…

mysql 基本查询

学习了mysql函数&#xff0c;接下来学习mysql基本查询。 1&#xff0c;基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT 语句。SELECT语句的基本格式是&#xff1a; SELECT (*I <字段列表>} FROM <表1>,<表2>..[WHERE<表达式> [GROUP BY <…

VUE——概述

vue是前端框架&#xff0c;基于MVVM思想。 引入 从官网下载vue文件 <script src"js/vue.js"></script> 定义vue对象 new Vue({el: "#x",//vue接管区域&#xff0c;#表示选择器&#xff0c;x是id名字data: {message: "y"} })案例…

宁波ISO45001认证费用

宁波ISO45001认证费用&#x1fae0;是许多企业在考虑&#x1f914;引入国际职业健康安全管理体系时&#x1f566;所关心的一个⁉️重要问题。ISO45001是一个&#x1f30f;全球性的标准&#xff0c;旨在帮助&#x1f3ef;组织建立并维护一个&#x1f388;有效的职业健康安全⭐️…

Flask学习(五):session相关流程

流程图如下图所示&#xff1a; 调用相关类如下图所示&#xff1a; 相关代码如下&#xff1a; from flask import Flask, sessionapp Flask(__name__)1. 加密会话数据&#xff1a;在 Flask 中&#xff0c;会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话…

Java毕业设计-基于springboot开发的HTML问卷调查系统设计与实现-毕业论文(附毕设源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块的实现1.1 问卷列表1.2 新闻资讯信息管理1.3 新闻资讯类型管理 四、毕设内容和源代码获取总结 Java毕业设计-基于…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

springdoc-openapi-用户界面如何将请求设置为HTTPS

一、问题描述 当我们的服务接口需要通过HTTPS访问时&#xff0c;通过swagger可视化页面请求接口的时候&#xff0c;发起的是HTTP请求&#xff0c;导致请求无法到达后端&#xff0c;影响测试。 二、解决方法 1、将服务的地址添加到配置文件中 swagger:server-list: #本地环境…

【Vue3源码学习】— CH2.8 Vue 3 响应式系统小结

Vue 3 响应式系统小结 1.核心概念1.1 Proxy和Reflect1.2 响应式API1.3 依赖收集与更新触发1.4 触发更新&#xff08;Triggering Updates&#xff09;&#xff1a;1.5 副作用函数&#xff08;Effect&#xff09;1.6 计算属性和观察者1.7 EffectScope1.8 性能优化&#xff1a; 2.…

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当&#xff0c;或者密码遗忘&#xff0c;今天测试了一下&#xff0c;可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…

软考高级架构师:性能评价方法概念和例题

一、AI 讲解 性能评价是衡量计算机系统或其组件在指定条件下执行预期任务的有效性的一种方式。性能评价的方法主要可以分为几种&#xff0c;每种方法都有其特点和适用场景。 性能评价方法 方法描述时钟频率法通过计算机的时钟频率来评估性能&#xff0c;时钟频率越高&#x…

morkdown语法转微信公众号排版(免费)

morkdown语法转微信公众号排版&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果

LeetCode 热题 100 | 动态规划(一)

目录 1 70. 爬楼梯 1.1 基本思路 1.2 官方题解 2 118. 杨辉三角 3 198. 打家劫舍 菜鸟做题&#xff0c;语言是 C 1 70. 爬楼梯 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;上到 5 楼的方式有多少种子问题&#xff1a;上到 4 楼的方式有多…

焦虑研究的实验设备——大小鼠高架十字迷宫KT-0856

高架十字迷宫是一种广泛应用于焦虑研究的实验设备&#xff0c;尤其适用于啮齿类动物如大鼠和小鼠。这种迷宫的设计基于啮齿类动物的自然探究行为&#xff0c;以及它们对于高悬敞开环境的恐惧。通过观察和量化动物在开臂和闭臂之间的行为选择&#xff0c;研究人员可以评估其焦虑…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…