尚庭公寓项目第一天

一、项目开发流程

1、开发流程

第一步 产品根据市场调研的结果,设计产品效果图(原型)

第二步 UI设计师(美工)把产品原型开发成可以交互的静态页面(html页面)

第三步 架构师设计数据库架构定义接口

第四步 根据数据库和功能接口,编写代码实现功能

第五步 进行功能的测试

第六步 运维人员项目部署,后期维护

2、接口设计原则

2.1 什么是接口

  • 这里的接口不是interface
  • 功能接口 指的是开发controller service mapper过程

2.2 接口设计原则

  • 一般来讲,接口根据业务需求进行设计的

  • 通俗来讲,根据表进行接口设计

  • 举例,比如有users用户表

对这个用户表可以进行curd操作,所以设计接口时候,

1 查询接口

2 添加接口

3 修改接口

4 删除接口

2.3 接口文档

  • 一般来讲,为了开发方便,实际编写接口文档

  • 接口文档一般包含:

1 功能描述,比如保存用户信息

2 接口请求地址,比如/user/add

3 请求方式,比如 POST

4 请求参数,比如 {“id”:1,”name”:”zhangsan”}

5 响应结果

{
"code": 0,
"message": "",
"data": {},
"ok": true
}

二、尚庭公寓功能和技术

1 项目概述

  • 尚庭公寓项目是租赁类项目,项目采用前后端分离的模式,包含两个系统 用户移动端 和 后台管理端

    通俗来讲,用户移动端是用户使用的,后台管理端是管理员使用的

  • 项目主要包含的技术

SpringBoot 、MyBatisPlus、MySQL、Redis、MinIO

三、数据库如何设计

1、ER图

ER图:实体(Entity)关系(Relationship)模型

image-20250523102429314

image-20250523102917680

第一步 确定要创建哪些表(实体)

第二步 确定表与表之间关系(实体之间关系)

第三步 确定每个表(实体)的属性及其类型(表里面有哪些字段)

最终效果:

image-20250523103425036

2、总结数据库设计

第一步 确定要创建哪些表(实体)

第二步 确定表与表之间关系(实体之间关系)

第三步 确定每个表(实体)的属性及其类型(表里面有哪些字段)

第四步 (阿里开发手册约定)要求每个表必须有主键,要求表必须有三个字段:主键id,创建时间,修改时间

3、ER图工具介绍

  • draw.io

4、表与表关系创建方式

4.1 一对多

  • 在多的那一方创建字段,指向一的主键

image-20250523105708635

4.2 多对多

  • 创建第三张表,在第三张表至少有两个字段,这两个字段分别指向两个表主键

image-20250523111830453

4.3 一对一

image-20250523112144497

四、搭建项目软件环境

1、概述

  • 实际开发中,项目中运行软件服务都是在Linux系统中
  • 因为实际在Linux系统中安装软件,都是使用Docker
  • 今天临时安装在windows里面

2、需要软件环境

第一个 MySQL

第二个 Redis(windows版本)

  • 首先,资料找到redis安装压缩文件

image-20250523141237958

  • 其次,解压到没有中文和空格的目录,就可以了
  • 在目录里面找到redis-server.exe,直接双击启动

image-20250523141348941

image-20250523141458038

  • 使用客户端连接工具,进行测试

image-20250523141636400

第三个 MinIO

  • 对象存储是用于存储非结构化数据的数据存储架构

  • 可以使用MinIO存储文件(图片)

  • 第一步,在资料里面找到文件 minio.exe

image-20250523142138929

  • 第二步,把minio.exe放到没有中文和空格目录里面

  • 第三步,创建空文件夹,名称不要有中文和空格(最好和minio.exe放一起)

  • **第四步,在minio.exe所在目录中,使用cmd打开,执行命令 ** minio.exe server D:\minio\data

image-20250523142626022

五、MyBatis Plus入门

1 复习

  • 之前学习过MyBatis,底层使用JDBC,对JDBC进行封装,方便操作数据库

  • MyBatis基本过程

第一步 引入依赖

第二步 配置数据库

第三步 创建Mapper的interface接口

第四步 创建MyBatis配置文件

  • 如何使用原生MyBatis基本curd操作,还需要编写简单sql语句

  • 出现新的框架 MyBatis Plus,可以让MyBatis更加简单

2 MyBatis Plus概述

  • 官网: baomidou.com

  • MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

  • MyBatis-Plus特性:

使用很少的代码实现单表大部分 CRUD 操作

内置分页插件

内置代码生成器

如果多表或者复杂查询操作,还是需要编写sql语句实现

  • 我们尚庭公寓项目使用MyBatis-Plus来操作MySQL数据库

3 入门案例

第一步 创建数据库,创建表,添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建数据库
create database mybatis0312;

# 创建表
CREATE TABLE `user`
(
id BIGINT NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);

# 向表插入数据
INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

第二步 创建SpringBoot工程,引入MyBatisPlus依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.atguigu</groupId>
<artifactId>mybatisplus_demo</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.12</version>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

第三步 创建配置文件,配置数据库信息

1
2
3
4
5
6
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatis0312?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8

第四步 创建Spring Boot 启动类

1
2
3
4
5
6
7
8
@SpringBootApplication
@MapperScan("com.atguigu.mp.mapper")
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}

第五步 创建实体类

1
2
3
4
5
6
7
8
@Data  //lombok生成set get等方法
@TableName("`user`") //使用这个注解实体类对应表名称
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}

第六步 编写mapper接口类

1
2
3
public interface UserMapper extends BaseMapper<User> {

}

第七步 进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootTest
public class MpTest {

@Autowired
private UserMapper userMapper;

//查询表所有记录
@Test
public void demo1() {
List<User> list = userMapper.selectList(null);
list.forEach(user -> {
System.out.println(user.getName());
});
}
}

4、mp支持主键策略(了解)

image-20250523155852109

5、使用mp实现添加操作

1
2
3
4
5
6
7
8
9
10
11
//2 添加数据
@Test
public void addUser() {
User user = new User();
user.setName("zhangsan");
user.setAge(20);
user.setEmail("aaa@atguigu.com");
//调用insert方法,传入数据对象
int rows = userMapper.insert(user);
System.out.println(rows);
}
  • 发现一个细节问题
  • 每次添加的数据里面主键id值,每次唯一的,后面的比前面大

image-20250523162006570

总结

  • mp默认使用主键增长策略,是生成唯一的数字值,后面比前面大
  • 在mp默认配置是

image-20250523162155662

6、使用mp实现修改操作

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void updateUser() {
//第一步 根据id查询原始数据
User user = userMapper.selectById(1);

//第二步 设置修改的值
user.setAge(60);

//第三步 调用方法进行修改
int rows = userMapper.updateById(user);
System.out.println(rows);
}

7、使用mp实现删除操作

7.1 概述

  • 删除分为两种方式:物理删除 和 逻辑删除

  • **物理删除:**表里面数据真正没有了

  • **逻辑删除:**表里面数据还存在,但是查询不出来了

7.2 逻辑删除

image-20250523164118260

第一步 在表添加字段

image-20250523164354154

ALTER TABLE USER ADD deleted INT DEFAULT 0 ; # int 类型 1 逻辑删除 0 未逻辑删除

第二步 在表对应实体类添加字段属性

  • 属性添加逻辑删除注解 @TableLogic
1
2
3
4
//这个注解mp封装逻辑删除功能,约定这个注解的字段 ,
// 默认 逻辑删除值为1 未逻辑删除 0
@TableLogic
private Integer deleted;

第三步 测试

1
2
3
4
5
//4 删除方法
@Test
public void deleteUser() {
int i = userMapper.deleteById(1);
}

8、MyBatisPlus总结

1 使用mp核心部分

是创建interface类,继承BaseMapper

1
2
public interface UserMapper extends BaseMapper<User> {
}

2 使用mp实现查询(查询所有)

  • 调用mp封装的方法selectList(null)
  • null表示没有条件
1
List<User> list = userMapper.selectList(null);

3 使用mp实现添加操作

  • 调用mp封装的方法insert(对象)
  • 方法调用返回影响行数
1
int rows = userMapper.insert(user);
  • mp进行添加操作,默认有主键id生成策略ASSIGN_ID
  • ASSIGN_ID特点:生成唯一数字值,后面比前面大
1
2
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;

4 使用mp实现修改操作

  • 修改有两步
  • 首先,根据id查询,selectById(id值)
  • 其次,设置值,调用方法修改updateById(对象)
1
2
3
4
5
6
7
8
9
//第一步 根据id查询原始数据
User user = userMapper.selectById(1);

//第二步 设置修改的值
user.setAge(60);

//第三步 调用方法进行修改
int rows = userMapper.updateById(user);
System.out.println(rows);

5 使用mp实现删除

  • 物理删除:真正删除了

  • 逻辑删除:数据还在,但是查询不出来了,使用标志位表,比如约定0没有删除,1已经删除

  • 在mp只需要在逻辑删除字段添加注解就可以了

1
2
3
4
//这个注解mp封装逻辑删除功能,约定这个注解的字段 ,
// mp默认 逻辑删除值为1 未逻辑删除 0
@TableLogic
private Integer deleted;
1
int i = userMapper.deleteById(1);