MyBatis Plus 字段自动填充:生产级实现方案与原理分析
MyBatis Plus 字段自动填充:生产级实现方案与原理分析背景与问题在企业级应用开发中,数据库表设计通常包含审计字段,如 create_time(创建时间)、update_time(更新时间)。传统开发模式下,开发者需要在 Service 层手动调用 Setter 方法进行赋值。这种方式存在明显的缺陷: 代码冗余:Setter 代码充斥在业务逻辑中。 维护隐患:遗漏赋值导致数据不完整。 高耦合:业务逻辑与基础审计数据强耦合。 MyBatis Plus 提供了 MetaObjectHandler 接口,基于 AOP 思想拦截 SQL 执行过程,实现字段自动填充。本文介绍该功能的生产级实现及关键细节。 实现 MyBatis Plus 的自动填充(Auto-fill)功能,主要分为三步:改实体类注解 -> 写处理器策略 -> 删业务层代码。 核心实现步骤1. 实体类配置 (Entity Layer)通过 @TableField 注解的 fill 属性指定填充策略。 123456789101112131415161718192021@Data@TableName(&...
06、Java 基础硬核复习:面向对象编程(基础)的核心逻辑与面试考点
06、Java 基础硬核复习:面向对象编程(基础)的核心逻辑与面试考点第一部分:核心知识体系1. 面向对象思想 面向过程 vs 面向对象:面向过程以“函数”为核心,强调步骤;面向对象以“对象”为核心,强调封装(属性+方法)。 OOP 基本元素:类(class,对象的模板)和对象(object,类的实例)。 2. 类的成员与实例化 类的定义:使用 class 关键字定义,包含属性(成员变量)和方法(成员方法)。 类的初始化:通过构造器(constructor)初始化对象,属性可默认初始化(如 int 类型默认为 0)。 匿名对象:new Phone().call();,仅使用一次,无需变量引用。 对象内存解析:栈(存储引用变量)+ 堆(存储对象实体),例如 Phone p = new Phone(); 中,p 在栈,Phone 对象在堆。 3. 方法 方法的定义:包含返回值类型、方法名、参数列表、方法体(如 public void call() { ... })。 方法的调用方式:对象调用(p.call())、静态调用(Phone.staticMethod(...
告别“鼠标手”!开发者的 CMD 高效生存指南(附速查表)
告别“鼠标手”!开发者的 CMD 高效生存指南(附速查表)前言:你的键盘比鼠标快 10 倍在 Windows Terminal 和 PowerShell 日益强大的今天,经典的 CMD (命令提示符) 依然是开发人员手中最锋利、启动最快的“瑞士军刀”。为什么还需要学 CMD? 快:Win+R 输入 cmd 回车,0.1秒启动。 稳:任何一台 Windows 电脑(哪怕是 Win7 老古董)都有它。 爽:当你双手不离键盘就能搞定文件管理和进程查杀时,那种流畅感是鼠标无法比拟的。本文精选了开发者最需要的高频命令和提效神技,助你光速完成任务。 一、 生存必备:文件与目录操作日常的文件操作,用这几个命令能省下大量点击鼠标的时间。 1. 基础中的基础:cd ..想返回上一级目录?别再去点那个“向上”箭头了。 场景:退回到父文件夹。 技巧:连续使用 cd ..\.. 可以一次退两级。 12cd .. :: 返回上一级cd ..\.. :: 返回上两级 2. 跨盘符光速跳转:cd /d你是否遇到过:在 C 盘输入 cd D:\Project 却跳不过去?这是 ...
05、Java 基础硬核复习:数组的本质与面试考点
05、Java 基础硬核复习:数组的本质与面试考点第一部分:核心知识体系1. 数组概述数组是存储同类型数据的连续内存块,通过索引(下标)快速访问元素。其核心特点包括: 长度固定:创建后无法动态改变大小(需通过新建数组+复制实现扩容)。 类型一致:所有元素必须为同一数据类型(基本类型或引用类型)。 索引访问:通过 数组名[索引] 访问元素,索引从 0 开始。 2. 一维数组的基本使用(1)初始化方式 静态初始化:直接指定元素值,长度由元素个数决定。 1int[] arr1 = new int[]{1, 2, 3}; // 或简化为 int[] arr1 = {1, 2, 3}; 动态初始化:指定长度,元素默认初始化(如 int 类型默认为 0)。 1int[] arr2 = new int[3]; // arr2 = [0, 0, 0] (2)核心操作 长度:通过 数组名.length 获取(如 arr1.length 为 3)。 元素访问:通过索引访问(如 arr1[0] 为 1)。 遍历:使用 for 循环或 foreach(...
03、Java 基础硬核复习:流程控制语句的核心逻辑与面试考点
03、Java 基础硬核复习:流程控制语句的核心逻辑与面试考点第一部分:核心知识体系1. 分支结构分支结构主要用于根据条件选择性地执行代码。 if-else 结构 基本格式:需掌握三种形式,分别是单分支(if)、双分支(if...else)和多分支(if...else if...else)。 嵌套使用:可以在 if 语句内部再包含 if 语句,用于处理复杂的逻辑判断。思维导图中提到的典型案例是“三个数大小排序”。 switch-case 结构 主要用途:用于等值判断,即判断变量是否等于某个特定值。 对比理解:需理解其基本使用格式,并明确它与 if-else 的区别——switch 更适合多选一的场景。default用来保底。 2. 循环结构循环结构的核心在于掌握“循环四要素”:初始化、循环条件、循环体和迭代部分。 for 循环 特点:结构紧凑,循环变量通常在循环结束后即销毁。 适用场景:适用于循环次数确定的场景。 经典案例:水仙花数、最大公约数。 while 循环 特点:先判断,后执行。 适用场景:适用于循环次数不确定的场景。 经典案例:珠穆朗玛峰折纸问题、猜数...
02、Java 基础硬核复习:变量与运算符的“避坑”指南
02、Java 基础硬核复习:变量与运算符的“避坑”指南第一部分:核心基础知识体系1. Java 的 8 大基本数据类型Java 是强类型语言,牢记这 8 种类型及其占用的内存空间是基本功: 分类 类型 字节 默认值 注意点 整型 byte 1 0 参与运算时会自动提升为 int short 2 0 同上 int 4 0 整数默认类型 long 8 0L 定义时必须加后缀 L (如 100L) 浮点型 float 4 0.0f 定义时必须加后缀 F (如 3.14F) double 8 0.0d 小数默认类型,精度比 float 高 字符型 char 2 ‘\u0000’ 采用 Unicode 编码,可以存一个汉字 布尔型 boolean 1位* false 只有 true 和 false 注:boolean 在内存中的大小并未明确定义,依赖于 JVM 实现,通常单独使用时占 4 字节(当作 int 处理),数组时占 1 字节。 2. 类型转换规则 自动提升(隐式转换):小范围—–>大范围。 规则:byte、short...
01、Java基础入门:JDK、JRE、JVM关系详解及开发流程
01、Java基础入门:JDK、JRE、JVM关系详解及开发流程1. JDK, JRE, JVM 的关系(核心重点)它们是 包含关系,从下到上层层嵌套,共同支撑Java程序的运行与开发。 JVM (Java Virtual Machine):Java虚拟机 是Java程序的“运行引擎”,负责将字节码翻译成底层系统可执行的机器码。 核心作用是屏蔽操作系统差异,实现“一次编写,到处运行”(Write Once, Run Anywhere)。 单独存在无法运行程序,因为它缺少核心类库(如java.lang包)。 JRE (Java Runtime Environment):Java运行环境 公式:JRE = JVM + 核心类库 (Libs) 作用:提供运行Java程序所需的基础环境,包括JVM和标准类库。 适用场景:仅需要运行已编译的Java程序(如运行Minecraft客户端)。 JDK (Java Development Kit):Java开发工具包 公式:JDK = JRE + 开发工具 (javac, java, jdb等) 作用:为...
[AI 架构] 什么是 MCP?—— 大模型时代的“USB 接口”
[AI 架构] 什么是 MCP?—— 大模型时代的“USB 接口”自 2024 年底起,Anthropic(Claude 的母公司)推出的 MCP (Model Context Protocol) 逐渐成为连接 AI 与数据/工具的开放标准之一。如果你正在关注 AI 应用架构,或者正在探索如何让 AI 接入本地数据,那么 MCP 是你必须了解的核心概念。 一句话总结:MCP 是 AI 模型连接数据与工具的通用标准,就像计算机领域的 USB 接口。 1. 为什么我们需要 MCP?(痛点)在 MCP 出现之前,让 LLM(大语言模型)连接本地数据或第三方工具是一件非常痛苦的事,存在严重的**“点对点耦合”**问题: 以前的困境: 如果你想让 Claude 访问你的 Postgres 数据库,你需要写一套适配代码;如果你想让 ChatGPT 访问同一个数据库,你又要重写一套;如果你换了 IDE(比如从 VS Code 换到 Cursor),可能又要折腾一遍。 结果:开发者在做大量重复的“胶水代码”工作,数据孤岛严重。 MCP 的解决方案: MCP 定义了一套通用标准。...
Hexo 避坑指南:为什么 `hexo d` 后线上没有新文章?
Hexo 避坑指南:为什么 hexo d 后线上没有新文章?很多 Hexo 新手都会遇到这个“灵异现象”:明明写好了 Markdown 文章,本地跑 hexo s 预览一切正常,结果执行 hexo d 部署后,打开博客一看——文章没更新。甚至有时候还会疑惑:为什么 hexo clean && hexo g && hexo s 能看到新文章,但 hexo d 就不行? 答案其实很简单:hexo d 默认不负责生成静态文件,它只负责搬运。一、 原理解析:分工明确Hexo 的核心命令职责划分得很清楚: hexo g (Generate):厨师。把你的 Markdown 源文件“烹饪”成静态 HTML 文件,存放在 public 目录下。 hexo d (Deploy):快递员。把 public 目录里的东西打包发送到服务器(如 GitHub Pages)。问题出在哪?如果你只运行 hexo d,它只会把 public 里旧的文件发出去。除非你显式告诉它“先生成再部署”,否则它不会自动帮你执行 hexo g。这就是为什么: 本地 hexo s 能看到...
Hexo+GitHub Pages 源码隐私保护:两种最优实现方案
Hexo+GitHub Pages 源码隐私保护:两种最优实现方案用 Hexo 搭配 GitHub Pages 搭建博客时,很多人会遇到一个核心痛点:公共仓库无法单独隐藏某一个分支,如果把 Hexo 源码直接放在公开的 username.github.io 仓库,所有人都能看到你的源码、配置文件甚至未发布的内容。 分享两种成熟、易操作的解决方案,既能完美保护源码隐私,又不影响博客正常访问,适配不同使用习惯的同学。 方案一:双仓库模式(推荐/GitHub Pages 忠实用户首选)这是最贴合 Hexo+GitHub Pages 原有架构的方案,核心思路就是源码和静态网页分离存放,私有仓库存源码,公共仓库只放生成的博客页面。 核心配置 私有仓库(Private):存放 Hexo 全部源码(scaffold、source、themes、_config.yml 等核心文件),仅自己可见。 公共仓库(Public):即原有的 username.github.io,只存放 hexo d 生成后的静态文件(HTML/CSS/JS),供 GitHub Pages 部...




