MyBatis-Plus是什么?为什么用?怎么用?

2023-11-07

1.MyBatis-Plus是什么?

官方是这样定义的:

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

所谓的增强,就是已经封装好了一些crud(增删改查),不用再写mapper.xml,可以直接调用它的方法即可,如以下方法:


2.为什么要用MyBatis-Plus?

优点:

  • 效率提高了,因为基本的CRUD写好了
  • 支持Lambda形式调用,不用担心字段写错而引起的异常
  • 支持主键自动生成
  • 内置分页插件
  • 基于mybatis做增强而已
  • SQL语句自由控制,较为灵活
  • 提供动态SQL语句,可以根据需求灵活控制SQL与业务代码分离,易于阅读
  • 提供功能丰富的条件构造器快速进行无sql开发
  • 内置代码生成器,分页插件, 性能分析插件等


3.怎么用MyBatis-Plus?

需要注意的地方1:

(1)实体类中,如果使用了基本数据类型,就会导致在修改的时候,把原本不需要改动的数据也改动了,

因为原先的基本数据类型默认有值,所以他会默认set进去

(2)如果传入对象属性为nul,这些属性不参与sql拼接,也就不会set进去,因为他默认有判空机制

(3)如果是8个基本数据类型,有默认值,mybatis-plus认为是有值的,会拼接,也就会set进去


在讲下面的增删改查时,我们还需要了解下条件Wrapper特殊符号的意思,在下面的CRUD环节中会部分举例说明,

  • ne-------------不等(not equal)
  • eq---------等于
  • gt----------大于
  • lt----------小于
  • ge-------大于等于
  • le---------小于等于
  • between----xxx之间(wrapper.between("age",18,20)查询年龄在18-20)
  • notbetween---不在xxx之间
  • isNull---------是空
  • isNotNull-----不是空
  • in-------wrapper.in("id",1L,2L)查id为1和2的,这里因为是布尔类型
  • insql--------wrapper.insql("id","1,2")//sql片段
  • 错误写法wrapper.insql("id","1L,2L"),错误原因是加了L就是java语法了,而不是sql语法


主食来了---->CRUD(增删改查)

开始操作之前需要准备一下操作,主要:建库建表->引以下依赖->配置application.properties连接数据

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

(1)添加

MP添加没有过多的操作,方法就是insert();(例子如下)

@Test
public void testSave(){
        Employee employee = new Employee();
        employee.setAdmin(true);
        employee.setAge(18);
        employee.setDeptId(1L);
        employee.setEmail("EDC@123");
        employee.setName("edc");
        employee.setPassword("111");
        employeeMapper.insert(employee);
    }

(2)删除

MP删除的方法有这四个,分别是deleteById;delete;deleteBatchIds;deleteByMap,其中标黄的,在下方代码段中有举例,另外一个可以见名猜意,然后去实践一下;(例子如下)

    @Test
    public void testDelete(){
        //最普通的根据id来删
        employeeMapper.deleteById(1L);
        System.out.println("------------------------------------------------------");
        //根据指定的条件来删
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
        wrapper.eq(Employee::getAdmin,true);//设置条件,条件是admin为true
        wrapper.lt(5>4,Employee::getAge,10);//年龄小于10的
        //此时的wrapper的条件是admin为true的并且年龄小于10
        employeeMapper.delete(wrapper);
        System.out.println("------------------------------------------------------");
        //传集合进来来删
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        employeeMapper.deleteBatchIds(list);//删除该数组的元素
    }
  • 在上述代码中,条件删除的时候,有引用到"lt()",其中5>4为ture,只有满足这个条件才会加上,这个条件"年龄小于10岁",此时的wrapper条件是admin为true并且年龄小于10
  • 如果前者条件为false,则不会加上"年龄小于10岁"这个条件,此时的wrapper条件就是admin为true的

(3)修改

MP修改有这两种,分别是updateById,update

    @Test
    public void testUpdate(){
        //根据id修改
        Employee employee = new Employee();
        employee.setId(3L);
        employee.setAdmin(true);
        employee.setAge(18);
        employee.setDeptId(1L);
        employee.setEmail("alun@123.cn");
        employee.setName("edc");
        employee.setPassword("111");
        employeeMapper.updateById(employee);

        System.out.println("-------------------------------------------");

        //条件修改
        Employee employee1 = new Employee();
        employee1.setEmail("alun@123.cn");
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
        wrapper.ne(Employee::getAdmin,true);//设置条件,条件不等于true,那就是false囖
        wrapper.ge(5>4,Employee::getAge,10);//年龄大于或等于10
        employeeMapper.update(employee1 ,wrapper);
    }
  • 在上述代码中,条件删除的时候,有引用到"ge()",其中5>4为ture,只有满足这个条件才会加上,这个条件"年龄大于或等于10岁",此时的wrapper条件是admin为false并且年龄大于或等于10岁
  • 如果前者条件为false,则不会加上"年龄小于10岁"这个条件,此时的wrapper条件就是admin为false的

(4)查询

MP查询有10种,分别是selectByMap,selectMaps,selectMapsPage,selectObjs,selecyPage,

selectById,selectList,selectBatchIds,selectCount,selectOne

    @Test
    public void testGet(){
        //根据id来查
        Employee employee = employeeMapper.selectById(1L);
        System.out.println("------------------------------------------------------");
        //查所有
        List<Employee> list1 = employeeMapper.selectList(null);
        System.out.println("------------------------------------------------------");
        //根据集合查
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        List<Employee> employees = employeeMapper.selectBatchIds(list);
        System.out.println("------------------------------------------------------");
        //条件查询,返回满足条件的个数
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
        wrapper.ne(Employee::getAdmin,true);//设置条件,条件是false的
        wrapper.ge(Employee::getAge,10);//年龄大于或等于10
        Integer integer = employeeMapper.selectCount(wrapper);
        System.out.println("------------------------------------------------------");
        //根据条件来查询
        LambdaQueryWrapper<Employee> wrapper1 = new LambdaQueryWrapper<>();//创建条件构造器
        wrapper1.eq(Employee::getAdmin,true)
                .lt(5>4,Employee::getAge,10);//设置条件,条件是admin为true并且年龄小于10的
        Employee employee1 = employeeMapper.selectOne(wrapper1);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis-Plus是什么?为什么用?怎么用? 的相关文章

  • 使用itext java库复制时pdf文件大小大大增加

    我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中 我使用的是 itextpdf 5 5 10 版本 我在两种方式上都面临着不同的问题 PDFStamper 和 PdfCopy 当我使用 PDFSt
  • 使用 Spring MVC 在 jar 文件中显示 jsp 页面

    我正在使用 Spring MVC 3 2 2 在 java 中开发一个 Web 应用程序 我在从 jar 文件中加载 jsp 页面时遇到问题 Spring MVC Web应用程序具有以下结构 META INF WEB INF spring
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github

随机推荐

  • TextView textSize 文字大小

    TextView 很常见的控件 关于文字大小的方法有 android widget TextView getTextSize 返回值的单位是PX return the size in pixels of the default text s
  • busybox简介

    busybox BusyBox 是标准 Linux 工具的一个单个可执行实现 BusyBox 包含了一些简单的工具 例如 cat 和 echo 还包含了一些更大 更复杂的工具 例如 grep find mount 以及 telnet 有些人
  • 150. 逆波兰表达式求值 python

    给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 注意 有效的算符为 和 每个操作数 运算对象 都可以是一个整数或者另一个表达式 两个整数之间的除法总是 向零截断
  • 美容行业的翻身仗:ChatGPT带你玩转营销活动

    今天给大家带来一个 用ChatGPT给美容院 美容店 美容行业的商家 出一个营销策划活动方案的实例 在这个竞争激烈的美容行业 想要脱颖而出 你得有点与众不同的手段 别再拿那些陈词滥调的营销策略来忽悠我了 今天我要给你揭示一个行业的秘密武器
  • 【STATA】代码自用

    数据处理 描述性统计 输出 asdoc sum stat N mean sd tstat p1 p99 fs 7 dec 2 结果展示去除变量 reghdfe absorb vr 一对多合并 merge 1 m Symbol Year us
  • docker镜像制作(python2.7,redis)

    四 自制docker镜像 初始化 在任意文件夹下 mkdir mydocker cd mydocker 1 初始化Dockerfile文件 以python 2 7为模板制作镜像 注意要提前下载好该镜像 FROM python 2 7 sli
  • 从汇编分析函数调用堆栈详细过程

    前言 首先来说 我们今天的学习并不是为了学习汇编语言 而是为了更好地分析一些问题的底层原理 进入正题 首先由下面简单的代码我们来考虑两个问题 1 main函数调用sum sum执行完以后 怎么知道回到哪个函数中 2 sum函数执行完 回到m
  • STM32的SYSTICK详解

    什么是SysTick 这是一个24位的系统节拍定时器system tick timer SysTick 具有自动重载和溢出中断功能 所有基于Cortex M3处理器的微控制器都可以由这个定时器获得一定的时间间隔 SysTick作用 在单任务
  • Unity 利用AES给文件加密与解密

    using System using System Collections using System Collections Generic using System IO using System Security Cryptograph
  • OpenStack H版发布

    根据官方发布的消息 OpenStack 2013 2 代号Havana 最终版已经发布 除了增加OpenStack Metering Ceilometer 和OpenStack Orchestration Heat 两个新组件外 还完成了4
  • python3-关于GitHub的最基本操作

    阅读目录 介绍 什么是GitHub 创建存储库 创建一个分支 做一个提交 打开拉取请求 合并拉取请求 一 介绍 Hello World项目是计算机编程历史悠久的传统 这是一个简单的练习 可以让你在学习新东西时开始学习 让我们开始使用GitH
  • DB2检查死锁和解锁的命令(AIX系统)

    在交易量比较大的系统上经常由于程序原因或者数据库配置参数不当导致死锁发生 在交易高峰期 检查易发生死锁的表就很有必要 常用命令如下 1 检查监视器开关是否打开 db2 get monitor switches 如果锁定信息中
  • ajax上传form表单(type='file')FormData

    一般上传表单的时候有两种方式 1 form表单内实现 指定action和 method form标签内添加一个submit的button 点击submit实现上传功能 对任何的形式的input都可以 2 Ajax实现上传 一般情况下我们都会
  • 剑指offer 学习笔记 二叉搜索树的后序遍历序列

    面试题33 二叉搜索树的后序遍历序列 输入一个整数数组 判断该数组是不是某二叉搜索树的后序遍历结果 只要存在一个二叉搜索树的后序遍历结果为它即可 如果是返回true 不是返回false 假设输入数组的任意两个数字都不相同 后序遍历得到的序列
  • 《Python进阶系列》十: 整理文件和目录最最最常用的os模块

    盘一盘Python中的os模块 os模块是Python标准库中整理文件和目录最为常用的模块 该模块提供了非常丰富的方法用来处理文件和目录 图来自 https www cnblogs com ltkekeli1229 p 15709442 h
  • RSS订阅无需代码连接Outlook的方法

    RSS订阅用户使用场景 一家专门做书籍测评的企业 其日常工作中需要收集豆瓣上最受欢迎的书籍进行测评 为了确保测评的准确性和客观性 团队成员需要定期在Outlook上创建会议讨论新书 从不同角度对书籍进行深入剖析 然而 在实际执行过程中 他们
  • 聊聊 220V交流 过零检测

    聊聊过零检测 以及如何实现过零检测 by 矜辰所致 增加测试结果 2023 6 20 目录 前言 一 什么是过零检测 1 1 为何需要过零检测 二 如何做过零检测 2 1 光耦 2 2 比较器 运放 2 3 三极管 MOS管 2 4 过零检
  • 两个序列中位数算法c语言,PAT 2-13 两个有序序列的中位数(C语言实现)

    题目描述 已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A0 A1 AN 1的中位数指A N 1 2的值 即第 N 1 2 个数 A0为第1个数 输入格式说明 输入分3行 第1行给出序列的公共长度N 0 输
  • [DirectX][DirectInput][JoyStick]DirectInput的JoyStick创建步骤整理

    简介 DirectInput和其他DirectX组成部分一样 是通过硬件抽象层 HAL 和硬件仿真层 HEL 来实现 处理的输入设备一般包括鼠标 键盘 游戏控制杆 操作杆等 而且现在的DirectInput还能够支持力反馈设备 Step 1
  • MyBatis-Plus是什么?为什么用?怎么用?

    1 MyBatis Plus是什么 官方是这样定义的 Mybatis Plus 简称MP 是一个 Mybatis 的增强工具 在 Mybatis 的基础上只做增强不做改变 为简化开发 提高效率而生 所谓的增强 就是已经封装好了一些crud