您现在的位置是:首页 > 正文

SpringBoot——SSMP整合案例

2024-02-29 17:21:25阅读 5

一. 案例实现方案分析

在这里插入图片描述

二. 模块创建

在这里插入图片描述

  1. 勾选SpringMVC与MySQL坐标
  2. 修改配置文件为yml格式
  3. 设置端口为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. 删除

  1. 请求方式使用Delete调用后台对应操作
  2. 删除操作需要传递当前行数据对应的id值到后台
  3. 删除操作结束后动态刷新页面加载数据
  4. 根据操作结果不同,显示对应的提示信息
  5. 删除操作前弹出提示框避免误操作

在这里插入图片描述

8. 弹出修改窗口

在这里插入图片描述

9. 修改操作

在这里插入图片描述

10. 分页功能

页面使用el分页组件添加分页功能
在这里插入图片描述
定义分页组件需要使用的数据并将数据绑定到分页组件
在这里插入图片描述
替换查询全部功能为分页功能
在这里插入图片描述
分页查询
在这里插入图片描述

分页页码值切换
在这里插入图片描述

对查询结果进行校验,如果当前页码值大于最大页码值,使用最大页码值作为当前页码值重新查询
在这里插入图片描述

11. 条件查询功能

在这里插入图片描述
页面数据模型绑定
在这里插入图片描述
组织数据成为get请求发送的数据
在这里插入图片描述
Controller接收参数

在这里插入图片描述

业务层接口功能开发
在这里插入图片描述
页面回显数据
在这里插入图片描述

网站文章

  • NOI金牌冲刺day25

    NOI金牌冲刺day25

    昨天晚上CF div2 用小号打的,非常棒,前十名,第六题过了,第五题没过,😓P7598 结论,倍增,贪心注意IF和WHILEP1399线段树,求基环树直径

    2024-02-29 17:21:18
  • Appium实际测试中处理界面元素的异常,心得分享

    Appium实际测试中处理界面元素的异常,心得分享

    Appium是一款极其强大的移动端自动化测试工具,它不仅支持多种语言,并且可以使用同一套API在不同操作系统平台上进行测试脚本的编写,完美的兼容了android和ios;但是要真正掌握并熟练Appium并不是一个简单的事情,在实际工作中往往会遇到学习过程中无法想象的情况,这次就分享一下我的工作心得 最近一直忙于整理公司接口测试框架,Appium被我疏远了好一阵子,前两天领导说以后可能要开展app

    2024-02-29 17:21:12
  • 微服务到底是什么

    微服务到底是什么

    在介绍微服务之前,我们先了解什么是单体架构。 这种将所有的代码及功能都包含在一个war包中的项目组织方式被称为Monolith(单体应用)架构。 但经过日积月累,这个应用就会变成一个庞大而复杂的“怪物...

    2024-02-29 17:20:46
  • 二叉树的右侧视图java实现

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre...

    2024-02-29 17:20:39
  • python调用nmap扫描全端口_使用python-nmap 搭建基本端口扫描器

    一、前言注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担任何责任林子大了什么鸟都有。网络发达了,什么人都有。开源程序也是人开发的,漏洞在所难免。当不正当的人...

    2024-02-29 17:20:33
  • 神经网络拟合二次函数

    神经网络拟合二次函数

    调用Nndl实现的神经网络code,用ANN拟合二次方程。ref: https://github.com/mnielsen/neural-networks-and-deep-learning准备训练数据#np.shape(x)x=np.array(xrange(0,100))/100.0f=x*x# train=np.array([[xi],[fi]] for xi,fi in zip...

    2024-02-29 17:20:24
  • 【postgres】备份还原数据库

    【postgres】备份还原数据库

    执行以下代码,在执行drop。

    2024-02-29 17:19:57
  • 阿里核心总结的SpringBoot学习笔记,这也太全了吧!

    阿里核心总结的SpringBoot学习笔记,这也太全了吧!

    包括底层实现原理及代码实战,非常齐全,助你快速打通 Spring Boot 的各个环节。2. Spring boot 返回 json 数据3. Spring boot 使用其他 json 转换框架4....

    2024-02-29 17:19:48
  • 在NodeJS中使用art-template的方法案例

    在NodeJS中使用art-template的方法案例

    第一步:下载安装art-template 安装命令: npm install art-template 该命令在哪执行就会把包下载到哪里。默认会下载到 node_modules 目录中 node_mo...

    2024-02-29 17:19:41
  • 显示器分辨率、刷新率对HDMI和DP线材要求

    显示器分辨率、刷新率对HDMI和DP线材要求

    2024-02-29 17:19:12