最新Springboot详解和书管项目训练
作者:互联网
文章目录
- SpringBoot入门案例
- 隐藏文件或文件夹
- 入门案例解析:parent
- starter
- 引导类
- 内嵌tomcat
- 复制模块
- 基础配置
- 属性提示消失解决方案
- yaml数据格式
- yml读取数据
- yaml文件中的变量引用
- 读取yaml全部属性数据
- 读取yaml引用类型属性 数据
- SpringBoot整合JUnit
- SpringBoot整合MyBatis
- SpringBoot整合MyBatis常见错误
- SpringBoot整合mybatis plus
- 整合Druid
- SSMP整合案例制作分析
- 模块创建
- 实体类快速开发(lombok)
- 数据层标准开发
- 开启MP运行日志
- 分页查询
- 数据层标准开发(条件查询)
- 业务层标准开发(基础CRUD)
- 业务层快速开发
- 表现层基础开发
- 表现层数据一致性处理 (R对象)
- 前后端调用(axios发送)
- 列表功能
- 添加功能
- 删除功能
- 修改功能 (加载数据)
- 修改功能
- 异常消息处理
- 分页功能
- 分页功能维护
- 条件查询
SpringBoot入门案例
SpringBoot入门案例 (idea联网版)
- 建立一个空项目
- 确定当前Maven的版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSplzkn8-1641018122074)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112241842333.png)]
- 创建模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjz6ptZY-1641018122075)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112241843484.png)]
选择Spring Initializr,选择jdk版本,其他都不用动,选择当前模块使用的技术集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urhwWpf0-1641018122076)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112241849295.png)]
选择Spring web
- 界面如下
- 写一个简单的类。然后运行,开发控制器类
package controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("spingboot is runing..");
return "springboot is running";
}
}
运行成功
- 在网页中打开
到目前为止一个最简单的boot程序已经完成
这两个文件就组成了整体的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWX1q2IM-1641018122079)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112241941048.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOQayqFm-1641018122080)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112241954738.png)]
springboot对比spring的优点:就只需要写一个控制类。
最重要的一点是springboot需要联网操作
小结
- 开发SpringBoot程序可以根据向导进行联网快速制作
- SpringBoot程序需要基于JDK8进行制作
- SpringBoot程序中需要使用何种功能通过勾选选择技术
- 运行SpringBoot程序通过运行Application程序入口进行
SpringBoot创建 (idea不能联网,官网创建)
-
搜索spring官网
-
拉到最下面,点击Spring Initializr
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9c2wvHK8-1641018122082)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112251236324.png)]
- 填完后,点击添加依赖包,搜索web
- 点击下载springboot工程
- 把压缩目录复制到对应idea springboot目录中
- 在idea中将工程导入其中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z11IiGRT-1641018122084)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112251244884.png)]
- 创建完之后,我们将之前的control包复制下来,查看是否运行成功,出现springboot is running…2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXYzp9Gg-1641018122085)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112251459375.png)]
- 运行完后,表示成功
springboot创建 (阿里云版)
- 点击新创建项目
- 测试
总结:国内访问spring官网可能回很慢,可以使用阿里云的网站,速度回变快
隐藏文件或文件夹
- 找到file types
- 文件中.mvn就消失了
入门案例解析:parent
SpringBoot简介
- SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
- Spring缺点
- 依赖设置繁琐
- 配置繁琐
- SpringBoot程序优点
- 起步依赖
- 自动配置
- 辅助功能
小结:
- 开发SpringBoot程序要继承spring-boot-starter-parent
- spring-boot-starter-parent中定义了若干个依赖管理
- 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承parent的形式也可以采用引入依赖的形式实现效果(阿里云版)
starter
- starter是springboot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
- aprent所有SpringBoot项目要继承的项目,定义了若干个坐标版本号,以达到减少依赖冲突的目的
- spring-boot-starter-parent各版本间存在着诸多坐标版本不同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnHSRY7x-1641018122089)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271900273.png)]
引导类
- 启动方式
@SpringBootApplication
public class SpringBoot0101QuickstartApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(SpringBoot0101QuickstartApplication.class, args);
BookController bean=ctx.getBean(BookController.class);
System.out.println("bean====>"+bean);
}
}
- SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
- SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
内嵌tomcat
变更依赖包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTm6JhTy-1641018122090)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271936721.png)]
小结:
- 内嵌Tomcat服务器是SpringBoot辅助之一
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将对象交给Spring容器管理
- 变更内嵌服务器思想是取出现在服务器,添加全新服务器
复制模块
- 原则
- 保留工程继承结构
- 抹掉原始工程痕迹
- 复制目录
- 修改pom.xml文件中的artifactId
- 导入项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EG7YOguZ-1641018122091)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271949920.png)]
- 修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rCTOEfo-1641018122091)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271954490.png)]
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGAxbRvJ-1641018122092)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112272012263.png)]
基础配置
- 属性配置
- 找到application.properties文件。application.properties是springBoot默认文件,通过键值对配置对应属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rIjNll0g-1641018122092)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112272014305.png)]
- 修改端口
- 查看
- springboot提供了多种属性配置方式
- application.properties
server.port=80
- application.yml
server:
port:81
- application.yaml
server:
port:82
属性提示消失解决方案
- 打开项目结构
yaml数据格式
- yaml是一种数据序列格式
- 优点
- 容易阅读
- 容易与脚本交互
- 以数据为核心,重数据轻格式
- YAML文件扩展名
1 .yml(主流)
2 .yaml
小结:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-841zgKgS-1641018122094)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112280908729.png)]
yml读取数据
- 使用@value读取单一数据,属性名引用方式:${一级属性名,二级属性名…}
yaml文件中的变量引用
- 引用格式读取数据
读取yaml全部属性数据
- 封装全部数据到Environment对象
读取yaml引用类型属性 数据
- 自定义对象封装指定数据
- 例如
- 创建类
- 写类
package com.itheima.springboot_01_02quickstart;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//1.定义数据模型封装yaml文件对应的数据
//2.定义spring管控的bean
@Component
//3.指定加载的数据
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MyDataSource{" +
"driver='" + driver + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
// datasource:
// driver: com.mysql.jdbc.Driver
// url: jdbc:mysql://localhost/springboot_db
// username: root
// password: root666
- 在control类中加载,并打印
小结:
- 使用@ConfigurationProperties注解绑定配置信息到封装类
- 封装类需要定义为Spring管理的bean,否则无法进行属性注入
SpringBoot整合JUnit
- 创建新模块
- 找类,该类可以整合junit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4QbAMier-1641018122098)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281011554.png)]
小结:
- springboot中的classes
小结:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OXP1Sufh-1641018122099)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281129590.png)]
SpringBoot整合MyBatis
- 需要勾选依赖项
- 将配置文件改为.yml结尾
- 写配置文件连接数据库
- 建立数据层和实体类
- 实体类
package com.itheima.domain;
public class Book {
private Integer id;
private String type;
private String name;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", type='" + type + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}
- 数据层接口
package com.itheima.dao;
import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface BookDao {
@Select("select * from tbl_book where id= #{id}")
public Book getById(Integer id);
}
- 测试类
package com.itheima.springboot_05_mybitis;
import com.itheima.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot05MybitisApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
System.out.println(bookDao.getById(1));
}
}
小结:
- 勾选MyBatis技术,也就是导入MyBatis对应的starter
- 数据库连接相关信息转换成配置
- 数据库SQL映射需要添加@Mapper被容器识别到
SpringBoot整合MyBatis常见错误
- 如果将版本降低
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJbxMwgS-1641018122101)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281524283.png)]
SpringBoot整合mybatis plus
- 使用阿里云服务器
- 通过官网创建
-
先创建普通的项目(需要勾选1个mysql driver)
-
然后去maven官网找
- 添加依赖
- 在.yml文件中设置Mp相关配置
#2.??????
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: 123456
#设置Mp相关的配置
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
- 定义数据层接口与映射配置,继承BaseMapper
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9I4OCGDi-1641018122103)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281548496.png)]
小结:
整合Druid
-
创建项目,和之前一样勾选两个
-
导入依赖包坐标
- 配置druid在application.yml(两种方式)
小结:
- 整合Druid需要导入Druid对应的starter
- 根据Druid提供的配置方式进行配置
- 整合第三方技术通用方式
- 导入对应的starter
- 根据提供的配置格式,配置非默认值对应的配置项
SSMP整合案例制作分析
总体:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FsTVsv62-1641018122104)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202201011419774.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ub5xajn7-1641018122104)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281639068.png)]
- SSMP案例制作流程解析
- 先开发基础CRUD功能,做一层测一层
- 调通页面,确认异步提交成功后,制作所有功能
- 添加分页功能与查询功能
模块创建
- 创建项目
- 修改pom.xml文件
- 在pom.xml文件中手动添加德鲁伊和mybatis plus依赖包
- 修改配置文件为.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQEIz9nF-1641018122105)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281654265.png)]
实体类快速开发(lombok)
-
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发
-
如何使用
- 在pom.xml中添加lombok依赖包
- 在POJO实体类添加@Data注解,,提供了get/set方法,toString方法,hashode方法,equals方法等
数据层标准开发
- 配置.yml文件
- 用Mp形式创建接口,继承于BaseMapper
- 在test目录下创建测试类
package com.itheima.springboot_08_ssmp.dao;
import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookDaoTest {
@Autowired
private BookDao bookDao;
@Test
void testGetId(){
System.out.println(bookDao.selectById(5));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据123");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookDao.insert(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(9);
book.setType("测试数据123aaa");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookDao.updateById(book);
}
@Test
void testDelete(){
bookDao.deleteById(10);
}
@Test
void testGetAll(){
System.out.println( bookDao.selectList(null));
}
@Test
void testGetPage(){
}
@Test
void testGetBy(){}
}
小结:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOfvmT7A-1641018122107)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281926068.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5sJfm1D-1641018122108)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281927423.png)]
- 手工导入starter坐标两个 mybatisplus和druid
- 配置数据源与MyBatis-plus对应配置
- 开发Dao接口 继承与BaseMapper
- 制作测试类测试Dao功能是否有效
开启MP运行日志
- 在.yml文件下添加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rn2QZYK7-1641018122108)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281931859.png)]
分页查询
- 测试方法
@Test
void testGetPage(){
IPage page = new Page(2,5);
bookDao.selectPage(page,null);
}
- 写个配置类,分页拦截器
package com.itheima.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //配置类
public class MPconfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); //分页拦截器
return interceptor;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arBwLGFt-1641018122109)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112281954332.png)]
数据层标准开发(条件查询)
-
使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装方法调用
-
所有查询操作封装成方法调用
-
查询条件支持动态条件拼装
@Test
void testGetBy(){
QueryWrapper<Book> qw = new QueryWrapper<Book>();
qw.like("name","spring");
bookDao.selectList(qw);
}
@Test //使用Lambda表达式减少写错
void testGetBy2(){
String name = "spring";
LambdaQueryWrapper<Book> lqw=new LambdaQueryWrapper<Book>();
lqw.like(name!=null,Book::getName,name);
bookDao.selectList(lqw);
}
业务层标准开发(基础CRUD)
业务层开发
- Service层接口与数据层接口定义具有较大区别,不要混淆
- selectByUserNameAndPassword(String username,String password);
- login(String username,String password);
- 定义接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LwmSt9BH-1641018122110)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112282058047.png)]
package com.itheima.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.domain.Book;
import java.util.List;
public interface BookService {
Boolean save(Book book);
Boolean update(Book book);
Boolean delete(Integer id);
Book getById(Integer id);
List<Book> getAll();
IPage<Book> getPage(int currentPage,int pageSize);
}
- 实现类定义
package com.itheima.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service //业务层对应的bean
public class BookServiceImpl implements BookService {
//转调数据层,进行注入
@Autowired
private BookDao bookDao;
@Override
public Boolean save(Book book) {
//将业务状态设置为操作是否完成
return bookDao.insert(book)>0;
}
@Override
public Boolean update(Book book) {
return bookDao.updateById(book)>0;
}
@Override
public Boolean delete(Integer id) {
return bookDao.deleteById(id)>0;
}
@Override
public Book getById(Integer id) {
return bookDao.selectById(id);
}
@Override
public List<Book> getAll() {
return bookDao.selectList(null);
}
@Override
public IPage<Book> getPage(int currentPage, int pageSize) {
IPage page = new Page(currentPage,pageSize);
bookDao.selectPage(page,null);
return page;
}
}
- 测试类
package com.itheima.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookServiceTestCase {
@Autowired
private BookService bookService;
@Test
void testGetById(){ //业务层需要打印出来
System.out.println(bookService.getById(4));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据122223");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookService.save(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(9);
book.setType("测试123aaa");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookService.update(book);
}
@Test
void testDelete(){
bookService.delete(10);
}
@Test
void testGetAll(){
bookService.getAll();
}
@Test
void testGetPage(){
IPage<Book> page = bookService.getPage(2, 5);
}
}
小结:
- Service接口名称定义成业务名称,并与Dao接口名称进行区别
- 制作测试类测试Service功能是否有效
业务层快速开发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NB7HwHNl-1641018122110)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112282106506.png)]
- 使用MyBatisPlus提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl<M,T>)
- 在通用类基础上做功能重载或功能追加
- 注意重载时不用覆盖原始操作,避免元素提供的功能丢失
- 业务层通用接口
- 业务层通用实现类
- 测试类
package com.itheima.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookServiceTest {
@Autowired
private IBookService bookService;
@Test
void testGetById(){ //业务层需要打印出来
System.out.println(bookService.getById(4));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据122223");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookService.save(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(9);
book.setType("测试123aaa");
book.setName("测试数据123");
book.setDescrption("测试数据123");
bookService.updateById(book);
}
@Test
void testDelete(){
bookService.removeById(12);
}
@Test
void testGetAll(){
bookService.list();
}
@Test
void testGetPage(){
IPage<Book> page = new Page<>(2,5);
bookService.page(page);
}
}
小结:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M32YhdCt-1641018122111)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112282134272.png)]
表现层基础开发
表现层开发
- 基于Restful进行表现层接口开发
- 使用Postman测试表现层接口功能
- 功能测试
- 表现层接口开发
@Autowired
private IBookService bookService;
@GetMapping
public List<Book> getAll(){
return bookService.list();
}
@PostMapping
public Boolean save(@RequestBody Book book){
return bookService.save(book);
}
@PutMapping
public Boolean update(@RequestBody Book book){
return bookService.modifyBook(book);
}
@DeleteMapping("{id}")
public Boolean delete(@PathVariable Integer id){
return bookService.delete(id);
}
@GetMapping("{id}")
public Book getById(@PathVariable Integer id){
return bookService.getById(id);
}
@GetMapping("{currentPage}/{pageSize}")
public IPage<Book> getPage(@PathVariable int currentPage,@PathVariable int pageSize){
return bookService.getPage(currentPage, pageSize);
}
小结:
- 基于Restful制作表现层接口
- 新增:POST
- 删除:DELETE
- 修改:PUT
- 查询:GET
- 接收参数
- 实体数据:@RequestBody
- 路径变量:@PathVariable
表现层数据一致性处理 (R对象)
- 设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议
- 表现层接口统一返回值类型结果
@Autowired
private IBookService bookService;
@GetMapping
public R getAll(){
return new R(true,bookService.list());
}
@PostMapping
public R save(@RequestBody Book book){
return new R(bookService.save(book));
}
@PutMapping
public R update(@RequestBody Book book){
return new R(bookService.modifyBook(book));
}
@DeleteMapping("{id}")
public R delete(@PathVariable Integer id){
return new R(bookService.delete(id));
}
@GetMapping("{id}")
public R getById(@PathVariable Integer id){
return new R(true,bookService.getById(id));
}
@GetMapping("{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage,@PathVariable int pageSize){
return new R(true,bookService.getPage(currentPage, pageSize));
}
小结:
前后端调用(axios发送)
前后端协议联调
- 前后端分离结果设计中页面归属前端服务器
- 单体工程中页面放在resource目录下的static目录(建立clean)
- 前端发送异步请求,调用后端接口
- 小结
列表功能
- 将查询数据返回到页面,利用前端数据双向绑定进行数据展示
添加功能
- 弹出添加窗口
- 清除数据
- 添加
小结:
删除功能
- 删除,row是当前行数据
- 删除,防止删除错误
- 小结
修改功能 (加载数据)
- 弹出窗口修改
- 删除信息维护
小结:
修改功能
小结:
异常消息处理
- 对于异常进行统一处理,出现异常后,返回指定消息
- 修改表现层返回的模型类,封装出现异常后对应的信息
小结:
分页功能
- 页面使用el分页组件添加分页功能
- 定义分页组件需要使用的数据并将数据绑定到分页组件
- 替换查询全部功能为分页功能
- 分页查询
- 加载分页数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QoRFWRhc-1641018122120)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112291950983.png)]
- 分页页码切换
小结:
分页功能维护
- 对查询结果进行校验,如果当前页码值大于最大页码值,使用最大页码作为当前页码值查询查询
条件查询
- 查询条件数据封装
- 单独封装
- 与分页操作混合封装
- 组织数据成为get请求发送的数据
- 后台接收参数,controller接收参数
小结:
标签:Springboot,img,Book,书管,book,防盗链,import,public,详解 来源: https://blog.csdn.net/wenjinjie1/article/details/122267386