一、前言
学 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 表里的 username 和 password 字段插入数据。
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",进入"会设计表"。