当前位置: 首页 > news >正文

SQL 第一篇:CRUD 实战,从 user 表开始写接口

一、前言

学 SQL,第一步不要上来就研究复杂 JOIN、索引、事务。

先把最基础的 CRUD 打熟。

所谓 CRUD,就是:

Create → 新增 Read → 查询 Update → 修改 Delete → 删除

对应 SQL 就是:

INSERT SELECT UPDATE DELETE

后端开发里,大部分接口本质上都离不开这四类操作。


二、本篇目标

这一篇只围绕一张表:

user

目标很简单:

会新增用户 会查询用户 会修改用户 会删除用户

对应接口就是:

POST /user/register GET /user/{id} PUT /user/{id} DELETE /user/{id}

三、先准备 user 表

CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', username VARCHAR(64) NOT NULL UNIQUE COMMENT '用户名', password VARCHAR(128) NOT NULL COMMENT '密码', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' );

这张表先不要搞复杂。

字段含义:

字段含义
id用户唯一ID
username用户名
password密码
create_time创建时间
update_time更新时间

四、INSERT:新增用户

注册用户,本质就是插入一条数据。

INSERT INTO user(username, password) VALUES ('zhangsan', '123456');

解释一下:

INSERT INTO user(username, password)

表示往user表里的usernamepassword字段插入数据。

VALUES ('zhangsan', '123456')

表示具体插入的值。

执行后,数据库会自动生成:

id create_time update_time

因为这几个字段有默认规则。


五、SELECT:查询用户

根据 id 查询用户:

SELECT id, username, password, create_time, update_time FROM user WHERE id = 1;

重点是:

WHERE id = 1

它表示只查询id = 1的用户。

如果不写 WHERE:

SELECT * FROM user;

就是查询整张表。


六、UPDATE:修改用户

修改用户名:

UPDATE user SET username = 'lisi' WHERE id = 1;

这句 SQL 的意思是:

把 id = 1 的用户 username 改成 lisi

这里最重要的是:

WHERE id = 1

如果你忘了 WHERE:

UPDATE user SET username = 'lisi';

那就是把整张表所有用户都改了。

这是非常严重的事故。


七、DELETE:删除用户

根据 id 删除用户:

DELETE FROM user WHERE id = 1;

意思是:

删除 id = 1 的用户

同样,DELETE 一定要带 WHERE。

如果你写成:

DELETE FROM user;

就是清空整张表。


八、CRUD 和接口的关系

SQL 不是单独存在的。

在后端项目里,SQL 是为接口服务的。

比如:

接口SQL
POST /user/registerINSERT
GET /user/{id}SELECT
PUT /user/{id}UPDATE
DELETE /user/{id}DELETE

所以你学 CRUD,不是为了背语法,而是为了写接口。


九、Mapper 示例

如果用 MyBatis,可以这样写:

@Mapper public interface UserMapper { int insert(User user); User selectById(Long id); int updateById(User user); int deleteById(Long id); }

对应 XML 可以先这样写:

<mapper namespace="com.example.mapper.UserMapper"> <insert id="insert"> INSERT INTO user(username, password) VALUES (#{username}, #{password}) </insert> <select id="selectById" resultType="com.example.entity.User"> SELECT id, username, password, create_time, update_time FROM user WHERE id = #{id} </select> <update id="updateById"> UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id} </update> <delete id="deleteById"> DELETE FROM user WHERE id = #{id} </delete> </mapper>

十、Service 示例

@Service public class UserServiceImpl implements UserService { @Resource private UserMapper userMapper; @Override public String register(UserRegisterDTO dto) { User user = new User(); user.setUsername(dto.getUsername()); user.setPassword(dto.getPassword()); userMapper.insert(user); return "注册成功"; } @Override public User getById(Long id) { return userMapper.selectById(id); } @Override public String updateUser(Long id, UserUpdateDTO dto) { User user = new User(); user.setId(id); user.setUsername(dto.getUsername()); user.setPassword(dto.getPassword()); userMapper.updateById(user); return "修改成功"; } @Override public String deleteUser(Long id) { userMapper.deleteById(id); return "删除成功"; } }

十一、Controller 示例

@RestController @RequestMapping("/user") public class UserController { @Resource private UserService userService; @PostMapping("/register") public String register(@RequestBody UserRegisterDTO dto) { return userService.register(dto); } @GetMapping("/{id}") public User getById(@PathVariable Long id) { return userService.getById(id); } @PutMapping("/{id}") public String updateUser(@PathVariable Long id, @RequestBody UserUpdateDTO dto) { return userService.updateUser(id, dto); } @DeleteMapping("/{id}") public String deleteUser(@PathVariable Long id) { return userService.deleteUser(id); } }

十二、这一篇你必须记住的坑

1. UPDATE 必须带 WHERE

UPDATE user SET username = 'lisi' WHERE id = 1;

2. DELETE 必须带 WHERE

DELETE FROM user WHERE id = 1;

3. 不要直接 SELECT *

练习可以用:

SELECT * FROM user;

项目里更推荐写清楚字段:

SELECT id, username, create_time FROM user WHERE id = 1;

十三、一句话总结

CRUD 是后端开发的基本功,本质不是背 SQL,而是用 INSERT、SELECT、UPDATE、DELETE 支撑接口开发。


下一篇预告

下一篇进入:

SQL 第二篇:表结构设计

重点讲:

user / user_detail / user_address 三张表为什么这样设计

也就是从“会写 SQL”,进入“会设计表”。

http://www.jsqmd.com/news/753413/

相关文章:

  • 视频信号耦合技术:AC与DC耦合原理及应用对比
  • RoboMaster 2023赛季大能量机关识别:从OpenCV二值化到findContours轮廓分析,一个完整实战流程
  • 大众觉得投入资金越多生意越红火,编程统计创业投入金额与营收数据,验证小额轻资产创业回报率远超重资产模式。
  • 别再乱用include_directories了!CMake 3.x项目头文件管理,用target_include_directories更香
  • 【电力系统】中性点不接地、经消弧线圈接地发生单相接地故障Simulink仿真(仿真+说明报告)
  • 崩坏星穹铁道终极自动化指南:三月七小助手如何每天为你节省2小时?
  • 长期项目使用 Taotoken 按 token 计费带来的成本可控性
  • 别再死记硬背SDI速率了!用FPGA的GTX收发器实战解析SD-SDI到12G-SDI的时钟配置(附Xilinx 7系列工程)
  • 2026年4月防火型母线槽源头厂家口碑推荐,耐火型母线槽/封闭型母线槽/防火浇筑型母线槽,防火型母线槽供应商哪家专业 - 品牌推荐师
  • GL.iNet Comet KVM-over-IP远程控制方案评测与应用
  • 避坑指南:UniApp下载文件到手机本地,你可能遇到的3个平台兼容性问题与解决方案
  • ABAQUS新手避坑:薄板大变形分析,材料方向定义错了怎么办?
  • Python命令行工具:B站UP主更新监控与自动化查询实战
  • Arm处理器性能分析框架与优化实践
  • 多模态大语言模型的视觉推理优化与动态注意力机制
  • 从零实现ChatGLM对话模型:Transformer架构与自注意力机制详解
  • Spring Security 报错 Invalid JWT signature 怎么排查密钥问题?
  • 大模型基础(五):RAG入门-让大模型学会开卷考试
  • ROOT优化器:提升大规模语言模型训练稳定性的新技术
  • 传统认为节假日消费必定暴涨,编程统计历年节假日消费流水,测算部分行业节假日反而亏损,纠正大众消费固有认知。
  • 释放硬件潜能:Universal x86 Tuning Utility深度调校指南
  • 对比直接使用原厂 API 体验 Taotoken 在计费透明上的差异
  • STM32CubeIDE实战:用定时器中断+外部中断,做个能随时“掉头”的流水灯(附完整代码)
  • 3大核心功能深度解析:LOSEHU固件如何让泉盛UV-K5/K6对讲机焕然新生
  • Pandas入门避坑指南:从‘头歌’练习题到真实数据分析项目,我踩过的雷你别再踩
  • 从Deepin到统信UOS:给Linux老用户的专业版迁移与上手体验报告
  • C语言实现轻量级LLM推理框架:llmc的设计、优化与应用
  • 从IP集成到SoC设计:ARM AMBA ACE/CHI协议实战避坑指南(附真实项目经验)
  • 手把手教你用STM32F407外挂USB3320实现高速USB通信(附完整原理图与驱动思路)
  • 5分钟彻底告别Windows和Office激活烦恼:KMS智能激活工具终极指南