122 lines
62 KiB
JavaScript
122 lines
62 KiB
JavaScript
import{_ as h}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 t,a as A,R as y,b as D,e as o}from"./chunks/framework.FVQzxbLi.js";import"./chunks/md5.RtphNWHi.js";const c="/assets/202101161149179.0-YsVHwP.png",C="/assets/202101161150749.K8fZf9q0.jpg",B="/assets/202101161155018.vCiHcQIF.png",E="/assets/202101161155388.Jh9ydPjm.png",F="/assets/202101161156256.deHsa21G.png",m="/assets/202101161156668.a7df70b3.png",u="/assets/202101161157415.68cL741x.png",b="/assets/202101161158888.rwWhIm4N.png",v="/assets/202101161159106.VRNRy0Jk.png",M="/assets/202101161159147.QDzfcIsk.png",_="/assets/202101161159902.r1q34C1Z.gif",S="/assets/202101161200243.JlpTmN_D.png",j=JSON.parse('{"title":"快速入门","description":"","frontmatter":{"title":"快速入门","author":"查尔斯","date":"2021/01/16 17:58","categories":["MyBatis-Plus快速入门"],"tags":["MyBatis Plus","MyBatis","ORM框架"]},"headers":[],"relativePath":"courses/mybatis/02-MyBatis-Plus基础/01-快速入门.md","filePath":"courses/mybatis/02-MyBatis-Plus基础/01-快速入门.md","lastUpdated":1665050985000}'),f={name:"courses/mybatis/02-MyBatis-Plus基础/01-快速入门.md"},P=t("h1",{id:"快速入门",tabindex:"-1"},[A("快速入门 "),t("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 "前言""></a></h2><p><strong>C:</strong> 在 Java Web 的日常开发中,风靡中日韩的持久层框架 MyBatis ,想必你不会陌生。如果你不认识它,那么本篇目前不适合你,请先学习 <a href="/courses/mybatis/index.html">《MyBatis快速入门》</a> 后再过来。</p><p>MyBatis 框架,作为一款非常优秀的 <strong>半自动的持久层ORM框架</strong> 。它支持自定义 SQL、动态SQL、存储过程以及高级映射, <strong>免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作</strong> 。</p><p>它的确很好,但是你也再看看下方代码。在 MyBatis 中,不同实体的基础数据操作几乎属于套模板一样。尤其是在项目搭建初期,要写一大堆的基础 CRUD。随着开发工作量及工作时间上升,这就又成了天下程序员苦之久矣的事儿。</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:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> UserMapper</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:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> insert</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(User </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">user</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:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> update</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(User </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">user</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:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> deleteById</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;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"id"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) Long </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:#6A737D;--shiki-dark:#768390;"> // 根据ID查询</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> User </span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">selectById</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;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"id"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) Long </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:#6A737D;--shiki-dark:#768390;"> // 根据条件查询总记录数</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer </span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">selectCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Map<</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;">> </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">params</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;"> List<</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">> </span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">selectByMap</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(Map<</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;">> </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">params</span><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>当然,MyBatis 官方在一开始就想到了这事儿,所以提供了一套代码生成器。其他还有一些第三方 IDE 插件也有类似功能,但都到今天这年头了,你看看最近的一篇 MyBatis 代码生成器讲解文章下的评论。</p><p><img src="`+c+'" alt="202101161149179"></p><p>类似的评论在类似的文章中,不知凡几。我们自然是要跟随上技术时代的浪潮,做技术的 "弄潮儿",接下来笔者会开启一个新的系列《MyBatis-Plus快速入门》,来讲解体验下这个人云亦云的 MyBatis Plus。</p><p><img src="'+C+'" alt="202101161150749"></p><h2 id="简介" tabindex="-1">简介 <a class="header-anchor" href="#简介" aria-label="Permalink to "简介""></a></h2><div class="tip custom-block"><p class="custom-block-title">官方释义</p><p><a href="https://baomidou.com/" target="_blank" rel="noreferrer">MyBatis-Plus</a>(简称 MP)是一个 <a href="http://www.mybatis.org/mybatis-3/" target="_blank" rel="noreferrer">MyBatis</a> 的增强工具, <strong>在 MyBatis 的基础上只做增强不做改变</strong> ,为简化开发、提高效率而生。[1]</p></div><p><img src="https://baomidou.com/img/relationship-with-mybatis.png" alt="img"></p><p>顾名思义,MyBatis Plus 是 MyBatis 的 Plus 版本,也就是升级版、增强版的意思。</p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>由于名字较长,后面笔者会较多的叫它的简称:MP,注意是 MP 不是 MMP。</p></div><h2 id="特点" tabindex="-1">特点 <a class="header-anchor" href="#特点" aria-label="Permalink to "特点""></a></h2><p>以 MP 的作者所言:MyBatis Plus 的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。[1]</p><p>看看下方总结的 MyBatis Plus 特点,有没有一些心动。</p><ul><li><strong>无侵入</strong> :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑</li><li><strong>损耗小</strong> :启动即会自动注入基本 CRUD,性能基本无损耗,直接面向对象操作</li><li><strong>强大的 CRUD 操作</strong> :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求</li><li><strong>支持 Lambda 形式调用</strong> :通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错</li><li><strong>支持主键自动生成</strong> :支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题</li><li><strong>支持 ActiveRecord 模式</strong> :支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作</li><li><strong>支持自定义全局通用操作</strong> :支持全局通用方法注入( Write once, use anywhere )</li><li><strong>内置代码生成器</strong> :采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置</li><li><strong>内置分页插件</strong> :基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询</li><li><strong>分页插件支持多种数据库</strong> :支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库</li><li><strong>内置性能分析插件</strong> :可输出 SQL语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询</li><li><strong>内置全局拦截插件</strong> :提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作</li></ul><h2 id="使用步骤" tabindex="-1">使用步骤 <a class="header-anchor" href="#使用步骤" aria-label="Permalink to "使用步骤""></a></h2><p>看官方说的这么好,心动不如行动,赶快跟着笔者来体验一下吧。</p><p>我们将通过一个简单的 Demo 来体验 MP 的强大功能,在此之前,笔者假设你已经:</p><ul><li>拥有 Java 开发环境以及相应 IDE(IDEA)</li><li>熟悉 MySQL 数据库</li><li>熟悉 Maven 工具</li><li>熟悉 Lombok 工具</li><li>熟悉 MyBatis 技术</li><li>熟悉 Spring Boot 技术</li></ul><h3 id="数据库准备" tabindex="-1">数据库准备 <a class="header-anchor" href="#数据库准备" aria-label="Permalink to "数据库准备""></a></h3><p>首先我们需要准备好一个数据库,并添加点测试数据。</p><p>下方是我们的测试数据:</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;">1</td><td style="text-align:center;">Jone</td><td style="text-align:center;">18</td><td style="text-align:center;"><a href="mailto:Jone@126.com" target="_blank" rel="noreferrer">Jone@126.com</a></td></tr><tr><td style="text-align:center;">2</td><td style="text-align:center;">Jack</td><td style="text-align:center;">20</td><td style="text-align:center;"><a href="mailto:Jack@126.com" target="_blank" rel="noreferrer">Jack@126.com</a></td></tr><tr><td style="text-align:center;">3</td><td style="text-align:center;">Tom</td><td style="text-align:center;">28</td><td style="text-align:center;"><a href="mailto:Tom@126.com" target="_blank" rel="noreferrer">Tom@126.com</a></td></tr><tr><td style="text-align:center;">4</td><td style="text-align:center;">Sandy</td><td style="text-align:center;">21</td><td style="text-align:center;"><a href="mailto:Sandy@126.com" target="_blank" rel="noreferrer">Sandy@126.com</a></td></tr><tr><td style="text-align:center;">5</td><td style="text-align:center;">Billie</td><td style="text-align:center;">24</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>其对应的数据库 结构 脚本如下:</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;">-- 创建并切换数据库</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DATABASE</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> mybatisplus_demodb</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">;</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">USE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> mybatisplus_demodb;</span></span>\n<span class="line"></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 创建用户数据表</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> `</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">` (</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `id`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> bigint</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NOT NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> AUTO_INCREMENT COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'主键ID'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `name`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> varchar</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">30</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</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;">'姓名'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `age`</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;">11</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</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;">'年龄'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `email`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> varchar</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">50</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</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;">'邮箱'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> PRIMARY KEY</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">`id`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">USING</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> BTREE</span></span>\n<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) ENGINE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> InnoDB AUTO_INCREMENT </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;"> CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci COMMENT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> '用户表'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ROW_FORMAT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Compact;</span></span></code></pre></div><p>其对应的数据库 数据 脚本如下:</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;">-- 清空用户表数据</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TRUNCATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user;</span></span>\n<span class="line"></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 向用户表插入测试数据</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</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 style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jone'</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:#032F62;--shiki-dark:#96D0FF;">'Jone@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</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:#032F62;--shiki-dark:#96D0FF;">'Jack'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jack@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</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:#032F62;--shiki-dark:#96D0FF;">'Tom'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">28</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Tom@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</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 style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Sandy'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">21</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Sandy@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</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;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Billie'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">24</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Billie@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span></code></pre></div><p>依次执行完结构及数据脚本后,最终数据库效果如下:</p><p><img src="'+B+'" alt="202101161155018"></p><h3 id="创建项目" tabindex="-1">创建项目 <a class="header-anchor" href="#创建项目" aria-label="Permalink to "创建项目""></a></h3><p>在有了 Spring Boot 之后,MyBatis 开发变得非常简单。作为 MyBatis 的升级版,毫无疑问,MP 的开发团队也为 Spring Boot 开发准备了一份 starter,这让我们开发一个 MP 项目变得非常 Easy。</p><p>我们使用 IntelliJ IDEA 中封装的 <a href="https://start.spring.io/" target="_blank" rel="noreferrer">Spring Initializer</a> 来快速初始化一个 Spring Boot 工程。</p><p><img src="'+E+'" alt="202101161155388"></p><p>填写好 Maven 的 GAV 信息。</p><p><img src="'+F+'" alt="202101161156256"></p><p>在项目构建选择依赖这一步的时候,直接选择好 Lombok 和 MySQL 驱动的依赖。</p><p><img src="'+m+'" alt="202101161156668"></p><p>构建好的项目结构如下。</p><p><img src="'+u+'" alt="202101161157415"></p><p>最后,我们需要调整下 Spring Boot 的版本,以及导入好 MP 的 starter 依赖。</p><p><img src="'+b+`" alt="202101161158888"></p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>为了方便使用本案例中的单元测试,建议采用 2.2.x 以上的 Spring Boot。</p></div><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</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:#22863A;--shiki-dark:#8DDB8C;">parent</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>org.springframework.boot</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>spring-boot-starter-parent</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</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;"> Spring Boot已经做好了相应依赖版本的锁定工作。</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 调整一下Spring Boot版本,Lombok和MySQL驱动的版本就会随之变动。</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:#22863A;--shiki-dark:#8DDB8C;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>2.2.11.RELEASE</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">version</span><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:#22863A;--shiki-dark:#8DDB8C;">relativePath</span><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:#22863A;--shiki-dark:#8DDB8C;">parent</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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>com.example</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>mybatis-plus-demo</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>0.0.1-SNAPSHOT</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">version</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:#22863A;--shiki-dark:#8DDB8C;">properties</span><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:#22863A;--shiki-dark:#8DDB8C;">java.version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>1.8</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">java.version</span><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:#22863A;--shiki-dark:#8DDB8C;">properties</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:#22863A;--shiki-dark:#8DDB8C;">dependencies</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- Spring Boot基础依赖 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>org.springframework.boot</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>spring-boot-starter</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- Spring Boot单元测试依赖 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>org.springframework.boot</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>spring-boot-starter-test</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">scope</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>test</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">scope</span><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:#22863A;--shiki-dark:#8DDB8C;">dependency</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;"> <!-- Lombok依赖 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>org.projectlombok</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>lombok</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">optional</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>true</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">optional</span><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:#22863A;--shiki-dark:#8DDB8C;">dependency</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;"> <!-- MySQL数据库驱动 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>mysql</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>mysql-connector-java</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">scope</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>runtime</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">scope</span><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:#22863A;--shiki-dark:#8DDB8C;">dependency</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;"> <!-- MyBatis Plus依赖 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>com.baomidou</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">groupId</span><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:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>mybatis-plus-boot-starter</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">artifactId</span><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:#22863A;--shiki-dark:#8DDB8C;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">>3.4.1</</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">version</span><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:#22863A;--shiki-dark:#8DDB8C;">dependency</span><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:#22863A;--shiki-dark:#8DDB8C;">dependencies</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">笔者说</p><p>引入 <code>MP</code> 依赖之后,就不要再引入 <code>MyBatis</code> 以及 <code>MyBatis-Spring</code> 这些依赖了,因为 MP 都包含好了。你再引入,还可能出现因版本差异导致的其他问题。</p></div><p><img src="`+v+`" alt="202101161159106"></p><h3 id="创建pojo类" tabindex="-1">创建POJO类 <a class="header-anchor" href="#创建pojo类" aria-label="Permalink to "创建POJO类""></a></h3><p>项目创建好后,按原来 MyBatis 的使用步骤,首先要根据数据库编写好 POJO 类。</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:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>此处使用了 Lombok 来简化 getter/setter 等代码,如果不会用,可以直接自己手写 getter/setter 等代码。</p></div><h3 id="创建mapper接口" tabindex="-1">创建Mapper接口 <a class="header-anchor" href="#创建mapper接口" aria-label="Permalink to "创建Mapper接口""></a></h3><p>有了 POJO 类之后,原来的 MyBatis 中,下一步自然就要写 Mapper 接口,写 SQL 映射文件了。但是现在你只需要写好 Mapper 接口,然后继承一个由 MP 所提供的 <code>BaseMapper</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;">// 注:给 BaseMapper 指定好泛型,它里面的 CRUD 需要使用泛型来确定具体操作数据类型</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;"> UserMapper</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> BaseMapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">User</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><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>在 <code>BaseMapper</code> 中封装有大量的基础 CRUD 操作,这一点就直接解决了我们前言中所提到的需求。</p></div><h3 id="添加配置" tabindex="-1">添加配置 <a class="header-anchor" href="#添加配置" aria-label="Permalink to "添加配置""></a></h3><p>写好核心部分代码后,MP 需要像 MyBatis 整合 Spring Boot 一样,在 <code>application.yml</code> 配置文件中添加上数据源配置及一些 MyBatis 自定义配置。</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:#22863A;--shiki-dark:#8DDB8C;">spring</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;"> datasource</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> driver-class-name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">com.mysql.cj.jdbc.Driver</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">jdbc:mysql:///mybatisplus_demodb?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> username</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">root</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> password</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">root</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:#22863A;--shiki-dark:#8DDB8C;"> configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> # 控制台打印SQL日志</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;"> log-impl</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">org.apache.ibatis.logging.stdout.StdOutImpl</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>一般我们还会给 MyBatis 添加些自定义配置:类型别名包扫描,指定 Mapper 映射文件地址等。这回这些配置都被 MP 整合在一起了,有的还拥有了默认值。 例如:原来指定 Mapper 映射文件地址需要用:<code>mybatis.mapper-locations</code> ,现在 MP 中需要用:<code>mybatis-plus.mapper-locations</code>,MP 还给它准备了默认值:<code>classpath*:/mapper/**/*.xml</code>。 这意味着啥?意味着,这种配置以后如果没有额外指定,就不需要我们再配置它啦。</p></div><p><img src="`+M+`" alt="202101161159147"></p><p>最后, MP 同样也需要在 Spring Boot 启动类中,添加 <code>@MapperScan</code> 注解来指定 Mapper 接口扫描包。</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;">SpringBootApplication</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">MapperScan</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"com.example.mapper"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">)</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;"> MybatisPlusDemoApplication</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;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> static</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">[] </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">args</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> SpringApplication.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">run</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(QuickStartApplication.class, args);</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><h3 id="测试" tabindex="-1">测试 <a class="header-anchor" href="#测试" aria-label="Permalink to "测试""></a></h3><p>终于搞定了,我们再去测试类中编写一个测试用例,去测试一下效果就完事儿了。</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;"> MybatisPlusDemoApplicationTests</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>
|
||
<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;"> testSelectList</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;"> List</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;"><</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">User</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">> </span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">userList</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;">selectList</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">null</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;"> userList.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(System.out</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">println);</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><img src="`+_+`" alt="202101161159902"></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;">==></span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Preparing: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> 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;">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">==></span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Parameters: </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Columns: id, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, age, email</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Row</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;">, Jone, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Jone@126.com</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Row</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;">, Jack, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Jack@126.com</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Row</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;">, Tom, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">28</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Tom@126.com</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Row</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;">, Sandy, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">21</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Sandy@126.com</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> Row</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;">, Billie, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">24</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, Billie@126.com</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"><==</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Total: </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</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>User(id=1, name=Jone, age=18, email=Jone@126.com)</span></span>
|
||
<span class="line"><span>User(id=2, name=Jack, age=20, email=Jack@126.com)</span></span>
|
||
<span class="line"><span>User(id=3, name=Tom, age=28, email=Tom@126.com)</span></span>
|
||
<span class="line"><span>User(id=4, name=Sandy, age=21, email=Sandy@126.com)</span></span>
|
||
<span class="line"><span>User(id=5, name=Billie, age=24, email=Billie@126.com)</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>你在编写单元测试时,可能会看到如下报错。别担心这不是什么要紧的事儿,不影响你运行,也不影响你开法拉利。 如果你看不惯它,那就去 UserMapper 接口上加一个 <code>@Repository</code> 或 <code>@Component</code> 注解,这问题就迎刃而解了。</p></div><p><img src="`+S+'" alt="202101161200243"></p><h2 id="参考文献" tabindex="-1">参考文献 <a class="header-anchor" href="#参考文献" aria-label="Permalink to "参考文献""></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-16</p><h2 id="后记" tabindex="-1">后记 <a class="header-anchor" href="#后记" aria-label="Permalink to "后记""></a></h2><p><strong>C:</strong> 好了,MP 的快速入门就到这儿结束了,是不是快的都让你觉得在做梦?通过以上几个简单的步骤,我们就拥有了一个具有通用 CRUD 操作功能的 Mapper 接口,甚至连 XML 文件都不用编写!</p><p>当然,若是它们还不够你用,或是你需要写一些复杂的数据操作,继续按照 MyBatis 原来的玩法去写就可以了,一点不影响。</p><p><code>MyBatis-Plus</code> 的强大远不止如此,想要详细了解 MyBatis-Plus 的强大功能,那就继续查看笔者该系列的下一篇吧!</p><p><strong>另外,提醒一下,本系列的编写思路,就是基于官网而来,甚至有同学看完官网会觉得笔者多余了。但笔者一贯以小白文著称,学起来不吃力,学重点,比官网更细致,是笔者本系列的目的。所以等等再 "恶评" 吧。</strong></p><div class="info custom-block"><p class="custom-block-title">笔者说</p><p>对于技术的学习,笔者一贯遵循的步骤是:先用最最简单的 demo 让它跑起来,然后学学它的最最常用 API 和 配置让自己能用起来,最后熟练使用的基础上,在空闲时尝试阅读它的源码让自己能够洞彻它的运行机制,部分问题出现的原因,同时借鉴这些技术实现来提升自己的代码高度。</p><p>所以在笔者的文章中,前期基本都是小白文,仅仅穿插很少量的源码研究。当然等小白文更新多了,你们还依然喜欢,后期会不定时专门对部分技术的源码进行解析。</p></div>',81);function L(s,T,x,q,U,R){const l=h,p=e("ClientOnly");return n(),r("div",null,[P,d(p,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(l,{key:0,article:s.$frontmatter},null,8,["article"])):o("",!0)]}),_:1}),I])}const w=k(f,[["render",L]]);export{j as __pageData,w as default};
|