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 表

sql 复制代码
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:新增用户

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

sql 复制代码
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 查询用户:

sql 复制代码
SELECT id, username, password, create_time, update_time
FROM user
WHERE id = 1;

重点是:

复制代码
WHERE id = 1

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

如果不写 WHERE:

sql 复制代码
SELECT * FROM user;

就是查询整张表。


六、UPDATE:修改用户

修改用户名:

sql 复制代码
UPDATE user
SET username = 'lisi'
WHERE id = 1;

这句 SQL 的意思是:

复制代码
把 id = 1 的用户 username 改成 lisi

这里最重要的是:

复制代码
WHERE id = 1

如果你忘了 WHERE:

sql 复制代码
UPDATE user
SET username = 'lisi';

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

这是非常严重的事故。


七、DELETE:删除用户

根据 id 删除用户:

sql 复制代码
DELETE FROM user
WHERE id = 1;

意思是:

复制代码
删除 id = 1 的用户

同样,DELETE 一定要带 WHERE。

如果你写成:

sql 复制代码
DELETE FROM user;

就是清空整张表。


八、CRUD 和接口的关系

SQL 不是单独存在的。

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

比如:

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

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


九、Mapper 示例

如果用 MyBatis,可以这样写:

java 复制代码
@Mapper
public interface UserMapper {

    int insert(User user);

    User selectById(Long id);

    int updateById(User user);

    int deleteById(Long id);
}

对应 XML 可以先这样写:

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 示例

java 复制代码
@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 示例

java 复制代码
@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

sql 复制代码
UPDATE user
SET username = 'lisi'
WHERE id = 1;

2. DELETE 必须带 WHERE

sql 复制代码
DELETE FROM user
WHERE id = 1;

3. 不要直接 SELECT *

练习可以用:

sql 复制代码
SELECT * FROM user;

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

sql 复制代码
SELECT id, username, create_time
FROM user
WHERE id = 1;

十三、一句话总结

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


下一篇预告

下一篇进入:

SQL 第二篇:表结构设计

重点讲:

复制代码
user / user_detail / user_address 三张表为什么这样设计

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

相关推荐
东北小狐狸-Hellxz10 小时前
Redis 哨兵搭建+ACL权限控制
数据库·redis
研究员子楚11 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
CoderMeijun11 小时前
一条SQL查询语句在MySQL中是如何执行的
mysql·sql执行流程·连接器·mysql架构·索引下推·执行器
l1340620823512 小时前
鸿蒙实战:RDB 数据库设计与 DatabaseService
数据库·华为·harmonyos·鸿蒙系统
山峰哥12 小时前
数据库工程与索引策略实战指南‌
服务器·数据库·sql·oracle·深度优先
谙忆12 小时前
图片版权保护工程实战:明水印、盲水印(DCT隐写)、Referer防盗链与签名URL怎么落地
数据库
KaMeidebaby13 小时前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
xfhuangfu13 小时前
19c CDB架构下的数据库启动和停止
数据库·架构
神道君天下13 小时前
填充与积累:积分与面积的可视化
数据库·oracle
爱折腾的小黑牛13 小时前
小程序云开发数据模型设计:礼账系统的三表结构
数据库·架构