SpringBoot——SSMP整合案例
原创
©著作权归作者所有:来自51CTO博客作者叮的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 一. 案例实现方案分析
- 二. 模块创建
- 1. 导入依赖
- 2. 配置yml
- 3. 实体类开发
- 4. 数据层开发
- 4.1 配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)
- 4.2 继承BaseMapper并指定泛型
- 4.3 数据层开发:分页功能
- 4.4 数据层开发:条件查询功能
- 4.5 进行测试
- 2.1 接口定义
- 2.2 实现类定义
- 2.3 进行测试
- 2.4 业务层开发—快速开发(使用IService)
- 1. 接口定义
- 2. 实现类定义
- 3. 测试类定义
- 3.1 功能测试
- 3.2 表现层消息一致性处理
- 3.3 业务消息一致性处理
- 1. 前端发送异步请求,调用后端接口
- 2. 列表页
- 3. 弹出添加窗口
- 4. 添加数据
- 5. 清除表单数据
- 6. 取消添加
- 7. 删除
- 8. 弹出修改窗口
- 9. 修改操作
- 10. 分页功能
- 11. 条件查询功能
一. 案例实现方案分析
二. 模块创建
- 勾选SpringMVC与MySQL坐标
- 修改配置文件为yml格式
- 设置端口为80方便访问
1. 导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot_08_ssmp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. 配置yml
3. 实体类开发
4. 数据层开发
4.1 配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)
id-type:auto 设置数据库自增策略开启MyBatisPlus的日志
4.2 继承BaseMapper并指定泛型
4.3 数据层开发:分页功能
分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
分页测试
4.4 数据层开发:条件查询功能
使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用
4.5 进行测试
package com.itheima.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 BookDaoTestCase {
@Autowired
private BookDao bookDao;
@Test
void testGetById(){
System.out.println(bookDao.selectById(1));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据aaa");
book.setName("测试数据aaa");
book.setDescription("测试数据aaa");
bookDao.insert(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(4);
book.setType("测试数据abcdefg");
book.setName("测试数据123");
book.setDescription("测试数据123");
bookDao.updateById(book);
}
@Test
void testDelete(){
bookDao.deleteById(16);
}
@Test
void testGetAll(){
bookDao.selectList(null);
}
@Test
void testGetPage(){
IPage page = new Page(2,5);
bookDao.selectPage(page, null);
System.out.println(page.getCurrent());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.getPages());
System.out.println(page.getRecords());
}
@Test
void testGetBy(){
QueryWrapper<Book> qw = new QueryWrapper<>();
qw.like("name","Spring");
bookDao.selectList(qw);
}
@Test
void testGetBy2(){
String name = "1";
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
//if(name != null) lqw.like(Book::getName,name);
lqw.like(name != null,Book::getName,name);
bookDao.selectList(lqw);
}
}
2. 业务层开发
- Service接口名称定义成业务名称,并与Dao接口名称进行区分
- 制作测试类测试Service功能是否有效
2.1 接口定义
2.2 实现类定义
2.3 进行测试
package com.itheima.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 BookServiceTestCase {
@Autowired
private BookService bookService;
@Test
void testGetById(){
System.out.println(bookService.getById(4));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据123");
book.setName("测试数据123");
book.setDescription("测试数据123");
bookService.save(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(18);
book.setType("测试数据abcdefg");
book.setName("测试数据123");
book.setDescription("测试数据123");
bookService.update(book);
}
@Test
void testDelete(){
bookService.delete(16);
}
@Test
void testGetAll(){
bookService.getAll();
}
@Test
void testGetPage(){
IPage<Book> page = bookService.getPage(2, 5);
System.out.println(page.getCurrent());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.getPages());
System.out.println(page.getRecords());
}
}
2.4 业务层开发—快速开发(使用IService)
- 使用通用接口(ISerivce)快速开发Service
- 使用通用实现类(ServiceImpl<M,T>)快速开发ServiceImpl
- 可以在通用接口基础上做功能重载或功能追加
- 注意重载时不要覆盖原始操作,避免原始提供的功能丢失
1. 接口定义
2. 实现类定义
实现类追加功能
3. 测试类定义
3. 表现层开发
3.1 功能测试
@RequestBody:用异步提交发送,他的参数通过请求体传递json数据过来
@PathVariable:用路径变量来传递参数(http://localhost/books/2)
查询:GET
新增:POST
@PostMapping
public Boolean save(@RequestBody Book book){
return bookService.save(book);
}
修改:PUT
@PutMapping
public Boolean update(@RequestBody Book book){
return bookService.modify(book);
}
删除:DELETE
@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, null);
}
3.2 表现层消息一致性处理
- 设计统一的返回值结果类型便于前端开发读取数据
- 返回值结果类型可以根据需求自行设定,没有固定格式
- 返回值结果模型类用于后端与前端进行数据格式统一,也称为前
后端数据协议
设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议
表现层接口统一返回值类型结果
3.3 业务消息一致性处理
对异常进行统一处理,出现异常后,返回指定信息
修改表现层返回结果的模型类,封装出现异常后对应的信息
package com.itheima.controller.utils;
import lombok.Data;
@Data
public class R {
private Boolean flag;
private Object data;
private String msg;
public R(){}
public R(Boolean flag){
this.flag = flag;
}
public R(Boolean flag,Object data){
this.flag = flag;
this.data = data;
}
public R(Boolean flag,String msg){
this.flag = flag;
this.msg = msg;
}
public R(String msg){
this.flag = false;
this.msg = msg;
}
}
后台统一管理数据消息格式
数据消息全部放在后台或者全部放在前端处理都可以,为了方便进行国际化
三. 前后端协议联调
前后端分离开发:页面开发放在前端服务器上面的
我们这里放在单体服务器上
1. 前端发送异步请求,调用后端接口
- 单体项目中页面放置在resources/static目录下
- created钩子函数用于初始化页面时发起调用
- 页面使用axios发送异步请求获取数据后确认前后端是否联通
2. 列表页
将查询数据返回到页面,利用前端数据双向绑定进行数据展示
3. 弹出添加窗口
4. 添加数据
5. 清除表单数据
6. 取消添加
7. 删除
- 请求方式使用Delete调用后台对应操作
- 删除操作需要传递当前行数据对应的id值到后台
- 删除操作结束后动态刷新页面加载数据
- 根据操作结果不同,显示对应的提示信息
- 删除操作前弹出提示框避免误操作
8. 弹出修改窗口
9. 修改操作
10. 分页功能
页面使用el分页组件添加分页功能
定义分页组件需要使用的数据并将数据绑定到分页组件
替换查询全部功能为分页功能
分页查询
分页页码值切换
对查询结果进行校验,如果当前页码值大于最大页码值,使用最大页码值作为当前页码值重新查询
11. 条件查询功能
页面数据模型绑定
组织数据成为get请求发送的数据
Controller接收参数
业务层接口功能开发
页面回显数据