UNPKG

@shixinde/vuepress-theme-init

Version:
179 lines (177 loc) 207 kB
<!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="generator" content="VuePress 2.0.0-rc.14" /> <style> :root { --c-bg: #fff; } html.dark { --c-bg: #22272e; } html, body { background-color: var(--c-bg); } </style> <script> const userMode = localStorage.getItem('vuepress-color-scheme') const systemDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches if (userMode === 'dark' || (userMode !== 'light' && systemDarkMode)) { document.documentElement.classList.toggle('dark', true) } </script> <link rel="icon" href="/favicon.ico"><title>1.快速入门 | Guoguo-notes</title><meta name="description" content="袁果锅笔记"> <link rel="preload" href="/guoguo-notes/assets/style-35EaXqtH.css" as="style"><link rel="stylesheet" href="/guoguo-notes/assets/style-35EaXqtH.css"> <link rel="modulepreload" href="/guoguo-notes/assets/app-Dx9bNbfq.js"><link rel="modulepreload" href="/guoguo-notes/assets/MyBatis Plus.html-DXaupZNq.js"> <link rel="prefetch" href="/guoguo-notes/assets/index.html-D6hY1Pr0.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/React.html-DpSypgmq.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/java jdk 管理.html-UyxKEztz.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/lingzhi.html-DrDRjKEH.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/临时使用.html-D81L-GXB.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/新公司.html-Bp4Oxj5H.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/项目架构升级版.html-CpJwv32O.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/风扬小记.html-BTKAsyQB.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Python代码片段.html-3rxV2C-F.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Python笔记.html-DfxyADl3.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/AjaxResult.html-CcB1SHt9.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Java 基础.html-C0Mw79YJ.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Java 注解.html-DMhJ2pfz.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/MySQL完整.html-E-VKR_Bm.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Mybatis 语法.html-BtyLUnj2.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/StringBoot.html-IewOkkS1.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/idea 插件.html-yFlZz-2q.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/idea快捷键.html-CI1PJIaN.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/java 代码片段.html-mGveOiyh.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/mySql.html-mha8lKTS.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/分页插件使用.html-BpMDhHym.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/项目初始化.html-TexbaFDo.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/02_react案例_笔记.html-BzISG9Ro.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/03_react-router_教程.html-CiEuDnOl.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/04_react-UI_教程.html-CptRBAn1.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/05_redux笔记.html-BBtVc0mQ.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/React 笔记.html-BPeqw1PX.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/React 项目配置流程.html-BXl6Ye6r.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/尚硅谷React扩展笔记.html-CCxyveD2.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/尚硅谷react-redux笔记.html-DYzvAaxv.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/index.html-3ZVA3kn7.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Element Plus --vue3.0.html-DXuv_b9N.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Element ui 笔记.html-sVqlVk_V.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Taro.html-CA8JB-of.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Vue 代码片段.html-DKeMa5iO.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Vue 全局封装 main.js.html-D9vo-8hy.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Vue 笔记.html-DGHKF3_K.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Vue3 .html--oEgCjOt.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Vue3_Element Plus.html-BVAoHXff.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/element plus 本地启动.html-CgsgPmvg.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/jsx tsx 代码片段.html-G1ShCdaZ.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/jsx tsx 笔记.html-BtuYzmC-.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/uniapp笔记.html-ok2vMZAr.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/vite 笔记.html-D-EBkJ0C.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/vite手写插件.html-Cggy24Oh.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/vue.js 下载文件.html-B1uCoFDS.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/vueuse笔记.html-DS6eTZ6y.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/vxe-table笔记.html-yUGgZHig.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/代码片段 - 解析数学公式.html-DdcBDyRv.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/常用插件.html-CZkTIVvE.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/汇智腾远笔记.html-moZCMq7M.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/视频播放插件.html-BcEFDEgf.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/CSS笔记.html-fAv9dNNH.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Echarts.html-Cge55fid.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Git 代码管理.html-B63UoB0T.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Html 笔记.html--NntXjWX.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/TypeScript.html-D-Qjaudh.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/axios 请求拦截.html-D1TCv2Mj.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/js常规.html-Ka8coTuF.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/npm.html-B-EmKZd8.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/sh 笔记.html-B3G_4KZW.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/valibot校验学习.html-BBH2-2ZH.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/云开发教程.html-DRtT7hW1.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/公共API接口.html-p1pxjePH.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/小程序笔记.html-BJbLxiMh.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/插件库.html-CZ-6S-Qp.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/服务器.html-BNfIswB8.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/服务器部署教学.html-T1qkai4O.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/浏览器px to rem适配.html-DPzD4TkF.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/登录逻辑.html-D5sdqJbb.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/网站配色.html-B_2Exge9.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/跨域代理.html-BYkKrkY7.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/接入AI.html-DVRrF1MA.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/查看 编辑对话框组件.html-zEZcOjWH.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/简易电影选座.html-TuQVklis.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/index.html-1f6p3-c_.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/CSS--common.html-D0ck7nMZ.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/ES6.html-wEFap9Uq.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Git提交.html-CHssaRZs.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Js获取当前时间的方法.html-BRnoMyWs.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Uni-App笔记.html-BUy_Af_M.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Uni-app API.html-CAzH1d66.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Uniapp-插件.html-DB8eOvmu.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/VueX 笔记.html-BrvLUsYq.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/js函数封装.html-Cc5d9Th4.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/js常规.html-CIq-xlv8.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/uView基本使用.html-CCsyyvNN.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/uniapp 引入组件库.html-BnVxGutO.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/常用正则表达式.html-AS2O_lcX.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/界面类.html-BEOhA9U_.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/笔记.html-DcjAVSiK.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/组件封装.html-BF9gShal.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/编程逻辑整理.html-CZRD3wTo.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/调用接口.html-DniVQnty.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/SSH 配置.html-9u6Q-DHg.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/Editor.html-CfSL24h8.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/分页组件.html-DcRa4Q6p.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/拖拽组件.html-D6yjy7lX.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/index.html-LinbGCk2.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/GIt 代码提交规范及步骤.html-w7f6_4N9.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/命名_ 开发期间的命名规范.html-DhnWSrsL.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/大佬项目组织规范.html-B32Km5um.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/重要_框架 - 初始化项目约束.html-Sw9ULLk3.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/404.html-BZdzN0T2.js" as="script"><link rel="prefetch" href="/guoguo-notes/assets/SearchResult-DqPIHYal.js" as="script"> </head> <body> <div id="app"><!--[--><div class="vp-theme-container external-link-icon"><!--[--><header class="vp-navbar"><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/guoguo-notes/"><!----><span class="vp-site-name" aria-hidden="true">Guoguo-notes</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/" aria-label="主页"><!---->主页<!----></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/%E5%B8%B8%E7%94%A8%E7%AC%94%E8%AE%B0/%E7%BD%91%E7%AB%99%E9%85%8D%E8%89%B2.html" aria-label="常用笔记"><!---->常用笔记<!----></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/vue%E7%AC%94%E8%AE%B0%E5%8F%8A%E5%91%A8%E8%BE%B9%E7%94%9F%E6%80%81/Vue%20%E7%AC%94%E8%AE%B0.html" aria-label="vue笔记及周边生态"><!---->vue笔记及周边生态<!----></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="袁果锅生态"><span class="title">袁果锅生态</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="袁果锅生态"><span class="title">袁果锅生态</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E8%A2%81%E6%9E%9C%E9%94%85%E7%94%9F%E6%80%81/%E5%9B%A2%E9%98%9F%E5%8D%8F%E4%BD%9C%E5%8F%8A%E8%A7%84%E8%8C%83/%E5%91%BD%E5%90%8D_%20%E5%BC%80%E5%8F%91%E6%9C%9F%E9%97%B4%E7%9A%84%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83.html" aria-label="团队协作及规范"><!---->团队协作及规范<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E8%A2%81%E6%9E%9C%E9%94%85%E7%94%9F%E6%80%81/%E9%A1%B9%E7%9B%AE%E6%A1%86%E6%9E%B6%E5%8F%8A%E6%9E%B6%E6%9E%84/%E9%87%8D%E8%A6%81_%E6%A1%86%E6%9E%B6%20-%20%E5%88%9D%E5%A7%8B%E5%8C%96%E9%A1%B9%E7%9B%AE%E7%BA%A6%E6%9D%9F.html" aria-label="项目框架及架构"><!---->项目框架及架构<!----></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E9%A3%9E%E7%A0%81%E7%AF%87/Uni-App%E7%AC%94%E8%AE%B0.html" aria-label="飞码篇"><!---->飞码篇<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/Java/Java%20%E5%9F%BA%E7%A1%80.html" aria-label="Java"><!---->Java<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/React%E7%AC%94%E8%AE%B0/React%20%E7%AC%94%E8%AE%B0.html" aria-label="React笔记"><!---->React笔记<!----></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/shixindea/shixinde-notes" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!---->GitHub<!----></a></div><!--]--></nav><!--[--><!--]--><button class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!--[--><button type="button" class="search-pro-button" aria-label="搜索"><svg xmlns="http://www.w3.org/2000/svg" class="icon search-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="search icon" name="search"><path d="M192 480a256 256 0 1 1 512 0 256 256 0 0 1-512 0m631.776 362.496-143.2-143.168A318.464 318.464 0 0 0 768 480c0-176.736-143.264-320-320-320S128 303.264 128 480s143.264 320 320 320a318.016 318.016 0 0 0 184.16-58.592l146.336 146.368c12.512 12.48 32.768 12.48 45.28 0 12.48-12.512 12.48-32.768 0-45.28"></path></svg><div class="search-pro-placeholder">搜索</div><div class="search-pro-key-hints"><kbd class="search-pro-key">Ctrl</kbd><kbd class="search-pro-key">K</kbd></div></button><!--]--></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar"><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/" aria-label="主页"><!---->主页<!----></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/%E5%B8%B8%E7%94%A8%E7%AC%94%E8%AE%B0/%E7%BD%91%E7%AB%99%E9%85%8D%E8%89%B2.html" aria-label="常用笔记"><!---->常用笔记<!----></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/guoguo-notes/vue%E7%AC%94%E8%AE%B0%E5%8F%8A%E5%91%A8%E8%BE%B9%E7%94%9F%E6%80%81/Vue%20%E7%AC%94%E8%AE%B0.html" aria-label="vue笔记及周边生态"><!---->vue笔记及周边生态<!----></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="袁果锅生态"><span class="title">袁果锅生态</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="袁果锅生态"><span class="title">袁果锅生态</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E8%A2%81%E6%9E%9C%E9%94%85%E7%94%9F%E6%80%81/%E5%9B%A2%E9%98%9F%E5%8D%8F%E4%BD%9C%E5%8F%8A%E8%A7%84%E8%8C%83/%E5%91%BD%E5%90%8D_%20%E5%BC%80%E5%8F%91%E6%9C%9F%E9%97%B4%E7%9A%84%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83.html" aria-label="团队协作及规范"><!---->团队协作及规范<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E8%A2%81%E6%9E%9C%E9%94%85%E7%94%9F%E6%80%81/%E9%A1%B9%E7%9B%AE%E6%A1%86%E6%9E%B6%E5%8F%8A%E6%9E%B6%E6%9E%84/%E9%87%8D%E8%A6%81_%E6%A1%86%E6%9E%B6%20-%20%E5%88%9D%E5%A7%8B%E5%8C%96%E9%A1%B9%E7%9B%AE%E7%BA%A6%E6%9D%9F.html" aria-label="项目框架及架构"><!---->项目框架及架构<!----></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/%E9%A3%9E%E7%A0%81%E7%AF%87/Uni-App%E7%AC%94%E8%AE%B0.html" aria-label="飞码篇"><!---->飞码篇<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/Java/Java%20%E5%9F%BA%E7%A1%80.html" aria-label="Java"><!---->Java<!----></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/guoguo-notes/React%E7%AC%94%E8%AE%B0/React%20%E7%AC%94%E8%AE%B0.html" aria-label="React笔记"><!---->React笔记<!----></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/shixindea/shixinde-notes" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!---->GitHub<!----></a></div><!--]--></nav><!--[--><!--]--><ul class="vp-sidebar-items"><!--[--><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading active">Java <!----></p><ul style="" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/AjaxResult.html" aria-label="1. AjaxResult.md"><!---->1. AjaxResult.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/Java%20%E5%9F%BA%E7%A1%80.html" aria-label="2. Java 基础.md"><!---->2. Java 基础.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/Java%20%E6%B3%A8%E8%A7%A3.html" aria-label="3. Java 注解.md"><!---->3. Java 注解.md<!----></a><!----></li><li><a class="route-link route-link-active auto-link vp-sidebar-item active" href="/guoguo-notes/Java/MyBatis%20Plus.html" aria-label="4. MyBatis Plus.md"><!---->4. MyBatis Plus.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/MySQL%E5%AE%8C%E6%95%B4.html" aria-label="5. MySQL完整.md"><!---->5. MySQL完整.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/Mybatis%20%E8%AF%AD%E6%B3%95.html" aria-label="6. Mybatis 语法.md"><!---->6. Mybatis 语法.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/StringBoot.html" aria-label="7. StringBoot.md"><!---->7. StringBoot.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/idea%20%E6%8F%92%E4%BB%B6.html" aria-label="8. idea 插件.md"><!---->8. idea 插件.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/idea%E5%BF%AB%E6%8D%B7%E9%94%AE.html" aria-label="9. idea快捷键.md"><!---->9. idea快捷键.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/java%20%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B5.html" aria-label="10. java 代码片段.md"><!---->10. java 代码片段.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/mySql.html" aria-label="11. mySql.md"><!---->11. mySql.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/%E5%88%86%E9%A1%B5%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8.html" aria-label="12. 分页插件使用.md"><!---->12. 分页插件使用.md<!----></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/guoguo-notes/Java/%E9%A1%B9%E7%9B%AE%E5%88%9D%E5%A7%8B%E5%8C%96.html" aria-label="13. 项目初始化.md"><!---->13. 项目初始化.md<!----></a><!----></li><!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div class="theme-default-content"><!--[--><!--]--><div><p>大家学习中如果碰到困难,可以加入**<a href="https://b11et3un53m.feishu.cn/wiki/M9LKwYAlHiZoyhkB5iKcgOh1nmc" target="_blank" rel="noopener noreferrer">黑马智学伴侣</a>**寻求帮助,有学习交流群,老师、同学在线答疑。还有独享的企业级项目,避免与人撞车。</p><p>本篇学习文档对应B站视频:</p><p>暂时无法在飞书文档外展示此内容</p><p>大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。</p><p>因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus.</p><p>官方网站如下:</p><p>暂时无法在飞书文档外展示此内容</p><p>当然,MybatisPlus不仅仅可以简化单表操作,而且还对Mybatis的功能有很多的增强。可以让我们的开发更加的简单,高效。</p><p>通过今天的学习,我们要达成下面的目标:</p><ul><li>能利用MybatisPlus实现基本的CRUD</li><li>会使用条件构建造器构建查询和更新语句</li><li>会使用MybatisPlus中的常用注解</li><li>会使用MybatisPlus处理枚举、JSON类型字段</li><li>会使用MybatisPlus实现分页</li></ul><h1 id="_1-快速入门" tabindex="-1"><a class="header-anchor" href="#_1-快速入门"><span><strong>1.快速入门</strong></span></a></h1><p>为了方便测试,我们先创建一个新的项目,并准备一些基础数据。</p><h2 id="_1-1-环境准备" tabindex="-1"><a class="header-anchor" href="#_1-1-环境准备"><span><strong>1.1.环境准备</strong></span></a></h2><p>复制课前资料提供好的一个项目到你的工作空间(不要包含空格和特殊字符):</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=ZmQxZDMyNTEyYWMxOTZlODY2MmEwMDExYjRhZDY1MGNfVVFnY1VDS2oxWHliUTUzWHV1MFV1R3VhRXBjeTMzVUhfVG9rZW46TmU0M2JNbkFVbzZIekl4Z1RrYmNEYmFsblJiXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>然后用你的IDEA工具打开,项目结构如下:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=MWQ3Y2U3ZTJmMTU3YTAwMzA0ODgyNTFjYjdlNTY0MjJfU3VHVEppQWFOZVVXdzhEYXZrUFp2bGgxUVRicklrQ2dfVG9rZW46WjhOSmJOMUp5bzFqeEt4R2xvTmN3R1JHbk5mXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>注意配置一下项目的JDK版本为JDK11。首先点击项目结构设置:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=OGZhNjM2M2U4Zjk2NTc5ODk5YjhlZWJjZDQ3MDRkYzVfN0tvVkliVUE2Wk9Va0xDWUhSQ0ZPNHNSbGhGQXZPcHBfVG9rZW46TXV2ZmJKQlJwb1pCbHl4Zkt3eGNLdDRrbkpoXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>在弹窗中配置JDK:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=ZjU4NzE5NTI0ZmY4NjlhNzI5MzFhOWI4OTVlZmJjOTRfV0FpR2lMVXdualZ3OGEybGxraXRBRjRSbTVlTDRYcVRfVG9rZW46TEVRbWJ0UVR4b0s0eld4SDRyRWNFd1dIbnFoXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>接下来,要导入两张表,在课前资料中已经提供了SQL文件:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=ZTUzOTBhMjkxYzc2YzUzODRlODIzZWIzNGRkYTNmY2VfZ0N6Y0J3Sk1VWUFhT2FabjRKTmpyajJCelA5Zk9nZWJfVG9rZW46WTNvN2JQZ0c4b0ZNQmt4MlVuVmNlZm9lblNkXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>对应的数据库表结构如下:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=OGRjOTZhZTVjZTRmYzc1YWRhOGQzNzUzNjJlYTM3N2FfTkdtNDF0TDROTFBsSjVTZkhWVFJRNVJUa2Zhck0yTVdfVG9rZW46Qm5uU2JHQm12b0s0eTB4SENyYWM0alFjbnpkXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>最后,在<code>application.yaml</code>中修改jdbc参数为你自己的数据库参数:</p><div class="language-YAML line-numbers-mode" data-highlighter="prismjs" data-ext="YAML" data-title="YAML"><pre class="language-YAML"><code><span class="line">spring:</span> <span class="line"> datasource:</span> <span class="line"> url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;serverTimezone=Asia/Shanghai</span> <span class="line"> driver-class-name: com.mysql.cj.jdbc.Driver</span> <span class="line"> username: root</span> <span class="line"> password: MySQL123</span> <span class="line">logging:</span> <span class="line"> level:</span> <span class="line"> com.itheima: debug</span> <span class="line"> pattern:</span> <span class="line"> dateformat: HH:mm:ss</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="_1-2-快速开始" tabindex="-1"><a class="header-anchor" href="#_1-2-快速开始"><span><strong>1.2.快速开始</strong></span></a></h2><p>比如我们要实现User表的CRUD,只需要下面几步:</p><ul><li>引入MybatisPlus依赖</li><li>定义Mapper</li></ul><h3 id="_1-2-1引入依赖" tabindex="-1"><a class="header-anchor" href="#_1-2-1引入依赖"><span><strong>1.2.1引入依赖</strong></span></a></h3><p>MybatisPlus提供了starter,实现了自动Mybatis以及MybatisPlus的自动装配功能,坐标如下:</p><div class="language-XML line-numbers-mode" data-highlighter="prismjs" data-ext="XML" data-title="XML"><pre class="language-XML"><code><span class="line">&lt;dependency&gt;</span> <span class="line"> &lt;groupId&gt;com.baomidou&lt;/groupId&gt;</span> <span class="line"> &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt;</span> <span class="line"> &lt;version&gt;3.5.3.1&lt;/version&gt;</span> <span class="line">&lt;/dependency&gt;</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>由于这个starter包含对mybatis的自动装配,因此完全可以替换掉Mybatis的starter。 最终,项目的依赖如下:</p><div class="language-XML line-numbers-mode" data-highlighter="prismjs" data-ext="XML" data-title="XML"><pre class="language-XML"><code><span class="line">&lt;dependencies&gt;</span> <span class="line"> &lt;dependency&gt;</span> <span class="line"> &lt;groupId&gt;com.baomidou&lt;/groupId&gt;</span> <span class="line"> &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt;</span> <span class="line"> &lt;version&gt;3.5.3.1&lt;/version&gt;</span> <span class="line"> &lt;/dependency&gt;</span> <span class="line"> &lt;dependency&gt;</span> <span class="line"> &lt;groupId&gt;com.mysql&lt;/groupId&gt;</span> <span class="line"> &lt;artifactId&gt;mysql-connector-j&lt;/artifactId&gt;</span> <span class="line"> &lt;scope&gt;runtime&lt;/scope&gt;</span> <span class="line"> &lt;/dependency&gt;</span> <span class="line"> &lt;dependency&gt;</span> <span class="line"> &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;</span> <span class="line"> &lt;artifactId&gt;lombok&lt;/artifactId&gt;</span> <span class="line"> &lt;optional&gt;true&lt;/optional&gt;</span> <span class="line"> &lt;/dependency&gt;</span> <span class="line"> &lt;dependency&gt;</span> <span class="line"> &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span> <span class="line"> &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;</span> <span class="line"> &lt;scope&gt;test&lt;/scope&gt;</span> <span class="line"> &lt;/dependency&gt;</span> <span class="line">&lt;/dependencies&gt;</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_1-2-2-定义mapper" tabindex="-1"><a class="header-anchor" href="#_1-2-2-定义mapper"><span><strong>1.2.2.定义Mapper</strong></span></a></h3><p>为了简化单表CRUD,MybatisPlus提供了一个基础的<code>BaseMapper</code>接口,其中已经实现了单表的CRUD:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=MTA4ODM5ODJjNDk0YTQzODhjMGM2ZDg0Mjc1ZDQ1MTlfMFkzdVN2dUdNVTFXUWFOQktwcTJrUEVlejhkOFEwakRfVG9rZW46S0ZZdmJYdzdmb1BmM0x4dzVDamNkbTdvbnRiXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>因此我们自定义的Mapper只要实现了这个<code>BaseMapper</code>,就无需自己实现单表CRUD了。 修改mp-demo中的<code>com.itheima.mp.mapper</code>包下的<code>UserMapper</code>接口,让其继承<code>BaseMapper</code>:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=M2FjYjBiOTNhMzczODBiMDhmOWM1YWI2MzlmNDYwYjNfRnN5RWxmb1NVVTVBc0ZMREVvZjh4UmpJTUxTT1ZaSXFfVG9rZW46QzJDNGJOQ29yb25tMVB4aUQwS2NGNjdNbmxjXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>代码如下:</p><div class="language-Java line-numbers-mode" data-highlighter="prismjs" data-ext="Java" data-title="Java"><pre class="language-Java"><code><span class="line">package com.itheima.mp.mapper;</span> <span class="line"></span> <span class="line">import com.baomidou.mybatisplus.core.mapper.BaseMapper;</span> <span class="line">import com.itheima.mp.domain.po.User;</span> <span class="line"></span> <span class="line">public interface UserMapper extends BaseMapper&lt;User&gt; {</span> <span class="line">}</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_1-2-3-测试" tabindex="-1"><a class="header-anchor" href="#_1-2-3-测试"><span><strong>1.2.3.测试</strong></span></a></h3><p>新建一个测试类,编写几个单元测试,测试基本的CRUD功能:</p><div class="language-Java line-numbers-mode" data-highlighter="prismjs" data-ext="Java" data-title="Java"><pre class="language-Java"><code><span class="line">package com.itheima.mp.mapper;</span> <span class="line"></span> <span class="line">import com.itheima.mp.domain.po.User;</span> <span class="line">import org.junit.jupiter.api.Test;</span> <span class="line">import org.springframework.beans.factory.annotation.Autowired;</span> <span class="line">import org.springframework.boot.test.context.SpringBootTest;</span> <span class="line"></span> <span class="line">import java.time.LocalDateTime;</span> <span class="line">import java.util.List;</span> <span class="line"></span> <span class="line">@SpringBootTest</span> <span class="line">class UserMapperTest {</span> <span class="line"></span> <span class="line"> @Autowired</span> <span class="line"> private UserMapper userMapper;</span> <span class="line"></span> <span class="line"> @Test</span> <span class="line"> void testInsert() {</span> <span class="line"> User user = new User();</span> <span class="line"> user.setId(5L);</span> <span class="line"> user.setUsername(&quot;Lucy&quot;);</span> <span class="line"> user.setPassword(&quot;123&quot;);</span> <span class="line"> user.setPhone(&quot;18688990011&quot;);</span> <span class="line"> user.setBalance(200);</span> <span class="line"> user.setInfo(&quot;{\&quot;age\&quot;: 24, \&quot;intro\&quot;: \&quot;英文老师\&quot;, \&quot;gender\&quot;: \&quot;female\&quot;}&quot;);</span> <span class="line"> user.setCreateTime(LocalDateTime.now());</span> <span class="line"> user.setUpdateTime(LocalDateTime.now());</span> <span class="line"> userMapper.insert(user);</span> <span class="line"> }</span> <span class="line"></span> <span class="line"> @Test</span> <span class="line"> void testSelectById() {</span> <span class="line"> User user = userMapper.selectById(5L);</span> <span class="line"> System.out.println(&quot;user = &quot; + user);</span> <span class="line"> }</span> <span class="line"></span> <span class="line"> @Test</span> <span class="line"> void testSelectByIds() {</span> <span class="line"> List&lt;User&gt; users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L, 5L));</span> <span class="line"> users.forEach(System.out::println);</span> <span class="line"> }</span> <span class="line"></span> <span class="line"> @Test</span> <span class="line"> void testUpdateById() {</span> <span class="line"> User user = new User();</span> <span class="line"> user.setId(5L);</span> <span class="line"> user.setBalance(20000);</span> <span class="line"> userMapper.updateById(user);</span> <span class="line"> }</span> <span class="line"></span> <span class="line"> @Test</span> <span class="line"> void testDelete() {</span> <span class="line"> userMapper.deleteById(5L);</span> <span class="line"> }</span> <span class="line">}</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以看到,在运行过程中打印出的SQL日志,非常标准:</p><div class="language-SQL line-numbers-mode" data-highlighter="prismjs" data-ext="SQL" data-title="SQL"><pre class="language-SQL"><code><span class="line">11:05:01 INFO 15524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...</span> <span class="line">11:05:02 INFO 15524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.</span> <span class="line">11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : ==&gt; Preparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM user WHERE id=?</span> <span class="line">11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : ==&gt; Parameters: 5(Long)</span> <span class="line">11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : &lt;== Total: 1</span> <span class="line">user = User(id=5, username=Lucy, password=123, phone=18688990011, info={&quot;age&quot;: 21}, status=1, balance=20000, createTime=Fri Jun 30 11:02:30 CST 2023, updateTime=Fri Jun 30 11:02:30 CST 2023)</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>只需要继承BaseMapper就能省去所有的单表CRUD,是不是非常简单!</p><h2 id="_1-3-常见注解" tabindex="-1"><a class="header-anchor" href="#_1-3-常见注解"><span>**1.3.**<strong>常见注解</strong></span></a></h2><p>在刚刚的入门案例中,我们仅仅引入了依赖,继承了BaseMapper就能使用MybatisPlus,非常简单。但是问题来了: MybatisPlus如何知道我们要查询的是哪张表?表中有哪些字段呢?</p><p>大家回忆一下,UserMapper在继承BaseMapper的时候指定了一个泛型:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=ZmJmODU1ZDY4MzhiMzc0ZTk4YWI0MGY2ODQ0MDhiM2VfTEtMbnJjNUUzSFhXeTB1YmgycHNsQ3BnODROczZIUXZfVG9rZW46U1N6b2JzS1cxbzUySnh4WlRaamMyZU45bmhlXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>泛型中的User就是与数据库对应的PO.</p><p>MybatisPlus就是根据PO实体的信息来推断出表的信息,从而生成SQL的。默认情况下:</p><ul><li>MybatisPlus会把PO实体的类名驼峰转下划线作为表名</li><li>MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型</li><li>MybatisPlus会把名为id的字段作为主键</li></ul><p>但很多情况下,默认的实现与实际场景不符,因此MybatisPlus提供了一些注解便于我们声明表信息。</p><h3 id="_1-3-1-tablename" tabindex="-1"><a class="header-anchor" href="#_1-3-1-tablename"><span>**1.3.1.@**<strong>TableName</strong></span></a></h3><p>说明:</p><ul><li>描述:表名注解,标识实体类对应的表</li><li>使用位置:实体类</li></ul><p>示例:</p><div class="language-Java line-numbers-mode" data-highlighter="prismjs" data-ext="Java" data-title="Java"><pre class="language-Java"><code><span class="line">@TableName(&quot;user&quot;)</span> <span class="line">public class User {</span> <span class="line"> private Long id;</span> <span class="line"> private String name;</span> <span class="line">}</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>TableName注解除了指定表名以外,还可以指定很多其它属性:</p><table><thead><tr><th><strong>属性</strong></th><th><strong>类型</strong></th><th><strong>必须指定</strong></th><th><strong>默认值</strong></th><th><strong>描述</strong></th></tr></thead><tbody><tr><td>value</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>表名</td></tr><tr><td>schema</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>schema</td></tr><tr><td>keepGlobalPrefix</td><td>boolean</td><td>否</td><td>false</td><td>是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)</td></tr><tr><td>resultMap</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定)</td></tr><tr><td>autoResultMap</td><td>boolean</td><td>否</td><td>false</td><td>是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)</td></tr><tr><td>excludeProperty</td><td>String[]</td><td>否</td><td>{}</td><td>需要排除的属性名 @since 3.3.1</td></tr></tbody></table><h3 id="_1-3-2-tableid" tabindex="-1"><a class="header-anchor" href="#_1-3-2-tableid"><span><strong>1.3.2.@TableId</strong></span></a></h3><p>说明:</p><ul><li>描述:主键注解,标识实体类中的主键字段</li><li>使用位置:实体类的主键字段</li></ul><p>示例:</p><div class="language-Java line-numbers-mode" data-highlighter="prismjs" data-ext="Java" data-title="Java"><pre class="language-Java"><code><span class="line">@TableName(&quot;user&quot;)</span> <span class="line">public class User {</span> <span class="line"> @TableId</span> <span class="line"> private Long id;</span> <span class="line"> private String name;</span> <span class="line">}</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>TableId</code>注解支持两个属性:</p><table><thead><tr><th style="text-align:left;"><strong>属性</strong></th><th style="text-align:left;"><strong>类型</strong></th><th style="text-align:left;"><strong>必须指定</strong></th><th style="text-align:left;"><strong>默认值</strong></th><th style="text-align:left;"><strong>描述</strong></th></tr></thead><tbody><tr><td style="text-align:left;">value</td><td style="text-align:left;">String</td><td style="text-align:left;">否</td><td style="text-align:left;">&quot;&quot;</td><td style="text-align:left;">表名</td></tr><tr><td style="text-align:left;">type</td><td style="text-align:left;">Enum</td><td style="text-align:left;">否</td><td style="text-align:left;">IdType.NONE</td><td style="text-align:left;">指定主键类型</td></tr></tbody></table><p><code>IdType</code>支持的类型有:</p><table><thead><tr><th style="text-align:left;"><strong>值</strong></th><th style="text-align:left;"><strong>描述</strong></th></tr></thead><tbody><tr><td style="text-align:left;">AUTO</td><td style="text-align:left;">数据库 ID 自增</td></tr><tr><td style="text-align:left;">NONE</td><td style="text-align:left;">无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)</td></tr><tr><td style="text-align:left;">INPUT</td><td style="text-align:left;">insert 前自行 set 主键值</td></tr><tr><td style="text-align:left;">ASSIGN_ID</td><td style="text-align:left;">分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)</td></tr><tr><td style="text-align:left;">ASSIGN_UUID</td><td style="text-align:left;">分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)</td></tr><tr><td style="text-align:left;">ID_WORKER</td><td style="text-align:left;">分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)</td></tr><tr><td style="text-align:left;">UUID</td><td style="text-align:left;">32 位 UUID 字符串(please use ASSIGN_UUID)</td></tr><tr><td style="text-align:left;">ID_WORKER_STR</td><td style="text-align:left;">分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)</td></tr></tbody></table><p>这里比较常见的有三种:</p><ul><li><code>AUTO</code>:利用数据库的id自增长</li><li><code>INPUT</code>:手动生成id</li><li><code>ASSIGN_ID</code>:雪花算法生成<code>Long</code>类型的全局唯一id,这是默认的ID策略</li></ul><h3 id="_1-3-3-tablefield" tabindex="-1"><a class="header-anchor" href="#_1-3-3-tablefield"><span><strong>1.3.3.@TableField</strong></span></a></h3><p>说明:</p><blockquote><p>描述:普通字段注解</p></blockquote><p>示例:</p><div class="language-Java line-numbers-mode" data-highlighter="prismjs" data-ext="Java" data-title="Java"><pre class="language-Java"><code><span class="line">@TableName(&quot;user&quot;)</span> <span class="line">public class User {</span> <span class="line"> @TableId</span> <span class="line"> private Long id;</span> <span class="line"> private String name;</span> <span class="line"> private Integer age;</span> <span class="line"> @TableField(is_married&quot;)</span> <span class="line"> private Boolean isMarried;</span> <span class="line"> @TableField(&quot;`concat`&quot;)</span> <span class="line"> private String concat;</span> <span class="line">}</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一般情况下我们并不需要给字段添加<code>@TableField</code>注解,一些特殊情况除外:</p><ul><li>成员变量名与数据库字段名不一致</li><li>成员变量是以<code>isXXX</code>命名,按照<code>JavaBean</code>的规范,<code>MybatisPlus</code>识别字段时会把<code>is</code>去除,这就导致与数据库不符。</li><li>成员变量名与数据库一致,但是与数据库的关键字冲突。使用<code>@TableField</code>注解给字段名添加转义字符:````</li></ul><p>支持的其它属性如下:</p><table><thead><tr><th><strong>属性</strong></th><th><strong>类型</strong></th><th><strong>必填</strong></th><th><strong>默认值</strong></th><th><strong>描述</strong></th></tr></thead><tbody><tr><td>value</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>数据库字段名</td></tr><tr><td>exist</td><td>boolean</td><td>否</td><td>true</td><td>是否为数据库表字段</td></tr><tr><td>condition</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},<a href="https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/SqlCondition.java" target="_blank" rel="noopener noreferrer">参考(opens new window)</a></td></tr><tr><td>update</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>字段 update set 部分注入,例如:当在version字段上注解update=&quot;%s+1&quot; 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)</td></tr><tr><td>insertStrategy</td><td>Enum</td><td>否</td><td>FieldStrategy.DEFAULT</td><td>举例:NOT_NULL insert into table_a(<!---->) values (<!---->)</td></tr><tr><td>updateStrategy</td><td>Enum</td><td>否</td><td>FieldStrategy.DEFAULT</td><td>举例:IGNORED update table_a set column=#{columnProperty}</td></tr><tr><td>whereStrategy</td><td>Enum</td><td>否</td><td>FieldStrategy.DEFAULT</td><td>举例:NOT_EMPTY where <!----></td></tr><tr><td>fill</td><td>Enum</td><td>否</td><td>FieldFill.DEFAULT</td><td>字段自动填充策略</td></tr><tr><td>select</td><td>boolean</td><td>否</td><td>true</td><td>是否进行 select 查询</td></tr><tr><td>keepGlobalFormat</td><td>boolean</td><td>否</td><td>false</td><td>是否保持使用全局的 format 进行处理</td></tr><tr><td>jdbcType</td><td>JdbcType</td><td>否</td><td>JdbcType.UNDEFINED</td><td>JDBC 类型 (该默认值不代表会按照该值生效)</td></tr><tr><td>typeHandler</td><td>TypeHander</td><td>否</td><td></td><td>类型处理器 (该默认值不代表会按照该值生效)</td></tr><tr><td>numericScale</td><td>String</td><td>否</td><td>&quot;&quot;</td><td>指定小数点后保留的位数</td></tr></tbody></table><h2 id="_1-4-常见配置" tabindex="-1"><a class="header-anchor" href="#_1-4-常见配置"><span><strong>1.4.常见配置</strong></span></a></h2><p>MybatisPlus也支持基于yaml文件的自定义配置,详见官方文档:</p><p>https://baomidou.com/reference/</p><p>大多数的配置都有默认值,因此我们都无需配置。但还有一些是没有默认值的,例如:</p><ul><li>实体类的别名扫描包</li><li>全局id类型</li></ul><div class="language-YAML line-numbers-mode" data-highlighter="prismjs" data-ext="YAML" data-title="YAML"><pre class="language-YAML"><code><span class="line">mybatis-plus:</span> <span class="line"> type-aliases-package: com.itheima.mp.domain.po</span> <span class="line"> global-config:</span> <span class="line"> db-config:</span> <span class="line"> id-type: auto # 全局id类型为自增长</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>需要注意的是,MyBatisPlus也支持手写SQL的,而mapper文件的读取地址可以自己配置:</p><div class="language-YAML line-numbers-mode" data-highlighter="prismjs" data-ext="YAML" data-title="YAML"><pre class="language-YAML"><code><span class="line">mybatis-plus:</span> <span class="line"> mapper-locations: &quot;classpath*:/mapper/**/*.xml&quot; # Mapper.xml文件地址,当前这个是默认值。</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>可以看到默认值是<code>classpath*:/mapper/**/*.xml</code>,也就是说我们只要把mapper.xml文件放置这个目录下就一定会被加载。</p><p>例如,我们新建一个<code>UserMapper.xml</code>文件:</p><p><img src="https://b11et3un53m.feishu.cn/space/api/box/stream/download/asynccode/?code=NDFhZTZlMzdlZjQ3NjE3OGFjNGEwMWM0MzhkMmNkOWVfbDZNVVZSYXdNM3FsWjl4Sjd0M2kyaUU0c1ZOUVhvT3hfVG9rZW46RnhoNGJBQVZLb3Rpcmd4a24xNWNVMUhXbkRoXzE3NDg3OTM4MzU6MTc0ODc5NzQzNV9WNA" alt="img"></p><p>然后在其中定义一个方法:</p><div class="language-XML line-numbers-mode" data-highlighter="prismjs" data-ext="XML" data-title="XML"><pre class="language-XML"><code><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span> <span class="line">&lt;!DOCTYPE mapper PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;</span> <span class="line">&lt;mapper namespace=&quot;com.itheima.mp.mapper.UserMapper&quot;&gt;</span> <span class="line"></span> <span class="line"> &lt;select id=&quot;queryById&quot; resultType=&quot;User&quot;&gt;</span> <span class="line"> SELECT * FROM user WHERE id = #{id}</span> <span class="line"> &lt;/select&gt;</span> <span class="line">&lt;/mapper&gt;</span> <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0