This repository has been archived on 2025-06-28. You can view files and clone it, but cannot push or open issues or pull requests.
Files
vitepress-theme-blog-charle…/assets/courses_mybatis_02-MyBatis-Plus基础_02-增删改操作.md.0wJpZsHd.js

359 lines
113 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{_ as t}from"./chunks/ArticleMetadata.Sb1DYAHo.js";import{_ as k,D as e,o as n,c as r,I as d,w as g,k as l,a as A,R as y,b as D,e as C}from"./chunks/framework.FVQzxbLi.js";import"./chunks/md5.RtphNWHi.js";const c="/assets/202101190000100.sJehTjr1.png",F="/assets/202101190000200.h3rqnT-R.jpg",B="/assets/202101190000300.i9eKJ92z.gif",o="/assets/202101190000400.0tFSPFSN.gif",E="/assets/202101190000500.X3QK03xR.png",u="/assets/202101190000600.PxmcfwDJ.png",m="/assets/202101190000700.eon6EbP8.png",j=JSON.parse('{"title":"增删改操作","description":"","frontmatter":{"title":"增删改操作","author":"查尔斯","date":"2021/01/19 00:00","categories":["MyBatis-Plus快速入门"],"tags":["MyBatis Plus","MyBatis","ORM框架"]},"headers":[],"relativePath":"courses/mybatis/02-MyBatis-Plus基础/02-增删改操作.md","filePath":"courses/mybatis/02-MyBatis-Plus基础/02-增删改操作.md","lastUpdated":1665050985000}'),b={name:"courses/mybatis/02-MyBatis-Plus基础/02-增删改操作.md"},v=l("h1",{id:"增删改操作",tabindex:"-1"},[A("增删改操作 "),l("a",{class:"header-anchor",href:"#增删改操作","aria-label":'Permalink to "增删改操作"'},"")],-1),I=y('<h2 id="前言" tabindex="-1">前言 <a class="header-anchor" href="#前言" aria-label="Permalink to &quot;前言&quot;"></a></h2><p><strong>C</strong> 在上一篇,笔者带大家快速入门了 MP不知道你是否已经掌握了 MP 的使用步骤,折服于 MP 的强大呢?本篇,笔者将继续在上一篇的 Demo 基础上带你学习 MP掌握 MP 中常见的 CUD 操作 API。</p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>CUD 不知道是什么意思?在咱们后端的圈子里,有一个常常挂在嘴边的名词 &quot;CRUD&quot;。甚至有些同学在去面试时,直言自己在某个项目中就是在做 xxx 的 &quot;CRUD&quot; 而已。</p><p>至于它的含义你使用有道词典都能搜到它的含义。CRUD 代表的是 Create, Read (Retrieve), Update, Delete 这四个单词的简写,俗称 &quot;增删改查&quot;/&quot;增删查改&quot;。</p><p>因为我们做后端,避免不掉的就是操作数据库,而数据库的基本操作就是这四类。另外在行业内,它也一度成为了咱们圈子里较为 &quot;自嘲&quot; 类的名词,有些小伙伴儿常常自称自己是 &quot;CRUD 工程师&quot; ,旨在表达自己平时做的业务都很简单的意思。</p><p>CUD 自然就是笔者从 CRUD 中拆出来的,意味着数据的增删改操作。</p></div><p><img src="'+c+'" alt="202101190000100"></p><h2 id="插入操作" tabindex="-1">插入操作 <a class="header-anchor" href="#插入操作" aria-label="Permalink to &quot;插入操作&quot;"></a></h2><p>你是不是以为,笔者要做一大堆的前情准备工作?你错了,在 MP 中,这一切都不需要。直接 &quot;莽&quot;。</p><p><img src="'+F+`" alt="202101190000200"></p><p>在上一篇 Demo 项目的 UserMapper 中,因为它已经继承了 <a href="https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java" target="_blank" rel="noreferrer">BaseMapper</a> 接口,所以甚至无需编写 UserMapper.xml 文件,就已获得了通用的 CRUD API。</p><p>在 BaseMapper 接口中,插入操作的 API 只有一个。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">// 其他 API 略</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> BaseMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> Mapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 插入一条记录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> entity</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 实体对象</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> insert</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(T </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">entity</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><h3 id="插入1条记录" tabindex="-1">插入1条记录 <a class="header-anchor" href="#插入1条记录" aria-label="Permalink to &quot;插入1条记录&quot;"></a></h3><p>接下来,我们准备测试一下插入操作 API我们先在上一篇 Demo 项目的基础上,复制粘贴一个专门用于测试 CUD 操作的单元测试类。</p><p><img src="`+B+`" alt="202101190000300"></p><p><strong>测试代码:</strong></p><p>笔者提前准备好了一条测试数据。</p><table><thead><tr><th style="text-align:center;">姓名</th><th style="text-align:center;">年龄</th><th style="text-align:center;">邮箱</th></tr></thead><tbody><tr><td style="text-align:center;">Charles</td><td style="text-align:center;">18</td><td style="text-align:center;"><a href="mailto:charles7c@126.com" target="_blank" rel="noreferrer">charles7c@126.com</a></td></tr></tbody></table><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> org.junit.Assert;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusCUDTests</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testInsert</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(){</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 创建用户对象</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setName</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;Charles&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setAge</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setEmail</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;charles7c@126.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 调用插入操作API</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(user);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // MP默认就会自动回填生成的主键</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">getId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user ( id, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, age, email ) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ( ?, ?, ?, ? )</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1352882704631181313</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long), Charles(String), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">), charles7c@126.com(String)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span>1352882704631181313</span></span></code></pre></div><h3 id="id生成策略" tabindex="-1">ID生成策略 <a class="header-anchor" href="#id生成策略" aria-label="Permalink to &quot;ID生成策略&quot;"></a></h3><p>我们在插入成功后,看到用户的 id 值是一个很长的数值,不仔细看还以为是身份证号呢?其实,这是 MP 默认的主键生成策略:<strong>生成分布式唯一ID</strong> 的锅。</p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>所谓的分布式唯一ID简称分布式ID。我们都知道数据库中的每条数据都要定义好一个唯一 ID像 MySQL 等数据库,提供了主键自增功能,以帮助我们自动生成 1、2、3...这种简单的唯一ID。但随着系统业务越来越复杂数据库开始分库分表这种传统的 ID 生成策略在分布式情况下有极大可能出现重复 ID所以分布式 ID 的概念就诞生了。常见的分布式 ID 解决方案有Redis生成ID、UUID、Snowflake(雪花算法)等。</p><p>自 MP 3.3.0 开始,主键生成策略默认为:使用 雪花算法 + UUID(不含中划线) 组合而成。</p><p><strong>UUID</strong> UUID是国际标准化组织ISO提出的一个概念是通用唯一识别码Universally Unique Identifier的缩写。在所有空间和时间上被视为唯一的标识UUID 通常由32个十六进制数字表示以5个字符组显示每个字符组以“-”隔开。例如6db55ec5-ff6f-478a-911d-313de67ed563。</p><p><strong><a href="https://github.com/twitter-archive/snowflake/releases/tag/snowflake-2010" target="_blank" rel="noreferrer">Snowflake</a></strong> Snowflake 是 Twitter 开源的分布式ID生成算法结果是一个 long 型的 ID。</p></div><p>如果我们的需求不需要分布式ID可以替换成 MP 中其他的主键生成策略。我们可以通过查看 MP 的 ID 类型枚举类源码,来查看它有哪些主键生成策略。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 生成ID类型枚举类</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@author</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> hubin</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@since</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 2015-11-10</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Getter</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> enum</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> IdType</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 数据库ID自增</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 该类型请确保数据库支持并设置了主键自增 否则无效</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> AUTO</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> NONE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 用户输入ID</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 该类型可以通过自己注册自动填充插件进行填充</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> INPUT</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /* 注意以下类型、只有当插入对象ID 为空,才自动填充。 */</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 【MP 默认采用此种主键生成策略】</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 通过雪花算法分配ID (主键类型为数值或字符串),</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@since</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 3.3.0 (3.3.0版本新增该策略)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> ASSIGN_ID</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 通过UUID分配ID (主键类型为字符串)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> ASSIGN_UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /* ---------已过时,不建议采用--------- */</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 从3.3.0版本开始过时可使用ASSIGN_ID替代</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">Deprecated</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ID_WORKER(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 从3.3.0版本开始过时可使用ASSIGN_ID替代</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">Deprecated</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ID_WORKER_STR(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">),</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 从3.3.0版本开始过时可使用ASSIGN_UUID替代</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">Deprecated</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UUID(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> final</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> key;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> IdType</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">int</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> key</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.key </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> key;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p>当你看中了某一个生成策略,想来改变默认的主键生成策略时,直接在对应实体类的主键属性上,添加 <code>@TableId</code> 注解即可。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Data</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // @TableId是用于标注主键属性的注解</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // value数据表对应的列名如果实体类属性和数据表列名不一致时使用</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // type主键生成策略类型</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">type</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> IdType.AUTO)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Long</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> name;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> email;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p>当然,如果你每个实体都要更改主键生成策略,最好的方式还是直接在 <code>application.yml</code> 中进行全局配置。</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"># MyBatis Plus配置</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mybatis-plus</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 全局配置</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> global-config</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> db-config</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 主键生成策略</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> id-type</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">auto</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">笔者说</p><p>上方的两种配置,如果你选择了全局配置, <strong>就不需要再配置第一种了</strong> 。</p></div><p>更改了主键生成策略后,别忘了先 Truncate 再 Insert 来重置下当前的用户表数据,否则再测试插入时,数据库主键自增序列是从当前的 ID 最大值开始的。</p><p><img src="`+o+`" alt="202101190000400"></p><p>重置完成后,我们再去测试一下刚才的插入操作。</p><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user ( </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, age, email ) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ( ?, ?, ? )</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: Charles(String), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">), charles7c@126.com(String)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span>6</span></span></code></pre></div><p>很显然这一次MP 不再为我们分配 ID 了,而是由数据库进行主键自增生成的 ID。</p><h2 id="修改操作" tabindex="-1">修改操作 <a class="header-anchor" href="#修改操作" aria-label="Permalink to &quot;修改操作&quot;"></a></h2><p>在 BaseMapper 接口中,修改操作的 API 有两个,但本篇我们先只介绍一个,另一个需要等我们学完下一篇的条件构造器再介绍。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">// 其他 API 略</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> BaseMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> Mapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 根据 ID 修改</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> entity</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 实体对象</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> updateById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.ENTITY) T </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">entity</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 根据 whereEntity 条件,更新记录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> entity</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 实体对象 (set 条件值,可以为 null)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> updateWrapper</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> update</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.ENTITY) T </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">entity</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.WRAPPER) Wrapper&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">updateWrapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><h3 id="根据id修改" tabindex="-1">根据ID修改 <a class="header-anchor" href="#根据id修改" aria-label="Permalink to &quot;根据ID修改&quot;"></a></h3><p>为了测试修改操作 API笔者也提前准备好了一条测试数据。</p><table><thead><tr><th style="text-align:center;">主键</th><th style="text-align:center;">姓名</th><th style="text-align:center;">年龄</th><th style="text-align:center;">邮箱</th></tr></thead><tbody><tr><td style="text-align:center;"><strong>5</strong></td><td style="text-align:center;">Billie</td><td style="text-align:center;"><strong>18</strong></td><td style="text-align:center;"><a href="mailto:Billie@126.com" target="_blank" rel="noreferrer">Billie@126.com</a></td></tr></tbody></table><p><strong>测试代码:</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusCUDTests</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testUpdateById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(){</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 创建用户对象</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5L</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setAge</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 执行修改操作 API</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">updateById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(user);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">UPDATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">? </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><h3 id="自动填充" tabindex="-1">自动填充 <a class="header-anchor" href="#自动填充" aria-label="Permalink to &quot;自动填充&quot;"></a></h3><p>我们在项目开发过程中,经常要在最终存储数据前,进行一些数据填充工作,例如审计信息:创建人、创建时间,更新人、更新时间等。</p><p>这些数据的填充工作重复且枯燥有时候还容易忘记MP 中提供了自动填充功能,可以结束这类问题。</p><p>接下来,我们就以自动填充实体类的 创建时间、更新时间 这两个属性为例来演示一下 MP 的自动填充功能。</p><p><strong>第1步我们需要给实体类、数据库表先做一些结构调整工作。</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 给用户表添加 create_time 和 update_time 两个列</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">ALTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> \`mybatisplus_demodb\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">\`user\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">ADD</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COLUMN </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">\`create_time\`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> datetime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&#39;创建时间&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> AFTER</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> \`email\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">ADD</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COLUMN </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">\`update_time\`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> datetime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&#39;更新时间&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> AFTER</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> \`create_time\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">;</span></span></code></pre></div><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Data</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Long</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> name;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> email;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 添加对应的实体属性createTime、updateTime</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> createTime;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> updateTime;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>第2步在 User 类中添加 @TableField 注解来给属性指定自动填充类型。</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Data</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Long</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> name;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> email;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // @TableField是用于标注普通属性的注解</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // value数据表对应的列名如果实体类属性和数据表列名不一致时使用</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // fill自动填充类型</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // INSERT插入时自动填充</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // UPDATE更新时自动填充</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // INSERT_UPDATE插入或更新时自动填充</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableField</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">fill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> FieldFill.INSERT)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> createTime;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableField</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">fill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> FieldFill.INSERT_UPDATE)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> updateTime;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>第3步创建自动审计处理器实现元对象处理器接口。</strong></p><p><code>com.baomidou.mybatisplus.core.handlers.MetaObjectHandler</code></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 通过 MP 的自动填充功能实现自动审计</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> AutoAuditHandler</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> MetaObjectHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> insertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(MetaObject </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">metaObject</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">strictInsertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(metaObject, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;createTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.class, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">()); </span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">// 起始版本 3.3.0(推荐使用)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">strictInsertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(metaObject, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;updateTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.class, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">()); </span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">// 起始版本 3.3.0(推荐使用)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> updateFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(MetaObject </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">metaObject</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setFieldValByName</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;updateTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(), metaObject);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p>这么做完之后,我们再来测试下刚才的修改操作。</p><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">UPDATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?, update_time</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">? </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2021</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">01</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">23T16:</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">51</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">413</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(LocalDateTime), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><p>显而易见,执行的 SQL 中多了一个更新时间的修改,而且传的值是当前时间。</p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>你也可以测试一下刚才的插入操作 API看看新增数据时是否会自动填充 创建时间 和 更新时间 数据。</p></div><h2 id="删除操作" tabindex="-1">删除操作 <a class="header-anchor" href="#删除操作" aria-label="Permalink to &quot;删除操作&quot;"></a></h2><p>在 BaseMapper 接口中,删除操作的 API 一共有4个我们本篇主要介绍一下前三个最后一个同样也在下一篇再进行介绍。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">// 其他 API 略</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> BaseMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> Mapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 根据 ID 删除</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> id</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 主键ID</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> deleteById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Serializable </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 删除根据ID 批量删除)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> idList</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 主键ID列表(不能为 null 以及 empty)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> deleteBatchIds</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.COLLECTION) Collection&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">?</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> extends</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Serializable</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">idList</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 根据 columnMap 条件,删除记录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> columnMap</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 表字段 map 对象</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> deleteByMap</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.COLUMN_MAP) Map&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Object</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">columnMap</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 根据 entity 条件,删除记录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;"> queryWrapper</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 影响行数</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> delete</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Constants.WRAPPER) Wrapper&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">&gt; </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">queryWrapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><h3 id="根据id删除" tabindex="-1">根据ID删除 <a class="header-anchor" href="#根据id删除" aria-label="Permalink to &quot;根据ID删除&quot;"></a></h3><p><strong>测试代码:</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusCUDTests</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testDeleteById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 执行删除操作API删除ID为1的用户数据</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">deleteById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1L</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">DELETE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><h3 id="批量id删除" tabindex="-1">批量ID删除 <a class="header-anchor" href="#批量id删除" aria-label="Permalink to &quot;批量ID删除&quot;"></a></h3><p><strong>测试代码:</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusCUDTests</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testDeleteBatchIds</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 删除ID为2、3的用户数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> List</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">&gt; </span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">ids</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Arrays.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">asList</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">deleteBatchIds</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(ids);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">DELETE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">IN</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ( ? , ? )</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">), </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span></span></code></pre></div><h3 id="简单的带条件删除" tabindex="-1">简单的带条件删除 <a class="header-anchor" href="#简单的带条件删除" aria-label="Permalink to &quot;简单的带条件删除&quot;"></a></h3><p><strong>测试代码:</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusDemoApplication</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testDeleteByMap</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 删除姓名为Sandy的用户数据</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // Map集合的键表示的是数据库列名不是实体类属性名</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Map</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Object</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">&gt; </span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">columnMap</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> new</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> HashMap&lt;&gt;();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> columnMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">put</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;Sandy&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">deleteByMap</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(columnMap);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">DELETE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">WHERE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ?</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: Sandy(String)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><h3 id="逻辑删除" tabindex="-1">逻辑删除 <a class="header-anchor" href="#逻辑删除" aria-label="Permalink to &quot;逻辑删除&quot;"></a></h3><p>在项目开发过程中,为了保留用户数据,在删除用户数据时,我们会选择逻辑删除,而非物理删除。</p><ul><li><p><strong>物理删除:</strong> 真实删除,将对应数据从数据库中删除,即采用 <code>delete</code> SQL。</p></li><li><p><strong>逻辑删除:</strong> 假删除,将对应数据中代表是否被删除的列,修改为 &quot;被删除状态值&quot;,即采用 <code>update</code> SQL。</p></li></ul><p>接下来,我们也实现一下逻辑删除功能。</p><p><strong>第1步我们需要给实体类、数据库表先做一些结构调整工作。</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 给用户表添加 is_delete 列</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">ALTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> \`mybatisplus_demodb\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">\`user\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">ADD</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COLUMN </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">\`is_delete\`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&#39;是否被删除&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> AFTER</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> \`update_time\`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">;</span></span></code></pre></div><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Data</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Long</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> name;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> email;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableField</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">fill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> FieldFill.INSERT)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> createTime;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableField</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">fill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> FieldFill.INSERT_UPDATE)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> LocalDateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> updateTime;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 添加对应的实体属性isDelete</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 为 逻辑删除 属性指定插入数据时自动填充,并调整好数据填充处理器</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TableField</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">fill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> FieldFill.INSERT)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> isDelete;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 通过 MP 的自动填充功能实现自动审计</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> AutoAuditHandler</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> MetaObjectHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> insertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(MetaObject </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">metaObject</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">strictInsertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(metaObject, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;createTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.class, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">());</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">strictInsertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(metaObject, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;updateTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.class, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">()); </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 插入数据时,逻辑删除属性自动填充值</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">strictInsertFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(metaObject, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;isDelete&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Integer.class, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> updateFill</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(MetaObject </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">metaObject</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">setFieldValByName</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">&quot;updateTime&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, LocalDateTime.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">now</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(), metaObject);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>第2步在 application.yml 中,全局配置逻辑删除的默认值和删除值。</strong></p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>这一步也可以通过在 逻辑删除 属性上方添加 <code>@TableLogic</code> 注解实现,但还是建议采用全局配置。</p></div><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mybatis-plus</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> global-config</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> db-config</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 逻辑删除属性</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> logic-delete-field</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">isDelete</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 未删除状态值</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> logic-not-delete-value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 删除状态值</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> logic-delete-value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><p>配置完后,我们再去测试一下刚才的 根据ID删除 操作。</p><p><strong>测试代码:</strong></p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SpringBootTest</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> MybatisPlusCUDTests</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> UserMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testDeleteById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 执行删除操作API删除ID为5的用户数据</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> rows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userMapper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">deleteById</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5L</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // int rows = userMapper.deleteById(1L);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Assert.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">assertEquals</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, rows);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">UPDATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> is_delete</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">? </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">AND</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> is_delete</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span></span></code></pre></div><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span>java.lang.AssertionError: expected:&lt;1&gt; but was:&lt;0&gt;</span></span>
<span class="line"><span>Expected :1</span></span>
<span class="line"><span>Actual :0</span></span></code></pre></div><p>这次执行单元测试,竟然报错了!仔细看一下,原来是 <code>断言</code> 提示我们实际结果和预期结果不一致。</p><p>什么原因导致失败呢?其实是因为我们加入逻辑删除列之后,数据库表中虽然多了这列,但是这一列都还没有设置过值呢。</p><p><img src="`+E+'" alt="202101190000500"></p><p>而执行的 SQL 中却需要查找逻辑删除列值为0的数据这肯定找不到啊影响行数自然为 0 了,和我们预期的影响行数 1 不符,于是报错了。</p><p>知道原因后那就先手动给数据表的逻辑删除列都设置为0。</p><p><img src="'+u+`" alt="202101190000600"></p><p>再去执行一次刚才的删除测试。</p><p><strong>控制台输出:</strong></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">UPDATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> is_delete</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">? </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">AND</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> is_delete</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Long)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">&lt;==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Updates: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span></span></code></pre></div><p>这回就不再报错了,而且显而易见,执行的 SQL 由没有做逻辑删除配置前的 <code>DELETE</code> 操作现在变为了 <code>UPDATE</code> 操作。</p><p><img src="`+m+'" alt="202101190000700"></p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>在逻辑删除配置好之后,原来的部分操作,像查询操作,在执行 SQL 时将自动带上 <code>where is_delete = 0</code> 这个条件。</p></div><h2 id="参考文献" tabindex="-1">参考文献 <a class="header-anchor" href="#参考文献" aria-label="Permalink to &quot;参考文献&quot;"></a></h2><p>[1]MyBatis Plus 官网. 指南[EB/OL]. <a href="https://baomidou.com/guide/" target="_blank" rel="noreferrer">https://baomidou.com/guide/</a>. 2021-01-18</p><h2 id="后记" tabindex="-1">后记 <a class="header-anchor" href="#后记" aria-label="Permalink to &quot;后记&quot;"></a></h2><p><strong>C</strong> 学习 MyBatis 的时候,我们就没担心过 CUD现在 MP 中自然更不存在这事儿了。而且 MP 还给我们提供了这么多实用功能。</p><p>下一篇我们将会学到较为复杂的查询操作,但 MP 还是相对简单的,敬请期待吧。</p><div class="info custom-block"><p class="custom-block-title">笔者说</p><p>对于技术的学习,笔者一贯遵循的步骤是:先用最最简单的 demo 让它跑起来,然后学学它的最最常用 API 和 配置让自己能用起来,最后熟练使用的基础上,在空闲时尝试阅读它的源码让自己能够洞彻它的运行机制,部分问题出现的原因,同时借鉴这些技术实现来提升自己的代码高度。</p><p>所以在笔者的文章中,前期基本都是小白文,仅仅穿插很少量的源码研究。当然等小白文更新多了,你们还依然喜欢,后期会不定时专门对部分技术的源码进行解析。</p></div>',117);function T(s,P,M,q,_,U){const p=t,h=e("ClientOnly");return n(),r("div",null,[v,d(h,null,{default:g(()=>{var i,a;return[(((i=s.$frontmatter)==null?void 0:i.aside)??!0)&&(((a=s.$frontmatter)==null?void 0:a.showArticleMetadata)??!0)?(n(),D(p,{key:0,article:s.$frontmatter},null,8,["article"])):C("",!0)]}),_:1}),I])}const O=k(b,[["render",T]]);export{j as __pageData,O as default};