从零创建后端项目,实现CRUD接口
目标:从零创建后端项目,实现用户 CRUD 接口
环境:JDK17、Maven、IDEA、MySQL8、SpringBoot3
一、创建 SpringBoot 项目
IDEA 新建项目
1.文件 → 新建 → 项目,选择Spring Initializr
2.项目元信息
- 组:com.example
- 工件:secd_new
- java版本:17(和本机jdk版本一致)
3.选择依赖
- Spring Web(web 开发,写接口用)
- MyBatis‑Plus Spring Boot Starter(mybatis‑plus 简化数据库操作)
- MySQL Driver(mysql 数据库驱动)
- Lombok(简化实体类,省去手写 get、set、toString)
原理:
Spring Initializr 帮我们生成 Maven 项目骨架,自动把依赖写到pom.xml。pom.xml是 Maven 配置文件,所有 jar 包都在这里管理,不需要手动下载 jar。
Lombok:编译阶段自动生成 get/set,代码更简洁;IDEA 必须安装 Lombok 插件,否则代码报错。
项目目录结构讲解
src └── main ├── java/com/example/secd_new# Java源代码│ ├── SecdNewApplication.java# 项目启动类,main方法,整个程序入口│ ├── controller# 控制器:接收浏览器/前端请求│ ├── entity# 实体类:和数据库表一一对应│ ├── mapper# Mapper接口:数据库交互│ └──service# 业务层(后面写)└── resources └── application.yml# 项目配置文件,数据库、mybatis‑plus配置原理:
SecdNewApplication上面有@SpringBootApplication,代表这是 SpringBoot 启动入口,运行 main 方法就启动整个 web 服务。- SpringBoot 默认自动扫描启动类同包以及子包下面所有类,所以 controller、entity、mapper 必须放在启动类的子包下面,否则组件不生效
创建数据库和表
打开 Navicat,新建数据库,例如demo_db
执行建表 SQL
createtablet_user(idbigintprimarykeyauto_increment,namevarchar(50),ageint);--插入测试数据insertintot_user(name,age)values('小明',18),('小红',24),('小李',28),('小周',17),('小张',22);原理:
bigint对应 Java 的Long,不能用 Integer,类型不匹配查询报错。- auto_increment:主键自增,新增数据不用手动传 id,数据库自动生成。
修改 application.yml 配置文件
把默认的application.properties删掉,新建application.yml
spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/demo_db?useSSL=false&serverTimezone=Asia/Shanghaiusername:rootpassword:你的mysql密码mybatis-plus:configuration:map-underscore-to-camel-case:true#下划线转驼峰 t_user → tUser原理:
- spring.datasource:告诉 SpringBoot 如何连接 MySQL 数据库:地址、库名、账号密码。
map‑underscore‑to‑camel‑case:数据库字段带下划线,Java 实体驼峰命名自动映射,不用手动写映射。- yml 格式注意:冒号后面必须有空格,缩进严格,缩进错配置直接失效。
编写 Entity 实体类 entity/User.java
packagecom.example.secd_new.entity;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;@Data@TableName("t_user")//绑定数据库哪一张表publicclassUser{@TableId(type=IdType.AUTO)//主键自增privateLongid;privateStringname;privateIntegerage;}@Data:lombok 注解,编译自动生成 get、set、toString。@TableName("t_user"):指定对应数据库表名;如果实体类名和表名完全一致可以省略。@TableId(type = IdType.AUTO):标记主键,告诉数据库主键自增。- id 用
Long,数据库 bigint 必须对应 Long。
Mapper 接口 Mapper/UserMapper.java
packagecom.example.secd_new.mapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.secd_new.entity.User;importorg.apache.ibatis.annotations.Mapper;@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{}原理(MyBatis‑Plus 核心)
@Mapper:告诉 MyBatis 这是 mapper 接口,用来操作数据库。- 继承
BaseMapper<User>,直接拥有内置方法:selectById、selectList、insert、updateById、deleteById,不用自己写 SQL 语句。
MyBatis 原生需要写 xml 写 SQL;MyBatis‑Plus 封装通用 CRUD,单表操作不用写 SQL。
Controller 控制器 UserController.java
- 接收前端请求,调用 mapper 操作数据库,返回结果。
- 注意:SpringBoot3 + JDK17,
@PathVariable("id")必须写括号里面的名字,不能省略,省略直接 500 报错
- 注意:SpringBoot3 + JDK17,
packagecom.example.secd_new.controller;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.secd_new.entity.User;importcom.example.secd_new.mapper.UserMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;@RestController//标记这是接口控制器,返回JSON/字符串,不是返回页面@RequestMapping("/user")//统一接口前缀,所有接口地址前面带上 /userpublicclassUserController{//把mapper注入进来@AutowiredprivateUserMapperuserMapper;//1. 查询全部用户 GET请求@GetMapping("/list")publicList<User>getAll(){returnuserMapper.selectList(null);}//2. 根据id查询单个用户 GET@GetMapping("/{id}")publicStringgetById(@PathVariable("id")Longid){Useruser=userMapper.selectById(id);if(user==null){return"查无此人";}return"id:"+user.getId()+" name:"+user.getName()+" age:"+user.getAge();}//3. 新增用户 POST@PostMapping("/add")publicStringadd(@RequestBodyUseruser){userMapper.insert(user);return"新增成功";}//4. 修改用户 PUT@PutMapping("/update")publicStringupdate(@RequestBodyUseruser){userMapper.updateById(user);return"修改成功";}//5. 删除用户 DELETE@DeleteMapping("/del/{id}")publicStringdel(@PathVariable("id")Longid){userMapper.deleteById(id);return"删除成功";}}注解原理
@RestController=@Controller + @ResponseBody,方法返回值直接输出给前端,不是跳转网页。@RequestMapping("/user")统一接口前缀。@GetMapping:接收 GET 请求;浏览器地址栏访问就是 GET。@PostMapping / @PutMapping / @DeleteMapping:POST/PUT/DELETE 请求,浏览器地址栏无法直接发起。@PathVariable("id"):从 url 路径获取参数,例如/user/3,3 赋值给 id 变量。@RequestBody:接收前端传过来的 JSON 格式数据。@Autowired:Spring 自动把 Mapper 对象注入进来,不用自己 new 对象。
启动项目 & 浏览器测试开头
运行启动类SecdNewApplication的 main 方法。
控制台输出Started SecdNewApplication,代表项目启动成功,默认端口8080。
打开浏览器输入地址:http://localhost:8080/user/list可以看到全部用户 JSON 数据,代表整套流程跑通。
再测试单查http://localhost:8080/user/3浏览器局限:
浏览器地址栏只能发送 GET 请求。
新增、修改、删除是 POST/PUT/DELETE,浏览器地址栏做不到,需要 IDEA 的 http 文件或者 Postman 测试。
后续待拓展
- 抽离 Service 层,把业务逻辑从 Controller 拿出来,Controller 只负责接收请求。
- 统一返回 JSON 格式,不再返回普通字符串。
- 参数校验、全局异常处理。
- http 文件测试 POST/PUT/DELETE 接口。