MySQL笔记·第2篇:MySQL外键——阿里巴巴为什么禁止使用?外键的坑与替代方案
一、外键是什么? 简单说,外键就是用来保证“两张表的数据能对上”。比如订单表的user_id必须指向用户表里存在的id。 1FOREIGN KEY (user_id) REFERENCES user(id) 加了外键,数据库会自动帮你检查:插入订单时,用户必须存在;删除用户时,要么拒绝,要么连带删订单。 听起来很完美,对吧?那为什么阿里巴巴开发手册明确写着“不得使用外键”?这篇文章讲清楚外键的坑和替代方案 二、为什么不推荐用外键? 外键像个负责任的保安,每次有人进出都查证件——安全是安全了,但门口排起了长队。 1. 性能损耗 每次插入、更新、删除订单,数据库都要去user表查一下这个user_id存不存在。这条select语句看着简单,但在高并发下,数据库累死。 一个订单操作变成:插入订单 + 查询用户。数据库要多干一份活。 2. 分库分表不友好 外键只能在一个数据库实例内生效。 业务大到一定程度,user表在一台机器,orders表在另一台机器。外键直接废了,代码还得大改——把所有数据完整性检查从数据库搬到代码里。 与其到时候哭着改代码,不如一开始就别用外键。 3. 耦合太紧 ...
MyBatis入门系列(三):动态 SQL 完全指南:告别硬编码,一个方法搞定所有查询
MyBatis 动态 SQL 完全指南:告别硬编码,一个方法搞定所有查询一、为什么需要动态 SQL?在真实项目中,一个查询接口往往要支持多种条件组合:比如用户列表页,可以按姓名模糊查询、按年龄精确查询、两者组合查询,或者什么都不填查询全部。如果用硬编码写 SQL,你可能需要写 4 个不同的方法,代码臃肿且难维护。 动态 SQL 让你在 XML 中根据传入的参数“智能拼接” SQL 语句,一个方法搞定所有情况。 二、核心标签一览 标签 作用 类比 <if> 条件判断,满足时才拼 SQL 片段 Java 中的 if <where> 自动处理 WHERE 关键字和多余的 AND/OR 智能的 WHERE 生成器 <set> 动态生成 SET 子句,自动去掉末尾逗号 智能的 SET 生成器 <choose>/<when>/<otherwise> 多选一,只执行第一个满足的条件 Java 中的 switch <foreach> 遍历集合,生成 IN 子句或批量 VALUE...
MySQL笔记·第4篇:多表查询详解——内连接、左连接、自连接一篇搞定
一、多表查询是什么?简单来说,在实际的项目管理中,数据库的查询不仅仅是查询一张表的数据,是两张或两张以上的表,这时候是要用到多表查询。 我们在这建立两张表,一张是学生表,记录学生的学号和姓名,一张是成绩表,记录学生的成绩。接下来用这两张表为例,讲解多表查询。 1234567891011121314-- 学生表CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50));INSERT INTO student VALUES (1, '张三'), (2, '李四'), (3, '王五');-- 成绩表CREATE TABLE score ( id INT PRIMARY KEY, student_id INT, score INT);INSERT INTO score VALUES (1, 1, 90), (2, 1, 85), (3, 2, 78); 用表格表示如下: student表 score表 id name ...
MySQL笔记·第1篇:DDL、DML、DQL、DCL一篇搞定
SQL(Structured Query Language)结构化查询语言,主要分为四大类别:DDL(数据定义语言)、DML(数据操作语言)、DQL(数据查询语言) 和 DCL(数据控制语言)。 一、数据定义语言 DDL(Data Definition Language)用途:用来定义数据库对象(数据库、表、字段)。 1、数据库操作查询所有数据库1SHOW DATABASES; 查询当前数据库1SELECT DATABASE(); 创建数据库1CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集 ] [ COLLATE 排序规则 ]; 说明:在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。使用 IF NOT EXISTS 可避免重复创建。 示例: 1CREATE DATABASE IF NOT EXISTS itcast; 删除数据库1DROP DATABASE [ IF EXISTS ] 数据库名; 切换数据库1USE 数据库名; 2、表操作A、查询与创建查询当前数据库所有表1...
Spring Boot 从零入门:请求响应、三层架构与 IOC、DI 实践总结
Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结 1. 项目搭建与第一个接口使用 IDEA 的 Spring Initializr 创建项目,依赖仅选择 Spring Web。启动类 HttpStuApplication 自动生成。在 controller 包下创建 HelloController: 1234567@RestControllerpublic class HelloController { @RequestMapping("/hello") public String sayHello() { return "Hello, 请求响应学习开始!"; }} 运行后浏览器访问 http://localhost:8080/hello,输出文本 —— 标志着环境验证通过。 2. 请求响应:参数接收全解析2.1 哪些参数必须掌握? 优先级 参数类型 注解 使用频率 🔥 必须掌握 简单参数 @RequestPara...
MySQL笔记-第3篇:一篇搞懂事务、ACID和隔离级别
一、事务是什么?简单来说,事务就是把完成同一目标的多个SQL操作打包成一个整体,举个例子:你给朋友转账100块。 对于熟悉SQL的我们来说,这个需求很快就可以完成。 12UPDATE account SET money = money - 100 WHERE id = 1; -- 你扣钱UPDATE account SET money = money + 100 WHERE id = 2; -- 朋友加钱 在实际的SQL运行环境中,如果第一个UPDATE执行完了,第二个还没执行,系统崩了,结果你的钱扣了,但朋友没收到。为了解决这一问题,我们提出的事务的概念。 简单来说,事务就是把完成同一目标的多个SQL操作打包成一个整体。在这个场景中,就是把转钱这一目标打包成一个整体,这两个操作要么都成功,要么都失败,不允许中间状态。 这样就不会出现钱丢了的故障。 二、怎么用? 123456START TRANSACTION; -- 开启事务UPDATE account SET money = money - 100 WHERE id = 1;UPDATE accoun...
搞懂Spring Boot登录认证:从UUID到JWT,一次完整的架构推演
从UUID到JWT再到Filter/Interceptor:Spring Boot登录认证进阶之路这篇文章要带你从零实现一个Spring Boot登录接口,并一步步将它从“临时UUID令牌”演变成无状态的JWT,再通过Filter → Interceptor → 统一异常处理,最终得到一个规范、可维护的认证架构。我们不依赖前端,只使用IDEA内置的HTTP Client做所有测试。所有代码都会给出,你可以复制即用。 1. 基础登录:模拟数据 + UUID令牌我们先从最简单的入手:接收用户名密码,验证后返回一个临时令牌。所有用户数据先用HashMap硬编码在内存里,令牌就用UUID随机生成。 1.1 项目结构12345678910111213141516171819src/main/java/com/example/demo├── DemoApplication.java // 启动类├── config│ └── WebConfig.java // 配置拦截器、跨域等├── con...












