0%

1
2
startID=>start: 开始
startID->

graph TD
0((0)) --- 1((1)) --- 3((3))
1((1)) --- 4((4))
0((0)) --- 2((2))

MySQL 约束详解:保障数据完整性的六大机制

约束(Constraint)是 MySQL 中用于限制表中数据的规则,通过强制数据满足特定条件,确保数据库的完整性、一致性和准确性。MySQL 支持六大类约束,虽然部分约束在实现上有局限,但仍是设计可靠数据表的核心工具。

六大约束类型及作用

约束类型 作用描述 MySQL 支持情况
NOT NULL 限制字段值不能为 NULL(必须填写)。 完全支持
DEFAULT 为字段设置默认值,当插入数据时未指定该字段则使用默认值。 完全支持
PRIMARY KEY 主键约束,唯一标识表中的每行记录,要求字段值唯一且非空 完全支持(单字段或复合主键)
UNIQUE 唯一约束,保证字段值在表中唯一,但允许为 NULL(NULL 可重复)。 完全支持
CHECK 检查约束,限制字段值必须满足指定条件(如 age > 0)。 MySQL 8.0.16+ 支持,低版本仅语法兼容但不生效
FOREIGN KEY 外键约束,限制两个表的关系,确保从表字段值必须来自主表的关联字段。 支持,但需存储引擎为 InnoDB(MyISAM 不支持)

约束的使用方法

1. NOT NULL(非空约束)

确保字段必须有值,禁止插入 NULL

1
2
3
4
5
6
7
8
CREATE TABLE student (
id INT,
name VARCHAR(50) NOT NULL, -- 姓名不能为空
age INT NOT NULL DEFAULT 0 -- 年龄不能为空,默认值为 0
);

-- 插入数据时未指定 name 会报错
INSERT INTO student (id) VALUES (1); -- 错误:Column 'name' cannot be null

2. DEFAULT(默认约束)

为字段设置默认值,简化插入操作(未指定字段时自动填充)。

1
2
3
4
5
6
7
8
9
10
CREATE TABLE employee (
id INT,
name VARCHAR(50) NOT NULL,
department VARCHAR(30) DEFAULT '未知部门', -- 默认部门
hire_date DATE DEFAULT CURRENT_DATE() -- 默认值为当前日期
);

-- 插入时未指定 department 和 hire_date,将使用默认值
INSERT INTO employee (id, name) VALUES (1, '张三');
-- 结果:department 为 '未知部门',hire_date 为插入当天日期

3. PRIMARY KEY(主键约束)

主键是表的 “唯一标识符”,具有以下特性:

阅读全文 »

Spring MVC 模型数据处理详解:4 种核心方式与错误处理

在 Spring MVC 开发中,将业务数据传递到视图(如 JSP、Thymeleaf)是核心需求之一。Spring MVC 提供了 ModelAndView、Map/Model、@SessionAttributes、@ModelAttribute 四种灵活的模型数据处理方式,覆盖从 “单次请求数据传递” 到 “跨请求数据共享” 的全场景。从 “数据传递原理→使用场景→实战示例” 三个维度,彻底讲透模型数据的处理逻辑。

核心概念:模型数据的本质

Spring MVC 中的 “模型数据” 本质是 键值对(Key-Value),存储在 ModelModelMap 中,最终会通过 HttpServletRequest.setAttribute() 绑定到请求域(Request Scope),视图技术(如 JSP 的 EL 表达式 ${key})可直接访问这些数据。

  • 作用域分类:
    1. 请求域(Request Scope):数据仅在当前请求有效(默认,如 ModelAndView、Map 传递的数据);
    2. 会话域(Session Scope):数据在当前用户会话中有效(需通过 @SessionAttributes 显式设置)

方式 1:ModelAndView —— 视图与数据的统一载体

ModelAndView 是 Spring MVC 早期最常用的模型数据处理方式,同时封装 “视图信息” 和 “模型数据”,适合需要明确指定视图且传递数据的场景。

1. 核心原理与源码解析

ModelAndView 内部维护两个核心变量,分别对应 “视图” 和 “数据”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ModelAndView {
// 视图:支持两种类型——1. 逻辑视图名(String,如 "hello");2. 具体 View 对象(如 InternalResourceView)
private Object view;
// 模型数据:本质是 ModelMap(继承自 LinkedHashMap,有序存储键值对)
private ModelMap model;

// ------------------------------ 视图相关方法 ------------------------------
// 设置逻辑视图名(最常用)
public void setViewName(String viewName) {
this.view = viewName;
}
// 获取逻辑视图名
public String getViewName() {
return this.view instanceof String ? (String) this.view : null;
}

// ------------------------------ 模型数据相关方法 ------------------------------
// 获取模型(懒加载,第一次调用时初始化 ModelMap)
public ModelMap getModelMap() {
if (this.model == null) {
this.model = new ModelMap();
}
return this.model;
}
// 添加模型数据(键值对)
public ModelAndView addObject(String attributeName, Object attributeValue) {
this.getModelMap().addAttribute(attributeName, attributeValue);
return this; // 链式调用,支持连续 addObject
}
// 重载方法:省略键名,Spring 自动生成键名(如 User 对象→键名 "user")
public ModelAndView addObject(Object attributeValue) {
this.getModelMap().addAttribute(attributeValue);
return this;
}
}
阅读全文 »