<?xml version="1.0" encoding="utf-8"?>
<ul>
  <li>数学公式渲染这是一段行内公式测试：若物体质量为$m$、光速为$c$，则质能关系为$E=mc^2$。下面测试上下标、分数、根式、求和、希腊字母和分段函数：\[\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i\]\[f(x)=\begin{cases}x^2+\sqrt{2x},&amp;x\ge0\\-x^3-\alpha,&amp;x&lt;0\end{cases}\]再测试一个概率统计中的高斯分布：\[f(x\mid\mu,\sigma^2)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}},\quad\sigma&gt;0\]Mermaid流程图flowchartLRA[打开文章]--&gt;B{页面有公式?}B--是--&gt;C[按需加载MathJax]B--否--&gt;D[不加载MathJax]C--&gt;E[渲染公式]D--&gt;F{页面有Mermaid?}E--&gt;FF--是--&gt;G[按需加载Mermaid]F--否--&gt;H[保持轻量页面]G--&gt;I[渲染图表]Mermaid时序图sequenceDiagramautonumberparticipantUas浏览器participantPas文章页面participantCasCDNU-&gt;&gt;P:打开带公式和图表的文章P-&gt;&gt;P:扫描公式和Mermaid代码块P-&gt;&gt;C:检测到公式，请求MathJaxC--&gt;&gt;P:返回MathJaxP-&gt;&gt;C:检测到图表，请求MermaidC--&gt;&gt;P:返回MermaidP--&gt;&gt;U:渲染公式和图表Mermaid状态图stateDiagram-v2[*]--&gt;IdleIdle--&gt;LoadingMath:发现公式Idle--&gt;LoadingMermaid:发现图表LoadingMath--&gt;Rendered:公式渲染完成LoadingMermaid--&gt;Rendered:图表渲染完成Rendered--&gt;[*]检查点公式应显示为排版后的数学符号，而不是原始的LaTeX文本。三个Mermaid代码块都应渲染成图形，而不是保持代码块状态。打开浏览器开发者工具的Network面板后，应能看到这两个请求：https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg-full.js和https://cdn.jsdelivr.net/npm/mermaid@11.16.1/dist/mermaid.min.js。第二次刷新页面时，这两个资源应显示来自磁盘缓存或内存缓存。</li>
  <li>这篇博客已经内置GitHubPages自动部署工作流：只要代码推送到main分支，Actions会自动完成Jekyll构建、JS/CSS压缩和站点发布。下面按实际部署顺序走一遍，最后是我踩过或者最容易踩的坑。一、准备仓库先把博客源码推送到GitHub仓库：gitinitgitadd.gitcommit-m"initblog"gitbranch-Mmaingitremoteaddorigingit@github.com:&lt;用户名&gt;/&lt;仓库名&gt;.gitgitpush-uoriginmain注意：如果想按本文的根路径方式部署，新建仓库名必须使用：&lt;username&gt;.github.io例如GitHub用户名是zjc，仓库名就应该是zjc.github.io。原因是GitHubPages会把这种命名的用户仓库识别为个人主站点，最终访问地址是：https://&lt;username&gt;.github.io/如果仓库名叫blog，它会变成项目站点，访问地址是：https://&lt;username&gt;.github.io/blog/这时静态资源都会多出/blog/这个前缀，博客的baseurl也必须配置成/blog，否则样式、搜索和ServiceWorker都可能404。如果仓库是从别人那里Fork来的，先确认：默认分支是不是main。仓库的Actions页面有没有被禁用，需要手动点击Enableworkflows。.github/workflows/pages.yml、Gemfile、package.json、package-lock.json是否都存在。本博客不是纯默认Jekyll站点，它包含_plugins/md5_permalink.rb自定义插件和Node压缩脚本，所以部署必须走仓库里的GitHubActions工作流。二、开启GitHubPages打开GitHub仓库：Settings-&gt;Pages-&gt;Buildanddeployment-&gt;Source选择：GitHubActions不要选择Deployfromabranch。这个博客需要在构建阶段执行自定义Ruby插件和esbuild压缩，直接从分支部署静态文件会绕过这些步骤。设置完成后，pages.yml工作流才会被GitHubPages正确接收产物。三、理解自动部署流程核心工作流在：.github/workflows/pages.yml关键步骤如下：steps:-name:SetupRubyuses:ruby/setup-ruby@v1with:ruby-version:"2.7"-name:SetupNodeuses:actions/setup-node@v4with:node-version:"22"cache:npm-name:BuildJekyllsiterun:|bundleinstallJEKYLL_ENV=productionbundleexecjekyllbuild--destination_sitenpmcinpmrunminify--_site它的执行顺序是：检出main分支代码。安装Ruby2.7和Bundler依赖。安装Node22和npm依赖。使用Jekyll3.8.5构建站点到_site。使用esbuild压缩自定义JS、CSS和service-worker.js。上传_site作为PagesArtifact。调用actions/deploy-pages@v4发布站点。之后每次推送main，都会自动触发部署；也可以在：Actions-&gt;BuildanddeployPages-&gt;Runworkflow手动触发一次。四、配置自定义域名默认地址是：https://&lt;用户名&gt;.github.io或者：https://&lt;用户名&gt;.github.io/&lt;仓库名&gt;/如果要使用自己的域名，例如maver.cn，在仓库里配置：Settings-&gt;Pages-&gt;Customdomain填写域名后，GitHub会提示需要添加的DNS记录。以根域名绑定Pages为例，通常需要给域名服务商配置GitHubPages的A记录；如果绑定www或其他子域名，则配置CNAME记录到：&lt;用户名&gt;.github.ioDNS生效后，回到Settings-&gt;Pages：确认Customdomain显示绿色可用状态。勾选EnforceHTTPS。等证书签发完成，通常需要几分钟到几十分钟。具体DNS记录值以GitHubPages设置页显示的内容为准，GitHub官方记录有可能调整，不要盲目抄旧文章里的IP。五、修改站点域名配置这个博客有两个和地址有关的配置：domainUrl:''baseurl:''如果绑定根域名，例如maver.cn，建议这样配置：domainUrl:'https://maver.cn'baseurl:''domainUrl主要用于RSS和sitemap生成完整链接；baseurl会影响页面资源、菜单、ServiceWorker和文章资源路径。如果部署到项目路径，例如：https://&lt;用户名&gt;.github.io/blog/则必须配置：baseurl:'/blog'否则CSS、JS、搜索索引和ServiceWorker都可能按根路径请求，出现样式丢失或功能异常。六、部署完成后检查打开站点后，建议按下面顺序检查：首页能正常打开，样式没有丢。点一篇文章，确认文章URL是32位MD5路径。文章里的图片能显示，资源路径应该类似/posts/年/月/日/文件名。搜索页输入关键词，确认搜索索引可以请求。代码块语言高亮和复制按钮正常。文章二维码可以生成，扫码打开的是当前部署地址。明暗主题切换后刷新页面，偏好还能保留。浏览器控制台没有CSS404、JS404或ServiceWorker注册失败。如果某些页面还是旧内容，先强制刷新；仍不更新时，再检查ServiceWorker缓存。七、踩坑点1.PagesSource选错症状：工作流执行成功，但Pages一直是旧页面，或者提示没有部署分支。原因是Source选择了Deployfromabranch。这个博客必须选择：GitHubActions2.推送分支不是main工作流触发条件写的是：on:push:branches:-main如果代码在master或其他分支，Actions不会自动部署。要么把默认分支改成工作流里的分支，要么修改branches配置。3.工作流权限被收紧工作流需要这些权限：permissions:contents:readpages:writeid-token:write如果组织或仓库策略把pages:write、id-token:write禁掉，部署会在上传或发布阶段失败。需要在仓库或组织层面允许Pages写入和OIDC认证。4.使用默认Jekyll构建，MD5链接失效这个博客的文章URL由_plugins/md5_permalink.rb生成。如果绕过仓库里的工作流，让GitHub使用默认Jekyll构建流程，自定义插件不会执行，文章链接就会退回日期路径，首页、RSS、sitemap和二维码对应关系都会乱掉。5.Windows换行符影响MD5文章链接是根据Markdown源文件内容计算的。插件已经把CRLF统一成LF后再计算MD5，所以Windows本地和LinuxActions的构建结果保持一致。但要注意：不要手工修改_site产物，也不要把_site提交回仓库。部署产物每次都会重新生成，改源文件才是正确入口。6.改一个错别字，文章链接就变了这是本博客当前的设计，不算是bug：文章源文件内容变化，MD5就变化。文章分享链接会变化。文章二维码也会指向新链接。旧文章路径不会被自动重定向。所以发布前尽量确认内容已经稳定；发布后再改错别字，就要接受旧链接失效，或者自己维护一套固定永久链接。7.项目路径部署忘记baseurl如果站点最终运行在：https://&lt;用户名&gt;.github.io/&lt;仓库名&gt;/而baseurl还是空字符串，页面会去根路径找静态资源，典型表现是：页面没有样式。控制台大量CSS404。搜索接口404。ServiceWorker注册失败。项目路径部署时，baseurl必须等于仓库路径。8.自定义域名DNS未生效DNS配置后可能因为缓存没有立即生效。排查顺序：用nslookup或在线DNS查询工具确认记录已经扩散。回到GitHubPages设置页看Customdomain状态。等待HTTPS证书签发。清理浏览器缓存或换无痕窗口访问。不要在DNS未生效时反复删除又绑定域名，反而可能让证书状态更混乱。9.ServiceWorker只适合HTTPSServiceWorker要求站点运行在HTTPS或localhost下。GitHubPages默认支持HTTPS，绑定自定义域名后也要开启EnforceHTTPS，否则二维码、离线缓存等依赖页面环境的功能可能不稳定。10.忘记提交package-lock.jsonActions里使用的是：npmci这个命令依赖package-lock.json。如果锁文件没有提交，CI会直接失败。压缩依赖版本固定在package.json和锁文件里，两个文件要一起提交。八、出问题先看Actions日志打开：Actions-&gt;BuildanddeployPages点击失败的那次运行，再看具体失败步骤：BuildJekyllsite失败：多半是Ruby依赖、Markdown、Liquid或插件问题。npmci失败：检查package.json和package-lock.json是否同步提交。Uploadsite或DeployPages失败：优先检查PagesSource、分支和权限。部署成功但页面异常：打开浏览器开发者工具，看Network和Console里的404。只要Actions日志里BuildanddeployPages全绿，GitHubPages侧基本已经完成发布；剩下的问题通常在域名、路径配置或浏览器缓存。</li>
  <li>一、整体流程（请求/person?format=yaml时）一次请求从浏览器到返回YAML，会经历下面这条链：sequenceDiagramparticipantBas浏览器participantDasDispatcherServlet&lt;br/&gt;(前端控制器)participantCasController1&lt;br/&gt;@GetMapping("/person")participantNas内容协商&lt;br/&gt;(ContentNegotiation)participantMasMyYamlHttpMessageConverterparticipantYasYAMLMapperB-&gt;&gt;D:GET/person?format=yamlD-&gt;&gt;C:根据@GetMapping找到person()并调用C--&gt;&gt;D:返回Person对象(不是字符串)D-&gt;&gt;N:要写回响应，先决定"用哪种格式"N--&gt;&gt;D:format=yaml+配置映射=&gt;text/yamlD-&gt;&gt;M:找能写text/yaml的转换器=&gt;canWrite=trueM-&gt;&gt;Y:writeInternal()调用YAMLMapper.writeValue(流,person)Y--&gt;&gt;M:生成YAML文本M--&gt;&gt;D:写入响应体,Content-Type:text/yamlD--&gt;&gt;B:HTTP200+YAML内容二、每个文件的作用和原理E:\springboot\deom\src\main\java\cn\maver\deom\compoment\MyYamlHttpMessageConverter.java——核心组件这是自定义的HTTP消息转换器。SpringMVC里，任何”Java对象⇄响应/请求体字节”的转换都靠HttpMessageConverter接口完成，JSON的转换器、String的转换器都是它的实现。它继承AbstractHttpMessageConverter&lt;Object&gt;，这个抽象类帮你做掉了”通用工作”，只留三个抽象方法给你实现：方法作用这里的实现supports(Class)准入开关：这个转换器能不能处理某个类型的对象返回true，表示什么类型都能转readInternal(...)入站：把请求体读成对象（反序列化）返回null，暂时不处理读writeInternal(...)出站：把对象写成响应体（序列化）用YAMLMapper写YAML关键点：构造器里的super(newMediaType("text","yaml",Charset.forName("UTF-8")))声明了这个转换器支持的媒体类型是text/yaml。Spring做canWrite判断时就是拿它和”客户端想要的类型”做匹配。YAMLMapper是Jackson3（tools.jackson）里YAML专用的ObjectMapper，它本身就是tools.jackson.databind.ObjectMapper的子类，所以privateObjectMapperobjectMapper字段直接赋newYAMLMapper()即可。writeValue(输出流,对象)一行就把对象序列化成YAML写进响应流。try(OutputStreamos=outputMessage.getBody())是try-with-resources：自动关闭输出流。E:\springboot\deom\src\main\java\cn\maver\deom\config\MyConfig.java——把转换器注册进MVCSpringMVC的转换器列表由WebMvcConfigurer来定制。这里用一个@Bean返回匿名内部类：builder.configureMessageConvertersList(converters-&gt;converters.add(newMyYamlHttpMessageConverter()));原理（这是之前踩坑的重点）：Spring7/Boot4里，旧的configureMessageConverters(List)方法已废弃。往那个列表里add任意一个转换器，框架就认为”你要完全接管转换器列表”，于是JSON、String等默认转换器全部不再注册（之前Accept:application/json报406就是这个原因）。新API是configureMessageConverters(HttpMessageConverters.ServerBuilder)。ServerBuilder是一个”建造器”：先由框架用registerDefaults()探测classpath，自动注册好JSON、String、YAML等默认转换器，最后统一组装成列表。configureMessageConvertersList(...)是在默认转换器全部组装完之后再对最终列表做追加，所以你的YAML转换器排在JSON后面——这就是为什么默认请求仍是JSON，只有明确要YAML时才走你的转换器。三、为什么”默认请求返回JSON，加参数才返回YAML”不加参数时：没有format参数，协商落到Accept:*/*，Spring从转换器列表里挑”最合适”的——JSON转换器排在前面，于是返回application/json。加?format=yaml时：协商结果明确是text/yaml，JSON转换器不支持text/yaml（application/json与text/yaml不兼容），只有你的MyYamlHttpMessageConverter支持，于是选中它返回YAML。加?format=json时：json是Spring内置认识的扩展名，映射成application/json，走默认JSON转换器。四、一句话总结application.properties告诉Spring”允许用?format=参数来协商格式，并且yaml对应text/yaml“；MyConfig用Spring7的新API把你的自定义转换器追加到默认转换器之后；请求进来后Spring先做内容协商确定text/yaml，再按顺序找到MyYamlHttpMessageConverter，由它内部用Jackson3的YAMLMapper把Person对象序列化成YAML写回响应。需要我针对其中某一步（比如内容协商的源码路径、ServerBuilder组装顺序）再展开讲讲吗？</li>
  <li>快捷键：Win+i直接打开设置，按下面顺序操作，拒绝C盘爆红、广告弹窗、开机卡顿。一、系统更新、激活、卸载预装垃圾Windows更新→检查更新，把系统、驱动全部装好，反复重启直到没有更新；不要彻底关闭Windows更新，可临时暂停更新。确认Windows激活；有预装Office，登录微软账号完成Office激活。设置→应用→已安装应用，卸载品牌预装试用杀毒（迈克菲等）、推广管家、多余试用软件。&gt;Windows自带Defender足够安全，不建议装第三方杀毒管家。二、显示设置设置→系统→显示分辨率：调到显示器推荐分辨率。高级显示器→选择显示器，把刷新率调到最大值（很多新机默认锁60Hz）。缩放：笔记本按推荐缩放（125%/150%），字体才清晰。三、存储优化设置→系统→存储打开存储感知，配置：自动删除临时文件、回收站超过30天文件，设置每天执行，自动清理垃圾。如果整机只有C盘：Win+X→磁盘管理，压缩卷分出D盘，不懂问我，操作错误系统可能不可用四、电源与睡眠设置→系统→电源和电池游戏本/台式插电：电源模式选最佳性能；笔记本电池用均衡/最佳能效。屏幕、睡眠：按需设置；挂机下载可以改成“从不”。笔记本：接通电源尽量用高性能，电池模式兼顾续航。五、关闭广告、隐私追踪设置→隐私和安全性常规：4个开关全部关闭（广告ID、启动跟踪、应用启动追踪等）。诊断与反馈：关闭可选诊断数据，关闭反馈提醒。权限：相机、麦克风、位置，只给真正需要的软件，其余关闭。设置→系统→通知：可以关闭总通知开关，或只保留少数软件通知，大幅减少弹窗广告。个性化清理界面设置→个性化任务栏：关闭小组件、不需要的搜索；任务栏行为可以改成任务栏图标不合并，更像Win10习惯。开始：关闭“显示建议内容”，关掉推荐广告。锁屏界面：背景改为图片，关闭Windows聚焦趣闻、广告推送。六、开机速度优化两种方式任选其一：设置→应用→启动，把不需要开机启动全部关掉（聊天软件、网盘、厂商管家等）。Ctrl+Shift+Esc打开任务管理器→启动应用，启动影响高的非必要程序禁用。不要全部禁用，声卡、输入法、指纹识别驱动保留启用。七、网络更新优化设置→Windows更新→高级选项→传递优化，关闭“允许从其他电脑下载”，防止偷偷占上传网速。八、桌面图标显示设置→个性化→主题→桌面图标设置，勾选此电脑、回收站，桌面就显示计算机图标。九、避坑提醒❌不要随便网上下载“Win11一键优化工具”，很多捆绑垃圾软件。❌不要直接禁用Windows更新服务，会缺失安全补丁。十、常用软件及设置卸载软件工具:双击对应的软件卸载，下载地址https://geekuninstaller.com/卸载系统没用软件软件，特别是很多没用的东西，双击卸载，等待卸载完成并清理相应的残留WinRAR解压软件，下载地址：https://www.win-rar.com/start.html?&amp;L=7安装时候注意设置右键的菜单，不要勾选其余设置，参考：只保留常用的菜单系统优化软件dism++，下载地址：点击下载下载具体设置路径如下：设置项参考：其他设置Win11恢复Win10经典完整右键菜单1.开始菜单搜索终端，右键→以管理员身份运行2.复制下面整段粘贴进去，回车执行：regadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/ve/tREG_SZ/d""/f3.再执行这条重启资源管理器，立刻生效（桌面会闪一下）：taskkill/f/imexplorer.exe&amp;startexplorer.exe</li>
  <li>一.模版引擎·由于SpringBoot使用了嵌入式Servlet容器，所以JSP默认不能使用·如果需要服务端页面渲染，优先使用模板引擎，如Thymeleaf二.Thymeleaf整合1.导包&lt;dependency&gt;&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;&lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;&lt;/dependency&gt;2.配置（自动配置）·默认在resource/templates后缀为.html例：resource/templates/页面名.html3.创建Controller@ControllerpublicclassThymeleafController{@GetMapping("/hello")publicStringhello(@RequestParam("name")Stringname,Modelmodel){model.addAttribute("message",name);return"页面名";}}·@RequestParam注解：从http中接收参数·Model接口：用于在Controller和页面之间传递数据单个存数据：model.addAttribute("键名",数据值)批量存Map数据：`model.addAllAttributes(map集合)4.模版页面取值&lt;spanth:text="${message}"&gt;&lt;/span&gt;完整页面：&lt;!DOCTYPEhtml&gt;&lt;htmllang="en"&gt;&lt;head&gt;&lt;metacharset="UTF-8"&gt;&lt;title&gt;Title&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;spanth:text="${message}"&gt;&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;</li>
  <li>匿名内部类核心速查1.核心作用解决「某个实现类只需要用一次，单独新建Java文件完全浪费」的场景，不用额外创建类文件，直接就地完成类定义、方法重写、对象创建，大幅减少冗余代码。2.本质一个没有类名的Java类，同时完成了「继承/实现父类/接口+重写抽象方法+直接创建对象」三步操作，最终得到的就是这个匿名类的实例对象。3.标准语法new父类名/接口名(){//重写所有抽象方法@Overridepublicvoid方法名(参数){//业务逻辑}};4.实际使用示例以Swim接口为例，直接作为方法参数传入，完全不用单独写Student实现类：//多态写法，一步完成定义+创建对象Swims=newSwim(){@Overridepublicvoidswim(){System.out.println("学生正在游泳");}};//直接调用方法goSwimming(s);</li>
  <li>成员内部类+静态内部类完整规则速查一、成员内部类核心规则修饰权限：支持public/private/protected/默认包权限四种修饰私有内部类访问方式：外部类提供公开方法返回内部类实例，对外隐藏内部类实现publicInnergetInstance(){returnnewInner();}同名变量访问：内部类和外部类存在同名成员变量时，用外部类名.this.变量名明确指定访问外部类的变量Outer.this.a二、静态内部类核心规则定义本质：带static修饰的特殊成员内部类实例化方式：无需依赖外部类对象，直接通过外部类名调用构造器创建Outer.Inneroi=newOuter.Inner();方法调用规则：非静态方法：先创建静态内部类对象，用对象调用静态方法：直接通过外部类名.内部类名.方法名调用</li>
  <li>以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。Ant风格路径用法Ant风格的路径模式语法具有以下规则：*:表示任意数量的字符。?:表示任意一个字符。**:表示任意数量的目录。{}:表示一个命名的模式占位符。[]:表示字符集合，例如[a-z]表示小写字母。例如：*.html匹配任意名称，扩展名为.html的文件。/folder1/*/*.java匹配在folder1目录下的任意两级目录下的java文件。/folder2/**/*.jsp匹配在folder2目录下任意目录深度的jsp文件。/{type}/{id}.html匹配任意文件名为{id}.html，在任意命名的{type}目录下的文件。注意：Ant风格的路径模式语法中的特殊字符需要转义，如：要匹配文件路径中的星号，则需要转义为\*。要匹配文件路径中的问号，则需要转义为\?。//Web接口测试控制器@GetMapping("/a/b/?/{p1:[a-f]+}/**")publicStringhello(HttpServletRequestrequest,@PathVariable("p1")Stringpath){log.info("路径变量p1:{}",path);Stringuri=request.getRequestURI();returnuri;}//HttpServletRequestrequest是Servlet官方提供的原生HTTP请求对象//第一个参数：把本次HTTP请求的完整原生对象直接注入进来//第二个参数：把路径变量p1的值注入进来，赋值给path</li>
  <li>基础可运行代码//父类publicclassPerson{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}}//子类publicclassFatherextendsPerson{publicFather(Stringname,intage){super(name,age);}publicvoideat(){System.out.println(getAge()+","+getName());}}//测试入口publicclassTest{publicstaticvoidmain(String[]args){Personp=newFather("John",30);if(pinstanceofFatherf)f.eat();}}核心规则✅Java仅支持单继承：一个类只能直接extends一个父类✅构造器不会被继承，super()必须写在子类构造器第一行✅方法重写必须加@Override注解，方法签名和父类完全一致✅父类private私有成员子类不能直接访问，只能通过get/set方法操作✅向下强转前必须用instanceof做类型判断，避免运行时ClassCastException✅必须满足is-a语义才用继承，继承链深度建议不超过3层</li>
  <li>基于请求头内容协商:#1.1.1.客户端向服务端发送请求，携带HTTP标准的Accept请求头。#1.1.1.1.Accept:`application/json`、`text/xml`、`text/yaml`#1.1.1.2.服务端根据客户端请求头期望的数据类型进行动态返回基于请求参数内容协商:#发送请求`GET/projects/spring-boot?format=json`#匹配到`@GetMapping("/projects/spring-boot")`#发送请求`GET/projects/spring-boot?format=xml`，优先返回xml类型数据1.引入支持写xml内容的依赖&lt;dependency&gt;&lt;groupId&gt;com.fasterxml.jackson.datatype&lt;/groupId&gt;&lt;artifactId&gt;jackson-datatype-xml&lt;/artifactId&gt;&lt;/dependency&gt;2.标注注解@JacksonXmlRootElement//可以写出xml文档@DatapublicclassPerson{privateStringname;privateintage;}3.开启基于请求参数的内容协商#开启基于请求参数的内容协商功能。默认参数名:formatspring.mvc.contentnegotiation.favor-parameter=true#指定内容协商时使用的参数名。默认是formatspring.mvc.contentnegotiation.parameter-name=type</li>
  <li>指定日志文件路径logging.file.path=指定日志文件的名只写名字，就生成到当前项目同位置的demo.log写名字加路径，就生成到指定路径的demo.loglogging.file.name=</li>
  <li>开启静态资源映射规则#默认truespring.web.resources.add-mappings=true设置缓存例如#设置缓存时间，单位为秒spring.web.resources.cache.cachecontrol.max-age=3600判断服务器和浏览器资源是否变化#默认true，如果last-modified时间相同，返回304spring.web.resources.cache.use-last-modified=true</li>
  <li>源码分析SpringBoot3静态资源映射三大默认规则规则一：WebJars前端依赖映射规则访问/webjars/**路径，就去classpath:/META-INF/resources/webjars/下查找资源a.maven导入前端依赖b.浏览器直接通过路径访问对应静态资源规则二：全局通用静态资源映射规则访问/**路径，就去静态资源默认的四个位置按优先级查找资源a.classpath:/META-INF/resources/b.classpath:/resources/c.classpath:/static/d.classpath:/public/规则三：静态资源默认缓存规则设置所有缓存配置直接通过配置文件spring.web.resources.cache统一调整a.cachePeriod：缓存周期，单位为秒，设置多久之内不用向服务器请求更新资源，SpringBoot默认未设置b.cacheControl：HTTP标准缓存控制，完整规则参考HTTP缓存文档c.useLastModified：是否启用最后修改时间校验，配合HTTPCache规则使用缓存作用说明：浏览器访问过静态资源后，如果服务器上该资源没有发生修改，下次访问时浏览器可以直接使用本地缓存的资源，无需向服务器重复发起请求，大幅提升页面加载速度。//缓存规则底层自动配置源码registration.setCachePeriod(getSeconds(this.resourceProperties.getCache().getPeriod()));registration.setCacheControl(this.resourceProperties.getCache().getCacheControl().toHttpCacheControl());registration.setUseLastModified(this.resourceProperties.getCache().isUseLastModified());欢迎页访问路径//默认在静态资源中添加index.htmlFavicon(网站图标)路径//默认在静态资源中添加favicon.ico</li>
  <li>SpringMVC配置与开发模式总结三种配置方式配置类型实现代码注解要求最终效果全自动直接编写控制器逻辑无额外特殊要求全部使用自动配置默认效果手自一体@Configuration+配置WebMvcConfigurer+配置WebMvcRegistrations不要标注@EnableWebMvc自动配置效果，手动设置部分功能，自定义MVC底层组件全手动@Configuration+配置WebMvcConfigurer标注@EnableWebMvc禁用自动配置效果，全手动设置两种开发模式前后分离模式：@RestController响应JSON数据前后不分离模式：@Controller+Thymeleaf模板引擎</li>
  <li>级别排序（由低到高）ALL→TRACE→DEBUG→INFO→WARN→ERROR→FATAL→OFF日志输出规则：只会打印指定级别及比它优先级更高的日志。各级别说明级别说明ALL打印全部级别的所有日志TRACE追踪框架运行的超详细流程，日常开发几乎不用DEBUG开发调试阶段的细节日志，打印中间变量、方法入参等INFO记录关键业务节点、核心运行状态WARN警告，不影响运行但存在潜在风险ERROR业务错误，程序异常、接口调用失败FATAL致命错误，直接导致程序崩溃OFF完全关闭所有日志记录默认配置没有单独指定级别的类，使用root根配置指定的级别作为默认SpringBoot日志的默认初始级别是INFO</li>
  <li>配置方式#定义分组logging.group.组名=包1,包2,...#设置分组的日志级别logging.level.组名=级别</li>
  <li>Ubuntu24使用netplan，yaml格式严格缩进，不能用Tab，只能空格！Linux设置静态IP，就是让机器重启后地址不变。方便SSH远程连接，不用每次查IP。搭建网站、数据库、集群服务时，其他设备能稳定访问。防火墙规则、端口映射、内网同步任务也不会因IP变动失效。缺点是要规划地址，容易出现IP冲突。第一步：设置VMware的虚拟网络打开VMware，进入编辑-&gt;虚拟网络编辑器：按照下图进行配置，其中子网IP192.168.100.0决定了以后的网段：配置完上述设置后，进行NAT设置，主要配置网关地址：完整的配置参考：第二步：修改Ubuntu网卡信息主要是查看网卡的名称，修改对应的Ubuntu的网卡配置信息，最后重启网卡。查看网卡ipaddr运行该命令后会输出网卡的基本信息，找到你的网卡名称，如我的输出如下：zjc@ubuntu-24-dev:~$ipaddr1:lo:&lt;LOOPBACK,UP,LOWER_UP&gt;mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostnoprefixroutevalid_lftforeverpreferred_lftforever2:ens32:&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;mtu1500qdiscfq_codelstateUPgroupdefaultqlen1000link/ether00:0c:29:a2:18:d1brdff:ff:ff:ff:ff:ffaltnameenp2s0inet192.168.100.128/24brd192.168.100.255scopeglobalens32valid_lftforeverpreferred_lftforeverinet6fe80::20c:29ff:fea2:18d1/64scopelinkvalid_lftforeverpreferred_lftforever那么我的网卡名称就是ens32，接下来修改配置时候要看准这个网卡，不要修改错误。查看并修改网卡配置文件首先进入网卡的配置目录/etc/netplan/，然后拷贝一份保存起来，防止修改出错后以后上不了网，再进行编辑：zjc@ubuntu-24-dev:/etc/netplan$cd/etc/netplan/zjc@ubuntu-24-dev:/etc/netplan$pwd/etc/netplanzjc@ubuntu-24-dev:/etc/netplan$ls50-cloud-init.yamlzjc@ubuntu-24-dev:/etc/netplan$cp50-cloud-init.yaml50-cloud-init.yaml.bakzjc@ubuntu-24-dev:/etc/netplan$ls50-cloud-init.yaml50-cloud-init.yaml.bak备份完成后，使用vim编辑配置并保存，修改后的配置示例如下：network:version:2ethernets:ens32:dhcp4:falsedhcp6:falseaddresses:[192.168.100.128/24]optional:trueroutes:-to:defaultvia:192.168.100.2nameservers:addresses:[114.114.114.114,8.8.8.8]注意：Ubuntu进来默认不是root用户，如果执行命令遇到没有权限Permissiondenied则需要使用sudo进行授权。配置项说明：ens32：你的网卡名192.168.100.128/24：自选静态IP（和VMnet8同网段）via:192.168.100.2：VMwareNAT网关重启网卡一般是先测试网卡，没有问题再正式执行重启命令生效：#测试配置，出错30秒自动回滚sudonetplantry网络正常就回车确认永久生效。测试没问题也可以直接执行：sudonetplanapply验证网络ipaddr#查看IP是否生效ping192.168.100.2#测试通网关pingwww.baidu.com#测试外网ipaddr能正常显示网卡的IP为192.168.100.128则正常，ping网关和外网返回如下则正常：zjc@ubuntu-24-dev:~$ping192.168.100.2PING192.168.100.2(192.168.100.2)56(84)bytesofdata.64bytesfrom192.168.100.2:icmp_seq=1ttl=128time=0.132ms64bytesfrom192.168.100.2:icmp_seq=2ttl=128time=0.185ms64bytesfrom192.168.100.2:icmp_seq=3ttl=128time=0.205ms64bytesfrom192.168.100.2:icmp_seq=4ttl=128time=0.225ms64bytesfrom192.168.100.2:icmp_seq=5ttl=128time=0.237ms64bytesfrom192.168.100.2:icmp_seq=6ttl=128time=0.208ms^C---192.168.100.2pingstatistics---6packetstransmitted,6received,0%packetloss,time5157msrttmin/avg/max/mdev=0.132/0.198/0.237/0.033mszjc@ubuntu-24-dev:~$pingwww.baidu.comPINGwww.a.shifen.com(183.2.172.177)56(84)bytesofdata.64bytesfrom183.2.172.177:icmp_seq=1ttl=128time=11.7ms64bytesfrom183.2.172.177:icmp_seq=2ttl=128time=7.23ms64bytesfrom183.2.172.177:icmp_seq=3ttl=128time=10.5ms64bytesfrom183.2.172.177:icmp_seq=4ttl=128time=8.14ms64bytesfrom183.2.172.177:icmp_seq=5ttl=128time=8.70ms^C---www.a.shifen.compingstatistics---5packetstransmitted,5received,0%packetloss,time4007msrttmin/avg/max/mdev=7.228/9.260/11.710/1.631ms踩坑点yaml缩进必须空格，禁止Tab，格式错直接断网IP、网关必须和VMnet8网段一致，否则不通静态IP不要落在VMwareDHCP地址池范围内，防止IP冲突想宿主机SSH连接虚拟机：确保VMnet8网卡启用</li>
  <li>IntelliJIDEA常用快捷键大全Windows系统默认快捷键，Mac用户将Ctrl替换为Command即可通用。一、全局搜索与定位快捷键功能说明双击Shift全局任意内容搜索，可搜类、文件、配置、操作命令Ctrl+N快速搜索指定Java类，支持模糊匹配Ctrl+Shift+N搜索任意文件，包括配置文件、XML、资源文件Ctrl+F当前文件内文本查找Ctrl+R当前文件内文本替换Ctrl+Shift+F全局项目范围内搜索指定文本内容Ctrl+Shift+R全局项目范围内批量替换指定文本二、代码编辑与生成快捷键功能说明Alt+Insert自动生成代码，快速生成构造方法、Getter/Setter、toString、重写方法Ctrl+/单行注释/取消注释，自动适配当前文件语言Ctrl+Shift+/多行块注释/取消块注释Ctrl+D快速复制当前选中行，无需手动粘贴Ctrl+X剪切当前行，不用选中整行直接按就生效Ctrl+Y删除当前整行代码Shift+Enter在当前行下方新开一行，光标自动跳到新行开头Ctrl+Alt+L一键格式化当前文件所有代码，自动对齐缩进Ctrl+Alt+O自动优化导入，清理没用的冗余import语句三、代码跳转与查看源码快捷键功能说明Ctrl+左键点击直接跳转到方法、类、变量的定义位置Ctrl+B跳转到定义处，和左键点击效果一致Ctrl+Alt+左箭头回到上一个光标停留的位置，看源码返回上一步超实用Ctrl+Alt+右箭头前进到下一个光标停留的位置Ctrl+H查看当前类的完整继承层级树，显示所有父类和实现的接口Ctrl+Shift+B跳转到接口方法的具体实现类，不用手动查找实现Alt+F7全局查找当前方法/变量被哪些地方调用过四、调试与运行快捷键功能说明Shift+F10直接运行当前启动类/项目Shift+F9以调试模式启动项目F7调试时步入方法内部，进入方法逐行执行F8调试时步过，执行完当前行直接跳到下一行，不进入方法内部Shift+F8调试时步出，直接从当前方法里跳出，回到调用这个方法的上一行Ctrl+F2直接停止当前正在运行的程序/调试进程Ctrl+F8在当前行快速添加/取消断点五、项目与工具操作快捷键功能说明Ctrl+Shift+F9一键重新编译当前修改的文件Ctrl+Shift+Alt+S快速打开项目结构配置面板Ctrl+Shift+A全局搜索任意操作命令，忘记快捷键时直接搜功能名就能找到六、窗口与视图操作快捷键功能说明Alt+1快速打开/隐藏左侧项目文件树面板Alt+4快速打开/隐藏下方调试运行控制台面板Ctrl+E弹出最近打开过的文件列表，快速切换文件Ctrl+Shift+E查看最近修改过的所有文件</li>
  <li>书写规范属性名推荐用短横线命名：birth-day（而非birthDay）引号区别：单引号：不会转义（\n保持原样）双引号：会转义（\n变成换行）大文本|开头：保留文本格式（保留换行）&gt;开头：折叠换行分割文档---可以把多个YAML文档合并为一个文件，每个文档相互独立</li>
  <li>git克隆代码gitclonehttps://github.com/zhongruntao/zhongruntao.github.io.gitgitclone+要克隆的仓库地址git拉取代码拉取代码,即更新代码,把代码从远程仓库(gitee/github)同步到本地(windows)gitpullgit提交代码到本地暂存区#添加代码#gitadd需要提交的文件,(.)代表所有被修改的文件,例如提交本次修改的所有文件gitadd.#填写本次提交的代码修改注释说明gitcommit-m"注释"git推送代码推送代码之前必须拉取代码gitpushgit查看修改的状态gitstatusgit查看提交历史gitlog代码示例packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemo1Application{publicstaticvoidmain(String[]args){SpringApplication.run(Demo1Application.class,args);}}展示图片展示数学公式\[\sqrt{x^2+y^2}\quad\sum_{i=1}^{n}i=\frac{n(n+1)}{2}\]行内公式写法：$a^2+b^2=c^2$\[\sqrt{x^2+y^2}\quad\sum_{i=1}^{n}i=\frac{n(n+1)}{2}\]\[\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i\]\[f(x)=\begin{cases}x^2&amp;x\ge0\\-x&amp;x&lt;0\end{cases}\]</li>
  <li>SpringBootStarter核心运行流程引入自定义/官方starter依赖后，会自动传递导入对应的autoconfigure自动配置包。在autoconfigure包的资源目录下，存在固定路径文件：META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports该文件内预先定义了所有需要在项目启动时加载的自动配置类全限定名。SpringBoot核心注解@EnableAutoConfiguration会自动扫描并导入上述文件中声明的全部自动配置类，这些类本身标注了条件注解，会根据项目当前环境按需加载。命名格式为XxxAutoConfiguration的自动配置类，会向SpringIOC容器中批量注册所需的功能组件，组件的属性值全部从对应的XxxProperties配置属性类中读取。XxxProperties类通过@ConfigurationProperties注解和项目的application.yml/application.properties配置文件完成绑定，直接读取用户自定义的参数。</li>
  <li>核心注解注解说明@ConfigurationProperties声明组件与配置文件的绑定关系@EnableConfigurationProperties用于导入第三方写好的组件绑定步骤将容器中任意组件（Bean）的属性值和配置文件的值进行绑定：给容器注册组件：使用@Component或@Bean声明绑定关系：使用@ConfigurationProperties指定组件和配置文件中哪些配置项进行绑定</li>
  <li>SpringBoot摒弃XML配置方式，改为全注解驱动。注册组件的方式@Configuration编写一个配置类在配置类中，自定义方法给容器注册组件，配合@Bean使用@Import导入第三方组件示例对比XML方式（旧）：&lt;beanid="user"class="com.example.boot.bean.User"&gt;&lt;propertyname="id"value="1"/&gt;&lt;propertyname="name"value="zhangsan"/&gt;&lt;/bean&gt;注解方式（新）：@ConfigurationpublicclassAppConfig{@BeanpublicUseruser(){Useruser=newUser();user.setId(1L);user.setName("zhangsan");returnuser;}}</li>
  <li>常用条件注解注解触发条件@ConditionalOnClass类路径中存在这个类时触发@ConditionalOnMissingClass类路径中不存在这个类时触发@ConditionalOnBean容器中存在这个Bean时触发@ConditionalOnMissingBean容器中不存在这个Bean时触发@ConditionalOnProperty配置文件中存在指定属性时触发</li>
  <li>为什么导入starter-web后所有相关依赖都自动导入？按场景导入：开发什么场景，就导入什么场景启动器Maven依赖传递：A→B→C，A就拥有B和C的所有依赖导入场景启动器后，自动把这个场景的所有核心依赖全部引入为什么版本号都不用写？每个Boot项目都有一个父项目spring-boot-starter-parent它的父项目是spring-boot-dependencies父项目作为版本仲裁中心，把所有常见jar的依赖版本都声明好了例如：mysql-connector-j自定义版本号利用Maven的就近原则：在当前项目properties标签中声明父项目用的版本属性key直接在导入依赖时声明版本第三方jar包Boot父项目没有管理的需要自行声明版本：&lt;dependency&gt;&lt;groupId&gt;com.alibaba&lt;/groupId&gt;&lt;artifactId&gt;druid&lt;/artifactId&gt;&lt;version&gt;1.2.16&lt;/version&gt;&lt;/dependency&gt;</li>
  <li>阿里巴巴MySQL规范【强制】命名规范表名、字段名必须使用小写字母或数字，禁止数字开头，禁止两个下划线中间只出现数字。正例：aliyun_admin,rdc_config,level3_name反例：AliyunAdmin,rdcConfig,level_3_name【强制】禁用保留字如DESC、RANGE、MATCH、DELAYED等，参考MySQL官方保留字。【强制】表必备三字段id：主键，类型为BIGINTUNSIGNED，单表自增，步长为1gmt_create：创建时间，DATETIME类型gmt_modified：更新时间，DATETIME类型【推荐】表命名遵循“业务名称_表的作用”，如alipay_task、force_project、trade_config【推荐】库名与应用名称尽量一致。【参考】合适的存储长度场景推荐类型字节范围人（150岁以内）TINYINTUNSIGNED10~255龟（数百岁）SMALLINTUNSIGNED20~65,535恐龙化石（数千万年）INTUNSIGNED40~~43亿太阳（约50亿年）BIGINTUNSIGNED80~~10的19次方其他注意事项尽量不要使用TRUNCATE清空表，不可以回滚。</li>
  <li>修改表结构--增加字段ALTERTABLE表名ADD列名DOUBLE(总位数,小数位);--修改字段类型ALTERTABLE表名MODIFY列名VARCHAR(50);--重命名字段（可同时改类型）ALTERTABLE表名CHANGE旧列名新列名VARCHAR(50);--删除字段ALTERTABLE表名DROPCOLUMN列名;重命名表RENAMETABLE旧表名TO新表名;删除与清空DROPTABLEIFEXISTS表名;--删除表TRUNCATETABLE表名;--清空表数据操作--插入多条数据INSERTINTO表名(a,b,c)VALUES(1,2,3),(4,5,6);--更新数据UPDATE表名SET列名1=新值,列名2=新值WHEREid=5;--定位</li>
  <li>浮点类型对照表类型字节数FLOAT(M,D)4DOUBLE(M,D)8REAL(M,D)默认同DOUBLE参数说明M：整数位数+小数位数（总位数）D：小数位数范围：-M.D到+M.D如果设置了长度，会自动四舍五入</li>
  <li>整数类型对照表类型字节数无符号范围TINYINT10~255SMALLINT20~65,535MEDIUMINT30~16,777,215INT40~4,294,967,295BIGINT80~18,446,744,073,709,551,615补充说明INT(n)中的n表示显示宽度，后面可接ZEROFILL补零UNSIGNED表示无符号，即只有正数和零</li>
  <li>事务控制COMMIT;--提交数据ROLLBACK;--回滚数据删除数据的区别操作说明是否可回滚TRUNCATETABLE删除全部数据不可以DELETEFROM删除部分或全部数据可以注意：DDL语句不可以回滚；DML语句默认不可以回滚，需要提前设置SETautocommit=false。</li>
  <li>数据库操作CREATEDATABASE库名;--使用默认字符集SHOWDATABASES;--查看所有数据库CREATEDATABASE库名CHARACTERSET'utf8mb4';--指定字符集USE库名;--切换数据库SHOWTABLES;--查看当前库的表ALTERDATABASE库名CHARACTERSET'utf8mb4';--修改字符集DROPDATABASEIFEXISTS库名;--删除数据库尽量不要修改数据库名。创建表CREATETABLEIFNOTEXISTS表名(idINT,nameVARCHAR(50),hire_dateDATE);基于查询结果创建表CREATETABLE新表名ASSELECTdepartment_idAS别名,nameAS别名FROMemployees;--别名会成为新表的列名</li>
  <li>常用聚合函数函数说明AVG(列)平均值SUM(列)求和MAX(列)最大值MIN(列)最小值COUNT(列)计数（不计算NULL值）分组查询GROUPBY(列名)--按列分组GROUPBY(列名)WITHROLLUP--最后计算总数（不能与ORDERBY同时使用）示例查询部门ID为10/20/30/40中最高工资超过10000的部门：--方式一（推荐，效率更高）SELECTdepartment_id,MAX(salary)FROMemployeesWHEREdepartment_idIN(10,20,30,40)GROUPBYdepartment_idHAVINGMAX(salary)&gt;10000;--方式二SELECTdepartment_id,MAX(salary)FROMemployeesGROUPBYdepartment_idHAVINGMAX(salary)&gt;10000ANDdepartment_idIN(10,20,30,40);注意：出现聚合函数时要用HAVING代替WHEREHAVING不能单独出现，必须和GROUPBY一起使用</li>
  <li>关键字关键字说明IN在集合中ANY满足任意一个ALL满足全部SOME同ANY示例：查询平均工资最低的部门方式一：子查询嵌套SELECTdepartment_idFROMemployeesGROUPBYdepartment_idHAVINGAVG(salary)=(SELECTMIN(avg_sal)FROM(SELECTAVG(salary)avg_salFROMemployeesGROUPBYdepartment_id)t_dept_avg_sal--子查询结果需取别名);方式二：使用ALL简化SELECTdepartment_idFROMemployeesGROUPBYdepartment_idHAVINGAVG(salary)&lt;=ALL(SELECTAVG(salary)FROMemployeesGROUPBYdepartment_id);注意事项空值问题：注意除以NULL的场景(NOT)EXISTS：相关子查询判断是否存在相关更新/相关删除：子查询引用外部表</li>
  <li>IF函数IF(条件,a,b)--条件成立返回a，否则返回bCASEWHENCASEWHEN条件1THEN结果1WHEN条件2THEN结果2ELSE结果END</li>
  <li>获取当前时间函数说明CURDATE()返回年月日CURTIME()返回时分秒NOW()返回系统日期和时间时间戳转换UNIX_TIMESTAMP()/UNIX_TIMESTAMP(date)FROM_UNIXTIME()提取日期信息函数说明YEAR(date)/MONTH(date)/DAY(date)提取年月日HOUR(time)/MINUTE(time)/SECOND(time)提取时分秒MONTHNAME(date)返回月份名称（January…）DAYNAME(date)返回星期名称WEEKDAY(date)返回周几QUARTER(date)返回季度WEEK(date)/WEEKOFYEAR(date)一年中的第几周DAYOFYEAR(date)一年中的第几天DAYOFMONTH(date)一个月中的第几天DAYOFWEEK(date)一周中的第几天日期运算--加减指定间隔DATE_ADD(date,INTERVALnumtype)DATE_SUB(date,INTERVALnumtype)--时间差DATEDIFF(a,b)--a和b间隔多少天TIMEDIFF(a,b)--a和b间隔的时间函数说明ADDTIME(t1,t2)时间相加SUBTIME(t1,t2)时间相减FROM_DAYS(n)从0000-01-01算n天后的日期TO_DAYS(date)日期到0000-01-01的天数LAST_DAY(date)所在月份最后一天MAKEDATE(year,day)某年第day天的日期MAKETIME(h,m,s)构造时间格式化--日期转字符串DATE_FORMAT(date,format)--字符串转日期STR_TO_DATE(str,format)format占位符占位符说明%Y/%y4位/2位年份%M/%m/%c月名/2位月数/月数%d/%e2位天数/天数%H/%h24小时制/12小时制%i分钟%S/%s秒%W/%a星期名/星期缩写%j一年中的第几天%U/%u第几周（Sunday/Monday为首日）</li>
  <li>长度与编码函数说明ASCII()返回第一个字母的ASCII值CHAR_LENGTH()字符数（中文算1个字符）LENGTH()字节数（UTF-8中文算3个字节）拼接与替换函数说明CONCAT(a,b,...)连接字符串CONCAT_WS(分隔符,a,b,...)用指定分隔符连接INSERT(str,pos,len,newstr)在指定位置插入REPLACE(str,old,new)替换大小写转换UPPER()/UCASE()：转大写LOWER()/LCASE()：转小写截取与填充函数说明LEFT(str,n)从左侧取n个字符RIGHT(str,n)从右侧取n个字符SUBSTR(str,pos,len)从第pos个开始取len个字符LPAD(str,len,pad)左侧填充，实现右对齐RPAD(str,len,pad)右侧填充，实现左对齐去空格TRIM()：去除首尾空格LTRIM()：去除左侧空格RTRIM()：去除右侧空格TRIM('o'FROM'hello')：去除指定字符其他函数说明REPEAT(str,n)重复n次SPACE(n)返回n个空格STRCMP(a,b)比较大小，返回1/0/-1LOCATE(substr,str)返回子串位置ELT(n,str1,str2,...)返回第n个字符串FIELD(str,str1,str2,...)返回字符串所在位置NULLIF(a,b)相等返回NULL，否则返回a</li>
  <li>加密函数函数说明MD5('密码')不可逆加密SHA('密码')不可逆加密信息函数函数说明VERSION()当前MySQL版本号CONNECTION_ID()当前服务器连接数DATABASE()/SCHEMA()当前所在数据库USER()/CURRENT_USER()/SYSTEM_USER()/SESSION_USER()当前连接用户名（格式：用户名@主机名）CHARSET(value)字符串的字符集COLLATION(value)字符串的比较规则其他函数函数说明FORMAT(value,n)数字格式化，四舍五入保留n位小数CONV(value,from,to)进制转换INET_ATON(ip)IP地址转数字INET_NTOA(value)数字转IP地址BENCHMARK(n,expr)表达式执行n次，测试耗时CONVERT(valueUSINGchar_code)修改字符编码</li>
  <li>基本函数函数说明ABS()绝对值SIGN()正数返回1，负数返回-1PI()圆周率CEIL()/CEILING()向上取整FLOOR()向下取整LEAST()返回最小值GREATEST()返回最大值MOD()取余RAND(seed)随机数ROUND(x,d)四舍五入，保留d位小数TRUNCATE(x,d)截断到d位小数SQRT()平方根弧度换算RADIANS()：角度转弧度DEGREES()：弧度转角度三角函数SIN(),COS(),TAN(),ASIN(),ACOS(),ATAN()等指数与对数POW(x,y)/POWER(x,y)：x的y次方EXP(x)：e的x次方LN()/LOG()：自然对数进制转换函数说明BIN()转二进制HEX()转十六进制OCT()转八进制CONV(a,b,c)将b进制的a转换为c进制</li>
  <li>见“所有”字眼时注意使用外连接。SQL92语法（旧）SELECTA,BFROMa,bWHEREa.C=b.C--靠共有列C连接SQL99语法（推荐）内连接SELECTA,BFROMa(INNER)JOINbONa.C=b.C外连接--左外连接：保留左表完整SELECTA,BFROMaLEFT(OUTER)JOINbONa.C=b.C--右外连接：保留右表完整SELECTA,BFROMaRIGHT(OUTER)JOINbONa.C=b.C满外连接--MySQL不支持FULLOUTERJOIN，用UNION替代SELECTA,BFROMaLEFTJOINbONa.C=b.CUNIONSELECTA,BFROMaRIGHTJOINbONa.C=b.C合并结果集UNION：去重，效率低UNIONALL：不去重，效率高其他连接方式自然连接：NATURALJOIN，自动匹配同名列指定连接列：USING(C)</li>
  <li>基础查询序号关键字说明1SELECT选择列2FROM选择表3DISTINCT去重4IFNULL(列,0)空值替换6DESCRIBE/DESC查看表结构条件筛选WHERE条件过滤BETWEENAANDB包含边界OR：名=AOR名=B（等价||）IN(A,B)（NOTIN取反）LIKE模糊查询，_表不确定字符，查_需转义\_排序与分页--升序ORDERBY列名ASC--降序ORDERBY列名DESC--分页：偏移量,每页个数LIMIT偏移量,每页个数--或使用OFFSET（参数顺序相反）LIMIT每页个数OFFSET偏移量</li>
  <li>功能设计搭建一个简单的学生管理系统，包含以下功能：增加学生add_student删除学生del_student修改数据mod_student查找学生rea_student</li>
  <li>Java接口核心规则速查1.接口定义语法//用interface关键字声明，不是classpublicinterface接口名{//全局常量：默认自带publicstaticfinal，必须声明时赋值数据类型常量名=值;//抽象方法：默认自带publicabstract，无方法体返回值类型方法名(参数列表);//Java8+新增：默认方法，带具体实现，用default修饰default返回值类型方法名(参数列表){//方法体}//Java8+新增：静态方法，带具体实现，用static修饰static返回值类型静态方法名(参数列表){//方法体}}2.类实现接口规则//用implements关键字，而非extends继承，支持多实现publicclass类名implements接口1,接口2{//必须重写接口所有抽象方法，强制使用public权限@Overridepublic返回值类型方法名(参数列表){//完整业务实现}}3.核心特性接口不能直接实例化对象一个类可以同时实现多个接口，突破单继承限制接口之间支持多继承：publicinterface子接口extends父接口1,父接口2{}仅定义能力契约，不包含子类通用复用的成员变量和普通实例方法接口中三类特殊方法调用规则（JDK8+全特性，JDK21完全兼容）1.接口静态方法作用：给接口升级提供全局通用工具逻辑定义格式：publicstatic返回值类型方法名(){方法体}核心规则：只能直接通过接口名调用，绝对不能用实现类对象、实现类名调用public修饰符可省略，static关键字不能省略//只能直接用接口名调用，不能用实现类对象/类名调用Inter.method();//错误写法：InterImpl.method()、newInterImpl().method()全部编译报错2.接口默认方法调用优先级：执行方法时优先走类的继承链，完全不会看接口如果实现类的父类里有同名普通方法，会直接覆盖接口的默认方法，不会触发接口逻辑核心规则：实现类不强制重写，重写时必须去掉default关键字多接口同名默认方法冲突时，子类必须手动重写解决冲突//先new实现类对象，直接用对象调用InterImplii=newInterImpl();ii.aaa();//如果实现类重写了默认方法，调用的是重写后的逻辑；没重写就走接口默认实现3.接口私有方法（JDK9+新增）作用：给接口内部多个默认方法/静态方法抽取公共重复逻辑，不对外暴露核心规则：只能在当前接口内部被其他方法调用，实现类完全访问不到分为普通私有方法（给默认方法复用）、静态私有方法（给静态方法复用）两种</li>
  <li>这是一个图片点击下载上面这张图片</li>
  <li>本文涵盖了Markdown的全部常用语法，每个示例均包含渲染效果与源码。标题以下展示了各级标题的渲染效果：一级标题二级标题三级标题四级标题五级标题六级标题#一级标题##二级标题###三级标题####四级标题#####五级标题######六级标题段落与换行这是一段普通的文本。这是第二段，段与段之间空一行分隔。同一段落内可以用两个以上空格来手动换行。就像这样。这是一段普通的文本。这是第二段，段与段之间空一行分隔。同一段落内可以用两个以上空格来手动换行。就像这样。文字样式加粗文本斜体文本加粗且斜体删除线**加粗文本***斜体文本****加粗且斜体***~~删除线~~行内代码使用反引号包裹inlinecode即可。用双反引号包裹含反引号的内容：codewith`backtick。使用反引号包裹`inlinecode`即可。用双反引号包裹含反引号的内容：``codewith`backtick``。代码块支持多种语言的语法高亮：functiongreet(name){console.log('Hello,'+name+'!')}defgreet(name):print(f'Hello,{name}!')&lt;divclass="box"&gt;HelloWorld&lt;/div&gt;```javascriptfunctiongreet(name){console.log('Hello,'+name+'!')}``````pythondefgreet(name):print(f'Hello,{name}!')``````html&lt;divclass="box"&gt;HelloWorld&lt;/div&gt;```无序列表列表项一列表项二列表项三也可以用*或+：星号列表加号列表-列表项一-列表项二-列表项三*星号列表+加号列表有序列表第一项第二项第三项1.第一项2.第二项3.第三项嵌套列表水果苹果香蕉饮料咖啡茶-水果-苹果-香蕉-饮料1.咖啡2.茶任务列表已完成的任务未完成的任务另一个未完成的任务-[x]已完成的任务-[]未完成的任务-[]另一个未完成的任务引用这是一段引用文本。可以跨越多行。&gt;这是一段引用文本。&gt;可以跨越多行。嵌套引用外层引用内层引用&gt;外层引用&gt;&gt;&gt;内层引用引用中的列表引用中的列表项一引用中的列表项二&gt;-引用中的列表项一&gt;-引用中的列表项二链接普通链接：GitHub带标题的链接：Google自动链接：https://www.example.com普通链接：[GitHub](https://github.com)带标题的链接：[Google](https://google.com'点击跳转Google')自动链接：&lt;https://www.example.com&gt;图片带链接的图片（点击图片跳转）：![示例图片](yun.webp)[![示例图片](yun.webp)](https://github.com)表格姓名年龄城市张三25北京李四30上海王五28广州带对齐方式的表格：左对齐居中对齐右对齐LeftCenterRight左中右|姓名|年龄|城市||------|----|------||张三|25|北京||李四|30|上海||王五|28|广州|带对齐方式的表格：|左对齐|居中对齐|右对齐||:---|:---:|---:||Left|Center|Right||左|中|右|分隔线使用三个或更多的-、*或_：以上是一条分隔线。---转义字符使用反斜杠转义Markdown特殊字符：*这不是斜体*#这不是标题`这不是代码\*这不是斜体\*\#这不是标题\`这不是代码锚点链接可以创建指向页面内标题的锚点：跳转到标题跳转到[标题](#标题)</li>
</ul>