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",进入"会设计表"。

相关推荐
小江的记录本2 小时前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq
.小小陈.2 小时前
MySQL 核心基础:数据类型与表约束全解析
数据库·mysql
KmSH8umpK2 小时前
Redis分布式锁进阶第十二篇
数据库·redis·分布式
hERS EOUS2 小时前
MySQL 函数
数据库·mysql
gQ85v10Db2 小时前
Redis分布式锁进阶第十六篇:番外高阶避坑篇 + 隐性埋点锁故障深挖 + 疑难杂症终极兜底方案
数据库·redis·分布式
S1998_1997111609•X2 小时前
论恶意注入污染蜜罐进程函数值取仺⺋以集团犯罪获取数据爬虫的轮系依据
网络·数据库·爬虫·网络协议·百度
许彰午3 小时前
# 从OOM到根治的完整过程——导出大数据的应急、根因分析与游标方案
java·大数据·数据库·系统架构
eLIN TECE3 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
曾几何时`3 小时前
MySQL(七)索引
数据库·mysql