0%

MySQL 数据删除:DELETE 与 TRUNCATE 的区别及应用场景

在 MySQL 中,删除表数据主要有 DELETETRUNCATE 两种方式,二者虽都能清除数据,但在功能、性能和底层实现上有显著差异。本文详细解析两者的区别,帮助你根据场景选择合适的删除方式。

基本语法

1. DELETE 语句

用于删除表中满足条件的部分或全部数据,支持 WHERE 子句精确筛选:

1
2
3
4
5
-- 删除满足条件的行
DELETE FROM 表名 WHERE 条件;

-- 删除全表数据(不推荐,效率低)
DELETE FROM 表名;

2. TRUNCATE 语句

用于删除表中所有数据,无法指定条件,等价于 “清空表”:

阅读全文 »

Spring MVC 数据绑定详解:从流程到自定义类型转换

Spring MVC 的数据绑定机制是连接 HTTP 请求与业务方法参数的核心桥梁,它自动将请求中的参数(如 URL 路径、表单、请求头)转换为业务方法所需的 Java 类型(如 IntegerUser 自定义对象),并支持数据校验。从 “数据绑定全流程→核心组件 ConversionService→自定义类型转换器” 三个维度,彻底讲透数据绑定的实现原理与实践。

数据绑定核心流程:从请求参数到方法入参

Spring MVC 数据绑定的本质是 “将 Servlet 请求信息转换为目标方法入参对象”,整个流程由 WebDataBinder 主导,配合 ConversionService(类型转换)和 Validator(数据校验)完成,共 4 个关键步骤:

步骤 1:创建 DataBinder 实例

  • 触发点:DispatcherServlet 调用 HandlerAdapter(如 RequestMappingHandlerAdapter)后,HandlerAdapter 会获取 WebDataBinderFactory 实例;
  • 核心操作WebDataBinderFactory 根据当前请求 ServletRequest 和目标方法入参类型,创建 DataBinder 实例(默认实现 ServletRequestDataBinder);
  • DataBinder 作用:作为数据绑定的 “工作器”,负责后续的参数提取、类型转换、数据校验。

步骤 2:DataBinder 提取请求参数并转换类型

  • 参数提取DataBinderServletRequest 中提取请求参数(如 request.getParameter("username")、URL 路径参数、JSON 请求体);
  • 类型转换DataBinder 调用 ConversionService,将提取的字符串参数转换为目标入参类型(如将请求中的 "2024" 转换为 Integer,将 "1:zhangsan" 转换为 User 对象);
  • 参数填充:转换后的参数值被填充到目标入参对象中(如 User 对象的 idname 字段)。

步骤 3:Validator 进行数据合法性校验

  • 校验触发:若目标入参对象添加了校验注解(如 @NotNull@Size),DataBinder 会调用 Spring 上下文的 Validator 组件(默认 LocalValidatorFactoryBean)进行校验;
  • 校验结果:校验结果被封装到 BindingResult 对象中,包含 “校验通过 / 失败” 状态和错误信息(如 “用户名长度不能小于 3”)。

步骤 4:绑定结果传递给目标方法

  • 参数注入:Spring MVC 将 “转换后的入参对象” 和 “BindingResult 校验结果” 注入到目标业务方法的参数中;
  • 开发者处理:开发者可通过 BindingResult 判断校验结果,若有错误则返回错误页面或提示,若无错误则执行业务逻辑。
流程总结(简化)
阅读全文 »

MySQL LIKE 模糊查询与通配符使用详解

在 MySQL 中,LIKE 运算符结合通配符可实现灵活的模糊查询,适用于根据部分字符匹配查找数据的场景(如搜索用户名、关键词等)。本文详细讲解 LIKE 的用法、通配符规则及注意事项。

基本语法

1
2
3
SELECT <字段列表>
FROM <表名>
WHERE <字段名> LIKE <匹配模式>;
  • LIKE 用于判断字段值是否与指定的 “匹配模式” 相符。
  • 匹配模式需结合通配符使用,否则等价于 = 运算符(如 name LIKE '张三' 等价于 name = '张三')。

通配符类型及用法

MySQL 支持两种通配符,用于构建匹配模式:

1. %:匹配任意多个字符(包括 0 个)

  • 表示 “任意长度的任意字符”(字母、数字、符号等均可)。
  • 可放在模式的任意位置(开头、中间、结尾)。
示例:
1
2
3
4
5
6
7
8
9
10
11
-- 1. 字段值包含 'a'(无论位置)
SELECT * FROM user WHERE name LIKE '%a%';
-- 匹配:'a'、'ab'、'ba'、'abc'、'xay' 等

-- 2. 字段值以 'a' 开头
SELECT * FROM user WHERE name LIKE 'a%';
-- 匹配:'a'、'ab'、'abc' 等,不匹配 'ba'

-- 3. 字段值以 'a' 结尾
SELECT * FROM user WHERE name LIKE '%a';
-- 匹配:'a'、'ba'、'cba' 等,不匹配 'ab'

2. _:匹配任意单个字符

  • 表示 “恰好一个任意字符”(必须有且仅有一个)。
示例:
阅读全文 »

LinkedList 源码深度解析(基于 JDK 8)

LinkedList 是 Java 集合框架中另一种重要的 List 实现类,基于双向链表实现,与 ArrayList 形成互补:ArrayList 擅长随机访问,而 LinkedList 擅长插入和删除操作。本文将从继承关系、链表结构、核心方法及迭代器实现等方面,全面解析 LinkedList 的工作原理。

LinkedList 核心特性与继承关系

核心特性

  • 有序性:元素按插入顺序存储,支持通过索引访问(但效率低于 ArrayList)。
  • 可重复性:允许存储重复元素和 null 值。
  • 双向链表:底层通过节点的前驱(prev)和后继(next)指针维护元素关系,无需连续内存空间。
  • 非线程安全:多线程并发修改可能导致数据不一致(需手动同步或使用并发容器)。
  • 实现 Deque 接口:支持作为队列(FIFO)、栈(LIFO)或双向队列使用,提供丰富的首尾操作方法。

继承关系

LinkedList

1
2
3
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
  • 继承 AbstractSequentialList:复用了顺序访问集合的基础实现(如 getadd 等依赖迭代器的方法)。
  • 实现 List:遵循 List 接口规范,支持列表的基本操作。
  • 实现 Deque:支持双端队列操作(如 addFirstpollLast 等),可作为队列或栈使用。
  • 实现 Cloneable:支持克隆(浅拷贝,节点引用被复制,但元素对象本身不复制)。
  • 实现 Serializable:支持序列化,通过自定义 writeObjectreadObject 方法优化序列化过程。

核心结构:双向链表与节点

LinkedList 的核心是双向链表,由节点(Node)组成,每个节点包含元素值、前驱节点和后继节点的引用。

节点类(Node

1
2
3
4
5
6
7
8
9
10
11
12
private static class Node<E> {
E item; // 节点存储的元素
Node<E> next; // 后继节点引用
Node<E> prev; // 前驱节点引用

// 构造器:初始化前驱、元素、后继
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

核心变量

1
2
3
transient int size = 0;         // 链表长度(元素数量)
transient Node<E> first; // 头节点(首元素)
transient Node<E> last; // 尾节点(末元素)
阅读全文 »

ArrayList 源码深度解析(基于 JDK 8)

ArrayList 是 Java 集合框架中最常用的 List 实现类,基于动态数组实现,支持自动扩容,适用于频繁查询、少量增删的场景。本文将从继承关系、核心源码、扩容机制、迭代器实现等方面,全面解析 ArrayList 的工作原理。

ArrayList 核心特性与继承关系

核心特性

  • 有序性:元素按插入顺序存储,支持通过索引访问(0 基索引)。
  • 可重复性:允许存储重复元素,也允许存储 null 值。
  • 动态扩容:底层数组容量不足时自动扩容,无需手动管理大小。
  • 非线程安全:多线程环境下并发修改可能导致数据不一致(需手动同步或使用 CopyOnWriteArrayList)。

继承关系

ArrayList

1
2
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  • 继承 AbstractList:复用了 List 接口的部分默认实现(如 addAllindexOf 等)。
  • 实现 List:遵循 List 接口规范,支持列表的基本操作。
  • 实现 RandomAccess:标记接口,表明支持快速随机访问(通过索引直接访问,时间复杂度 O(1)),遍历此类集合时,普通 for 循环效率高于迭代器。
  • 实现 Cloneable:支持克隆(浅拷贝)。
  • 实现 Serializable:支持序列化,可通过流传输。

核心变量解析

ArrayList 的核心功能依赖于以下变量,决定了其存储方式和扩容行为:

阅读全文 »