一. 流程分析
-
创建工程
- 创建一个SpringBoot工程
- 需要勾选
Spring Web
,MyBatis Framework
和MySQL Driver
-
SpringBoot整合
- 整合MyBatis
- 添加Druid数据源依赖
- 编写数据库配置文件(application.yml),配置数据库连接四要素
- 对于Dao层的包扫描,使用
@Mapper
注解
- 整合Junit
- 使用
@SpringBootTest
注解
- 使用
- 整合MyBatis
-
功能模块
- 创建数据库和表
- 根据数据表来创建对应的模型类
- 通过
Dao
层完成数据库的增删改 - 编写
Service
层(Service接口+实现类) - 编写
Controller
层- 接收请求
@RequestMapping
、@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
- 接收数据 简单类型、POJO类型、嵌套POJO类型、数组类型、JSON数据类型
@RequestParam
@PathVariable
@RequestBody
- 转发业务层
- 使用
@Autowired
自动装配
- 使用
- 响应结果
@ResponseBody
- 接收请求
二. 代码实现
1.创建工程,添加依赖
(最后一个可以不加)
由于我们在项目中用到了MyBatis-Plus和JSON,我们需要在pom.xml中引入两个依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.49</version> </dependency>
2.创建数据库,表
3.在IDEA中连接数据库
用户名就是默认的root(如果你没有修改用户名的话)
密码默认123456(我修改了 在这里就填修改后的)
数据库指的是
4.配置yml文件
圈出来的是需要修改的地方
然后我们运行引导类Application 可以看到运行成功
注意:
SpringBoot
在创建项目时,采用jar的打包方式SpringBoot
的引导类是项目的入口,运行main
方法就可以启动项目
因为我们在pom.xml
中配置了spring-boot-starter-web
依赖,而该依赖通过前面的学习知道它依赖tomcat
,所以运行main
方法就可以使用tomcat
启动工程。SpringBoot
程序的配置文件名必须是application
,只是后缀名不同而已。application.properties
文件内容如下:-
PROPERTIES
1
server.port=80
application.yml
文件内容如下:-
YAML
1 2
server: port: 81
application.yaml
文件内容如下:-
YAML
1 2
server: port: 82
- 启动服务,在控制台可以看到使用的端口号是
80
。说明application.properties
的优先级最高 - 注释掉
application.properties
配置文件内容。再次启动服务,在控制台可以看到使用的端口号是81
,说明application.yml
配置文件为第二优先级。 - 从上述的验证结果可以确定三种配置文件的优先级是:
application.properties
>application.yml
>application.yaml
-
yaml的优点有:
- 容易阅读
yaml
类型的配置文件比xml
类型的配置文件更容易阅读,结构更加清晰
- 容易与脚本语言交互(暂时还体会不到,后面会了解)
- 以数据为核心,重数据轻格式
yaml
更注重数据,而xml
更注重格式
- 容易阅读
-
YAML 文件扩展名:
.yml
(主流).yaml
补充知识(前情提要)
在一个典型的Java项目中,通常会使用四个层次的架构:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)、持久化层(Persistence Layer)和数据访问层(Data Access Layer)。每个层次都有不同的职责和功能,因此需要使用不同的注解来标识和配置。
以下是对每个层次的常见注解的简要说明:
- 表示层(Presentation Layer):负责处理用户界面和用户输入,向用户展示数据和结果。常见的注解包括:
@Controller
:标识一个类作为控制器,用于处理请求和响应。@RestController
:类似于@Controller
,但专门用于RESTful风格的接口。@RequestMapping
:用于映射请求URL和方法,指定请求的路径和HTTP方法。@RequestParam
:用于获取请求参数的值。@ResponseBody
:将方法返回的对象作为响应体返回给客户端。
- 业务逻辑层(Business Logic Layer):负责实现业务逻辑和业务规则。常见的注解包括:
@Service
:标识一个类作为服务层组件,用于处理业务逻辑。@Transactional
:标识一个方法或类需要进行事务管理。
- 持久化层(Persistence Layer):负责与数据库进行交互,进行数据的持久化和访问。常见的注解包括:
@Repository
:标识一个类作为数据访问层组件,用于访问数据库。@Entity
:标识一个类作为持久化实体,在数据库中对应一张表。@Table
:用于指定实体类对应的数据库表名。@Column
:用于指定实体类属性对应的数据库列名。@Id
:用于标识实体类主键属性。
- 数据访问层(Data Access Layer):负责具体的数据访问和操作。常见的注解包括:
@Mapper
:标识一个接口作为映射器(Mapper),用于定义数据库操作的方法。@Select
、@Insert
、@Update
、@Delete
等:用于指定SQL映射文件中具体的SQL语句与Java方法的映射关系。
5.创建一个pojo包,StudentPojo类(数据库的映射层)
6.创建dao层
注意要加上@Mapper注解
@Mapper
注解是MyBatis框架中的一个注解,它的作用是将一个Java接口标记为一个映射器(Mapper)。Mapper是用于定义数据库操作的接口,它提供了一组方法来与数据库进行交互,包括插入、更新、删除和查询等操作。
使用@Mapper
注解可以告诉MyBatis框架将这个接口与对应的SQL映射文件进行关联。SQL映射文件通常使用XML格式,其中定义了与数据库表相关的SQL语句,通过这些SQL语句可以执行对应的数据库操作。
通过将Java接口与SQL映射文件关联起来,可以方便地使用Java代码调用数据库操作,而无需编写繁琐的SQL语句。MyBatis框架会根据接口的方法名和参数来自动生成对应的SQL语句,并执行数据库操作。
通过使用@Mapper注解,MyBatis框架会自动扫描并解析这个接口,并生成对应的实现类。在实际使用时,我们可以通过依赖注入的方式将UserMapper接口的实例注入到其他类中,然后调用接口中定义的方法来进行数据库操作。
需要注意的是,@Mapper注解通常与MyBatis的其他注解(如@Select、@Insert、@Update、@Delete等)一起使用,用于进一步指定SQL映射文件中具体的SQL语句与Java方法的映射关系。这样可以更加灵活地定义和控制数据库操作。
7.创建Service层
后面的部分截图截不完整 就放到代码块里了
public void updateStudent(int id, String newusername, String newpassword, String newemail){ StudentPojo studentPojo = studentDao.selectById(id); studentPojo.setUsername(newusername); studentPojo.setPassword(newpassword); studentPojo.setEmail(newemail); studentDao.update(studentPojo, new QueryWrapper<StudentPojo>().eq("id",id)); } public void selectStudentById(int id){ StudentPojo studentPojo = studentDao.selectById(id); System.out.println(studentPojo); } public void selectStudentByUsername(String username){ List<StudentPojo> selectedStudents = studentDao.selectList(new QueryWrapper<StudentPojo>().like("username",username)); selectedStudents.forEach(System.out::println); } }
8.创建utils层
该层负责和前端交互,将数据的返回格式均改成JSON格式
utils
层通常是一个项目中用于存放工具类的层级。它是一种常见的软件架构设计模式,将不属于业务逻辑或持久化层的通用功能、工具类或辅助类进行组织和封装。
常见的HTTP状态码和它们的含义如下:
- 200:成功。表示请求已成功处理。
- 201:已创建。表示请求已经被成功处理,并且创建了一个新的资源。
- 400:请求错误。表示服务器无法理解请求的语法。
- 401:未授权。表示请求需要进行身份验证或授权。
- 403:禁止访问。表示服务器拒绝请求。
- 404:未找到。表示服务器找不到请求的资源。
- 500:服务器错误。表示服务器在执行请求时发生了错误。
9.创建Controller层
@RequestMapping
:是一个通用的注解,用于将请求路径和请求方法映射到控制器方法上。
//实现接口 package com.example.learnspringboot.controller; import com.example.learnspringboot.service.StudentService; import com.example.learnspringboot.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.websocket.server.PathParam; @RestController public class StudentController { @Autowired StudentService studentService; @RequestMapping(value = "/student", method = RequestMethod.POST)//定义了查找的路径和请求方法 public String addStudent(@RequestParam int id, @RequestParam String username, @RequestParam String password, @RequestParam String email){ studentService.addStudent(id, username, password, email); String resp = Result.okResponse(200, null, "success"); return resp; } @RequestMapping(value = "/student", method = RequestMethod.DELETE)//定义了查找的路径和请求方法 public String deleteStudent(@RequestParam int id){ studentService.deleteStudent(id); String resp = Result.okResponse(200, null, "success"); return resp; } @RequestMapping(value = "/student", method = RequestMethod.GET) public String selectStudentByUsername(@RequestParam String username){ studentService.selectStudentByUsername(username); String resp = Result.okResponse(200, null, "success"); return resp; }@RequestMapping(value = "/student/{id}", method = RequestMethod.GET) public String getStudentById(@PathVariable("id") int id) { studentService.selectStudentById(id); String resp = Result.okResponse(200, null, "success"); return resp; } @RequestMapping(value = "/student", method = RequestMethod.PUT) public String updateStudent(@PathParam("id") int id, @RequestParam String username, @RequestParam String password,@RequestParam String email){ studentService.updateStudent(id, username, password, password); String resp = Result.okResponse(200, null, "success"); return resp; } }
10.发送Postman
搞错了 再来 增加数据是POST请求
然后我们可以看到数据库成功增加了数据
删
改
查
先用username查
可见控制台已成功获取到了数据
然后我们用id查
注意一个细节
@RequestParam
注解用于从请求参数中获取参数值,而 @PathVariable
注解用于从路径中获取参数值。
使用 @RequestParam
注解获取参数时,客户端可以将参数作为查询参数发送,例如:/student?username=johndoe
。
相比之下,当使用 @PathVariable
注解时,参数值需要作为路径的一部分发送,例如:/student/johndoe
。
@PathParam
:用于从请求路径中获取路径参数的值。在 JAX-RS 中使用,可以通过 @PathParam
注解将路径参数与方法的参数进行绑定。例如,/student/{id}
中的 id
可以通过 @PathParam
注解获取。所以这个在SpringMVC中不使用!