MyBatisPlus Study Notes

news2024/11/15 17:51:10

文章目录

  • 1 MyBatisPlus概述
    • 1.1 MyBatis介绍
    • 1.2 MyBatisPlus特性
  • 2 标准数据层开发
    • 2.1 MyBatisPlus的CRUD操作API
    • 2.2 分页功能接口实现
      • 2.2.1 config(配置层)拦截器实现
      • 2.2.2 Dao(Mapper)数据访问层(CRUD)操作
      • 2.2.3 Junit单元测试进行测试
    • 2.3 开启MyBatisPlus日志
    • 2.4 取消初始化spring日志打印
    • 2.5 取消SpringBoot启动banner图标、关闭mybatisplus启动图标
  • 3 MyBatisPlus DQL
    • 3.1 条件查询API
    • 3.2 条件查询
      • 3.2.1 方式一:按条件查询(常规格式)
      • 3.2.2 方式二:按条件查询(lambda格式)
    • 3.3 MyBatisPlus中null值判断
    • 3.4 批量(Batch)操作
    • 3.5 查询投影(聚合查询)【查询字段、分组、分页】
    • 3.6 字段映射与表名映射
  • 4 DML编程控制
    • 4.1 id生成策略控制(Insert)
    • 4.2 逻辑删除(Delete/Update)
      • 4.2.1 数据库表中添加逻辑删除字段
      • 4.2.2 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
  • 5 乐观锁(Update)

1 MyBatisPlus概述

1.1 MyBatis介绍

  • MyBatisPlus(简称MP)基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
  • MyBatisPlus官网

1.2 MyBatisPlus特性

  • 无侵入:只做增强不做改变,不会对现有工程产生影响
  • 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
  • 支持 Lambda:编写查询条件无需担心字段写错
  • 支持主键自动生成
  • 内置分页插件
  • ……

2 标准数据层开发

2.1 MyBatisPlus的CRUD操作API

在这里插入图片描述

2.2 分页功能接口实现

在这里插入图片描述

2.2.1 config(配置层)拦截器实现

此处拦截SQL语句,目的是为了拼接,分页条件

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1.定义Mp拦截器 ,创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体的拦截器、添加分页拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

2.2.2 Dao(Mapper)数据访问层(CRUD)操作

实现BaseMapper<>接口

@Mapper
public interface UserDao extends BaseMapper<User> {
}

2.2.3 Junit单元测试进行测试

    @Test
    public void testPage() {
        IPage<User> page = new Page(2, 5);// 分页构造器:设置 当前第几页 一页多少条
        IPage<User> pageResult = userDao.selectPage(page, null);
        System.out.println(JSON.toJSONString(page));
        System.out.println("数据列表" + JSON.toJSONString(pageResult.getRecords()));
        System.out.println("当前页码" + pageResult.getCurrent());
        System.out.println("每页条数" + pageResult.getSize());
        System.out.println("总记录数" + pageResult.getTotal());
        System.out.println("总页数" + pageResult.getPages());
    }
}

2.3 开启MyBatisPlus日志

# 开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.4 取消初始化spring日志打印

做法:在resources下新建ogback.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>

2.5 取消SpringBoot启动banner图标、关闭mybatisplus启动图标

spring:
  main:
    banner-mode: off # 关闭SpringBoot启动图标(banner)
# mybatis-plus日志控制台输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: off # 关闭mybatisplus启动图标

3 MyBatisPlus DQL

3.1 条件查询API

在这里插入图片描述

3.2 条件查询

3.2.1 方式一:按条件查询(常规格式)

//方式一:按条件查询
    @Test
    public void test1(){
        // select * from user where age >= 18 and age < 65
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.ge("age",18);
        qw.lt("age",65);
        List<User> userList = userDao.selectList(qw);
        System.out.println(JSON.toJSONString(userList)); //[{"age":28,"id":5,"name":"snake","password":"123456","tel":"12345678910"},{"age":22,"id":6,"name":"张益达","password":"123456","tel":"12345678910"}]

        /*
         System.out.println(userList);
        不进行JSON转换输出[User(id=5, name=snake, password=123456, age=28, tel=12345678910), User(id=6, name=张益达, password=123456, age=22, tel=12345678910)]
        * */
    }

3.2.2 方式二:按条件查询(lambda格式)

查阅源码优化全局变量处声明对象操作
在这里插入图片描述在这里插入图片描述

3.2.2.1全局变量声明

    LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery();//lambdaQuery 可用屏蔽底层的具体实现,未来会有变化上层代码无需过多的调整。而且不用new对象减少内存
    @Autowired
    private UserDao userDao;

3.2.2.2 select * from user where age >= 18 and age < 65

传统语法MyBatisPlus语法说明
<ltless than
<=leless equal
>gtgreater than
>=gegreater equal
=eqequal
between and范围
like模糊查询
in在in之后的列表中的值,多选一
	//lambda格式
    @Test
    public void test2(){
        // select * from user where age >= 18 and age < 65

        //LambdaQueryWrapper<User> userLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
       // LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery();
        userLambdaQueryWrapper.ge(User::getAge,18).lt(User::getAge,65);
        List<User> userList = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(JSON.toJSONString(userList));
        System.out.println("=================");
        System.out.println(userList);
    }
 // 等于
    @Test
    public void test3(){
        //select * from user where name = "tom"
        userLambdaQueryWrapper.eq(User::getName,"tom");
        List<User> userList = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(JSON.toJSONString(userList));
    }

3.3 MyBatisPlus中null值判断

 /**
     * null值判断
     * 判断 字段值是否为null 不为null才拼接查询条件
     */
    @Test
    public void test31(){
        //模拟前端传的参数
        //select * from user where name = null
        User user = new User();
      /*  if (user.getName()!=null){
            userLambdaQueryWrapper.eq(User::getName,user.getName());
        }健壮性判断*/

        userLambdaQueryWrapper.eq(user.getName()!= null,User::getName,user.getName());
        //此处user.getName()为空,User::getName与user.getName()作对比,
        //      即  在数据库实体类中的name属性="null" 做判断条件



        List<User> userList = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(JSON.toJSONString(userList));
    }

 // like模糊查询
    @Test
    public void test4(){
        //select * from user where name like "j%"

        userLambdaQueryWrapper.like(User::getName,"j");
        List<User> list = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(list);
    }
 /**
     * between
     */
    @Test
    public void test5(){
        //select * from user where age between 16 and 28

        userLambdaQueryWrapper.between(User::getAge, 16, 28);
        List<User> list = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(list);
    }
    /**
     * in
     */
    @Test
    public void test6(){
        //select * from user where id in (1,2,3)
        List<Integer> inList = Arrays.asList(1, 2, 3);
        userLambdaQueryWrapper.in(User::getId, inList);
        List<User> list = userDao.selectList(userLambdaQueryWrapper);
        System.out.println(list);
    }

3.4 批量(Batch)操作

    /**
     * 根据id列表批量查询
     */
    @Test
    public void test1(){
        List<Integer> ids = Arrays.asList(1, 2, 3);//将一个变长参数或者数组转换成List
        List<User> userList = userDao.selectBatchIds(ids);
        System.out.println(userList);
    }
    /**
     * 根据id列表批量删除
     */
    @Test
    public void test2(){
        List<Integer> ids = Arrays.asList(1, 2, 3);
        int count = userDao.deleteBatchIds(ids);
        System.out.println(count);
    }

3.5 查询投影(聚合查询)【查询字段、分组、分页】

    /**
     * 聚合查询一般用: selectMaps
     */
    @Test
    public void test(){
        //select tel, count(*) as cnt from user group by tel order by cnt;

        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.select("tel","count(*) as cnt");
        userQueryWrapper.groupBy("tel");
        userQueryWrapper.orderByAsc("cnt");
        List<Map<String, Object>> mapList = userDao.selectMaps(userQueryWrapper); //selectMaps:根据 Wrapper 条件,查询全部记录
        System.out.println(JSON.toJSONString(mapList));
    }

3.6 字段映射与表名映射

注解说明
@TableField通过value属性(value="数据库中实际字段名"),设置当前属性对应的数据库表中的字段关系
@TableField通过exist属性(true存在;false不存在),设置属性在数据库表字段中是否存在,默认为true。不能与value合并使用
@TableField通过select属性(true参与;false不参与):设置该属性是否参与查询。此属性与select()映射配置不冲突。
@TableName通过value属性@TableName("数据库中实际表名"),设置当前类对应的数据库表名称

4 DML编程控制

4.1 id生成策略控制(Insert)

注解说明
@TableId 1、AUTO(0): 使用数据库id自增策略控制id生成;2、NONE(1):不设置id生成策略;3、INPUT(2):用户手工输入id;4、ASSIGN_ID(3):雪花算法生成id (可兼容数值型与字符串型);5、ASSIGN UUID(4):以UUID生成算法作为id生成策略

4.1.1 全局配置

mybatis-plus:
  global-config:
    db-config:
      id-type: assign_id
      table-prefix: tbl_

4.2 逻辑删除(Delete/Update)

4.2.1 数据库表中添加逻辑删除字段

在这里插入图片描述

4.2.2 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

package com.itheima.domain;

import com.baomidou.mybatisplus.annotation.*;

import lombok.Data;

@Data
public class User {

    private Long id;
    
    //逻辑删除字段,标记当前记录是否被删除
    @TableLogic
    private Integer deleted;
    
}

4.2.2.1 全局配置逻辑删除字面值(不建议)

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      # 逻辑删除字段名
      logic-delete-field: deleted
      # 逻辑删除字面值:未删除为0
      logic-not-delete-value: 0
      # 逻辑删除字面值:删除为1
      logic-delete-value: 1

5 乐观锁(Update)

在这里插入图片描述
乐观锁的解决思想:
首先,在多个线程访问共享资源(数据库)时,给数据库添加一个version(int)的标记字段,然后,当某一个线程首先获取到数据库中资源是,version发生改变(常规操作自动加一),

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

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

相关文章

新版本GPU加速的tensorflow库的配置方法

本文介绍在Anaconda环境中&#xff0c;配置可以用GPU运行的Python新版tensorflow库的方法。 在上一篇文章Anaconda配置Python新版本tensorflow库&#xff08;CPU、GPU通用&#xff09;的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/129285815&am…

【分布式】10张图带你彻底搞懂限流、熔断、服务降级

文章目录1 限流1.1 限流指标1.1.1 TPS1.1.2 HPS1.1.3 QPS1.2 限流方法1.2.1 流量计数器1.2.2 滑动时间窗口1.2.3 漏桶算法1.2.4 令牌桶算法1.2.5 分布式限流1.2.6 hystrix限流1.2.6.1 信号量限流1.2.6.2 线程池限流2 熔断2.1 断路器的状态2.2 需要考虑的问题2.3 使用场景3 服务…

游戏开发是个“坑”,而且是个“天坑”

本文首发于CSDN公众号 作者 | 开发游戏的老王 责编 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 各位游戏开发者大家好&#xff0c;我是开发游戏的老王&#xff0c;一名游戏开发者同时也是一名高校游戏方向的主讲教师&#xff0c;从事游戏开发及相关教…

HTTP缓存从入门到踹门

1 与缓存相关的字段Expires&#xff1a;缓存的绝对过期时间Cache-Control&#xff1a;缓存的相对过期时间Last-Modified&#xff1a;缓存上一次修改的时间&#xff08;服务端保存&#xff09;If-Modified-Since&#xff1a;缓存上一次修改的时间&#xff08;客户端保存&#xf…

第十一届蓝桥杯省赛——2解密

题目&#xff1a;【问题描述】小明设计了一种文章加密的方法&#xff1a;对于每个字母 c&#xff0c;将它变成某个另外的字符 Tc。下表给出了字符变换的规则&#xff1a;字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…

【ArcGIS Pro二次开发】(11):面要素的一键拓扑

在工作中&#xff0c;经常需要对要素进行拓扑检查。 在ArcGIS Pro中正常的工作流程是在数据库中【新建要素数据集——新建拓扑——将要素加入拓扑——添加规则——验证】&#xff0c;工作流程不算短&#xff0c;操作起来比较繁琐。 下面以一个例子演示如何在ArcGIS Pro SDK二次…

数组一次性删除多条数据

需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮&#xff0c;点击时将当前行的索引传递给方法&#xff0c;splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…

爬虫实战进阶版【1】——某眼专业版实时票房接口破解

某眼专业版-实时票房接口破解 某眼票房接口:https://piaofang.maoyan.com/dashboard-ajax 前言 当我们想根据某眼的接口获取票房信息的时候,发现它的接口处的参数是加密的,如下图: 红色框框的参数都是动态变化的,且signKey明显是加密的一个参数。对于这种加密的参数,我们需要…

第14届蓝桥杯STEMA测评真题剖析-2023年2月12日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第103讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

域权限维持之创建DSRM后门

DSRM&#xff08;目录服务还原模式&#xff09;&#xff0c;在初期安装域控的时候会让我们设置DSRM的管理员密码&#xff0c;这个密码是为了在后期域控发生问题时修复、还原或重建活动目录。DSRM账户实际上是administrator账户&#xff0c;并且该账户的密码在创建之后很少使用。…

Azure OpenAI 官方指南 01|GPT-3 的原理揭秘与微调技巧

Azure OpenAI 服务在微软全球 Azure 平台正式发布后&#xff0c;迅速成为众多用户最关心的服务之一。 Azure OpenAI 服务允许用户通过 REST API 访问 OpenAI 的强大语言模型&#xff0c;包括 GPT-3、Codex 和 Embeddings 模型系列。本期&#xff0c;我们将为您揭秘 Azure Open…

乌班图安装kvm并配置网络

乌班图22安装KVM 1.安装KVM sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinstsudo adduser id -un libvirt sudo adduser id -un kvm sudo apt install virtinst qemu-efi sudo systemctl enable --now libvirtd sudo s…

Tcl_Init error: Can‘t find a usable init.tcl in the following directories

目录 问题 解决 小结 问题 最近在研究开源波形显示软件gtkwave时,Ubuntu18.04下编译打包完成,移植到另一个电脑上运行时,出现以下错误,如图: 擦掉的部分是一些路径信息,这个错误提示意味着您的系统中缺少所需的 Tcl 初始化文件,路径下确实没有init.tcl文…

嵌入式 LVGL移植到STM32F4

目录 LVGL简介 1、特点 2、LVGL的硬件要求 3、相关网站 4、LVGL源码下载 5、LVGL移植要求 5.1 移植过程-添加源码 2、更改接口文件 3、显示实现 4、添加外部中文字体的方法 5、编译下载后有几种情况 6、调用显示 6、GUI-Guider使用 6.1 安装软件 6.2 使用…

Kakfa详解(一)

kafka使用场景 canal同步mysqlelk日志系统业务系统Topic kafka基础概念 Producer: 消息生产者&#xff0c;向kafka发送消息Consumer: 从kafka中拉取消息消费的客户端Consumer Group: 消费者组&#xff0c;消费者组是多个消费者的集合。消费者组之间互不影响&#xff0c;所有…

Wireshark+Go捕获本地TCP通信

初学计网&#xff0c;使用Wireshark观察本地端口间TCP通信过程。 目录 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤1&#xff1a; 使用go语言搭建本地客户端与服务器TCP通信&#xff0c;测试完成后在步骤2先运行服务器&#xff0c;再运行客户端。 服务器…

C语言查漏补缺(进阶)volatile、__attribute__、void*、地址对齐、$$Super$main

最近在学习RT-Thread&#xff0c;在看其源码的时候发现了许多自己不太了解的C语言知识点&#xff0c;在此查漏补缺一下。 1. 关键字 volatile volatile是C90新增关键字&#xff0c;volatile的的中文意思是adj.易变的&#xff1b;无定性的&#xff1b;无常性的&#xff1b;可…

如何使用FarsightAD在活动目录域中检测攻击者部署的持久化机制

关于FarsightAD FarsightAD是一款功能强大的PowerShell脚本&#xff0c;该工具可以帮助广大研究人员在活动目录域遭受到渗透攻击之后&#xff0c;检测到由攻击者部署的持久化机制。 该脚本能够生成并导出各种对象及其属性的CSV/JSON文件&#xff0c;并附带从元数据副本中获取…

Python|每日一练|递归|数学|数组|动态规划|树|深度优先搜索|单选记录:排列序列|三角形最小路径和|求根节点到叶节点数字之和

1、排列序列&#xff08;递归&#xff0c;数学&#xff09; 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213…

webpack基本使用和开发环境配置

目录 1 webpack 基本使用 01 webpack 简介 02 webpack 初体验 2 webpack开发环境配置 03 打包样式资源 04 打包html资源 05 打包图片资源 06 打包其他资源&#xff08;以打包icon为例&#xff09; 07 devServer 08.开发环境配置 1 webpack 基本使用 由于笔记文档没有…