基于SpringBoot的SSMP整合(业务层表现层)

news2024/11/25 8:18:16

基于SpringBoot的SSMP整合(数据层)https://blog.csdn.net/weixin_51882166/article/details/128693739?spm=1001.2014.3001.5502

标准CRUD

Service层接口定义与数据层接口定义具有较大差距。

定义Service接口:

package com.example.ssmp_demo.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.ssmp_demo.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.example.ssmp_demo.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.ssmp_demo.dao.BookDao;
import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.io.*;

@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);
        return bookDao.selectPage(page, null);
    }
}

MyBatisPlus快速开发

定义接口:

package com.example.ssmp_demo.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.example.ssmp_demo.domain.Book;

public interface IBookService extends IService<Book> {
    
}

定义实现类:

package com.example.ssmp_demo.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.ssmp_demo.dao.BookDao;
import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.BookService;
import com.example.ssmp_demo.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



@Service//定义成业务层bean
public class BookServiceImpl extends ServiceImpl<BookDao,Book>implements IBookService {


}

测试:

package com.example.ssmp_demo.dao.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.IBookService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class test_demo {
    @Autowired
     private  IBookService bookService;
    @Test
    void test_getById(){
        System.out.println(bookService.getById(4));
    }
    @Test
    void test_save(){
        Book b=new Book();
        b.setId(11);
        b.setName("n11");
        b.setDescription("d11");
        b.setType("t11");
        bookService.save(b);
    }
    @Test
    void test_getAll(){
        bookService.list();
    }
    
    @Test
    void delete(){
        bookService.removeById(4);
    }
    @Test
    void test_page(){
        IPage<Book>page=new Page<Book>(1,4);
        bookService.page(page);
    }
    
    

}

原始数据集:

 保存操作:

 通过Id得到数据:

分页操作:

第一页前四行数据。

 所有数据:

 

如果在业务层接口,继续添加方法,注意写@Override查看是否报错,如果不报错就是命名相同,会把之前的方法给覆盖掉。

快速开发

使用MyBatisPlus提供有业务层通用接口(IService<T>)与业务层通用实现类(ServiceImp<M,T>)

在通用类基础上做功能重载或功能追加

注意重载不要覆盖元素操作,避免原始提供功能丢失。

表现层标准开发

创建包和类:

注意项目结构。 

package com.example.ssmp_demo.controller;

import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.io.*;
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired //自动装配
    private IBookService bookService;//调用业务层

    @GetMapping//查询是GET请求
    public List<Book>getAll(){
        return bookService.list();
    }

}

启动Application:

服务器启动后,使用postman发送get请求:

得到所有数据。 

将剩余方法放入Controller:

package com.example.ssmp_demo.controller;

import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired //自动装配
    private IBookService bookService;//调用业务层

    @GetMapping//查询是GET请求
    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.saveOrUpdate(book);
    }
    @GetMapping("{id}")
    public Book getById(@PathVariable Integer id){
        return bookService.getById(id);
    }

    @DeleteMapping("{id}")
    public Boolean delete(@PathVariable Integer id){
        return bookService.removeById(id);
    }



}

后期也可以在Conroller里添加方法。

使用Postman测试:

添加使用POST,并且使用请求体:

 

执行结果为true,查询所有,判断是否添加。 

存在,说明添加成功。 

测试删除,删除是通过路径传参,最后通过get查询是否存在。

 

 

 

 无内容说明删除成功。

增添分页操作,在接口里添加方法:

package com.example.ssmp_demo.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.ssmp_demo.domain.Book;

public interface IBookService extends IService<Book> {
 IPage<Book> getPage(int currentPage, int pageSize);

}

在其实现类里实现:

package com.example.ssmp_demo.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.ssmp_demo.dao.BookDao;
import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.BookService;
import com.example.ssmp_demo.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



@Service//定义成业务层bean
public class BookServiceImpl extends ServiceImpl<BookDao,Book>implements IBookService {
   @Autowired
   private BookDao bookDao;

    @Override
    public IPage<Book> getPage(int currentPage, int pageSize) {
        IPage<Book> page = new Page(currentPage, pageSize);
        bookDao.selectPage(page,null);
        return page;
    }
}

在原有Controller里添加方法:

 @GetMapping("{currentPage}/{pageSize}")
    public IPage<Book> getPage(@PathVariable int currentPage, @PathVariable int pageSize){
        return bookService.getPage(currentPage, pageSize);
    }

在PostMan里测试查询第2页三条数据:

新增:POST

删除:DELETE

修改:PUT

查询:GET

接收参数:

实体数据:@RequestBody

路径变量:@PathVariable

表现层数据一致性处理

 由于增删改查返回的数据不一致,需要统一格式,用于前后端数据格式统一,也称为前后端数据协议。

新建一个工具包和类:

 

package com.example.ssmp_demo.controller.utils;


import lombok.Data;

@Data
public class R {
    private Boolean flag;//操作是否完成
    private Object data;//适用于任何数据
    public R(Boolean flag){
        this.flag = flag;
    }
    public R(){}
    public R(Boolean flag,Object data){
        this.flag = flag;
        this.data = data;
    }

}

然后再新建一个Controller:

package com.example.ssmp_demo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.ssmp_demo.controller.utils.R;
import com.example.ssmp_demo.domain.Book;
import com.example.ssmp_demo.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.io.*;
@RestController
@RequestMapping("/books")
public class BookController_demo {
    @Autowired //自动装配
    private IBookService bookService;//调用业务层

    @GetMapping//查询是GET请求
    public R getAll(){
          return new R(true,bookService.list());
    }

    @PostMapping
    public R save(@RequestBody Book book){
       R r=new R(bookService.save(book));
       return r;
    }

    @PutMapping
    public R update(@RequestBody Book book){
        R r=new R(bookService.saveOrUpdate(book));
        return r;
    }
    @GetMapping("{id}")
    public R getById(@PathVariable Integer id){
        return new R(true,bookService.getById(id));
    }

    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id){
        R r=new R(bookService.removeById(id));
        return r;
    }
    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable int currentPage, @PathVariable int pageSize){
        return new R(true,bookService.getPage(currentPage, pageSize));
    }

}

启动之前注意把之前的Controller去掉,或更改RequestMapping路径.。

查询全部:

 分页,1页两数据:

 

剩余操作可自行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯STM32G431RBT6学习——LCD

蓝桥杯STM32G431RBT6学习——LCD 前言 作为在开发板上最显眼的LCD屏幕&#xff0c;自然而然也是每年的必考考点。国信长天开发板使用的是一块2.4寸&#xff08;240*320&#xff09;的TFT-LCD液晶屏&#xff0c;其引脚占用如下&#xff1a; 其中&#xff0c;CS为片选信号引脚…

【Netty】实现IM聊天室案例Demo

文章目录1、WebSocket链接建立2、实现用户上线功能3、私聊发送消息注意&#xff1a; 该文章不会详细介绍Netty相关概念和原理&#xff0c;主要目的是介绍如何快速构建聊天室Demo 不会在文章主体过多说明代码流程&#xff0c;文章中的代码已经配备了详细的注释 1、WebSocket链接…

网站建设 之 用js写wasm

为什么要这么做&#xff1f;编译js比解释js更快是必然的wasm是什么&#xff1f;我期望是一个二进制文件WebAssembly&#xff08;又名wasm&#xff09;是一种高效的&#xff0c;低级别的编程语言。 它让我们能够使用JavaScript以外的语言&#xff08;例如C&#xff0c;C &#x…

【Linux】进度条小程序

目录一.\r && \n二.行缓存区概念问题&#xff1a;解答&#xff1a;检测&#xff1a;三.进度条1.进度动态条2.进度百分比3.小装饰4.颜色该篇博客会主要按步骤推导出一个在Linux上运行的进度条小程序&#xff0c;会用到vim编辑器和gcc编译器&#xff0c;如果对这两个软件…

Centos7安装、卸载nginx及配置,配置成系统服务(一步到位)

目录 前言 一、下载安装解压 1.进入临时文件夹里&#xff08;随便一个都行&#xff09; 2.下载并安装nginx压缩包 3.解压该压缩包 4.创建目标文件夹 5.&#xff08;默认会安装在/usr/local/nginx&#xff09;这里通过configure命令指定安装目录 6.编译安装 7.最后生成的…

一、初始Numpy

1、numpy简介 简介 Numpy&#xff08;Numerical Python&#xff09;是Python语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库 Numpy的前身Numeric最早是有Jim Hugunin与其他协作者共同开发&#xff0c;20…

十五天学会Autodesk Inventor,看完这一系列就够了(九),主题/色彩/单位设置

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

使用SpringBoot创建web项目,并使用外部Tomcat

使用SpringBoot创建web项目&#xff0c;并使用外部Tomcat 目录使用SpringBoot创建web项目&#xff0c;并使用外部Tomcat简单介绍&#xff1a;特点&#xff1a;步骤简介下面就使用SpringBoot创建一个web工程&#xff0c;并且使用外部的Tomcat和实现对jsp的支持&#xff1a;一、创…

AIDL 应用间简单通信demo及基本问题

AIDL:Android Interface Definition Language,即Android接口定义语言。 他的作用大家已经知道了&#xff0c;有些童鞋对于其中的使用细节可能会有一些理解误差&#xff0c;并且会造成一写异常或者通讯失败。 我们先看几个关键点再看代码&#xff0c;如果项目不符合这几点&…

ffmpeg编译android平台-(ubuntu+ndkr16b+ffmpeg3.4.12)

一、环境配置 1、下载NDK,NDK老版本 1.1、 ubuntu下载 wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip1.2、解压NDK unzip android-ndk-r16b-linux-x86_64.zip1.3、配置NDK环境变量 vim /etc/profile1.4、 在profile文件中添加如下内容…

String.prototype.matchAll called with a non-global RegExp argument

如上 matchAll这个API 与 正则的全局匹配是不一样的。他会将匹配到的所有字符串以迭代器的形式返回出来。 我们可以使用Array.from或者数据解构来获得匹配到的数组。 他与正则全局匹配的区别是当正则表达式包含()捕获组的时候&#xff0c;全局匹配无法获得子匹配组的数据。 …

【Datewhale一起吃瓜 Task1】周志华西瓜书第一章+第二章

这里写目录标题机器学习是干什么的机器学习的理论基础: PAC模型基本术语关于数据关于假设关于模型训练机器学习任务分类归纳偏好模型的评估和选择训练流程划分数据集的方法留出法交叉验证自助法性能度量机器学习是干什么的 我们目前处于大数据时代&#xff0c;每天会产生数以亿…

一个监控系统的典型架构是什么样的

典型架构 采集器是负责采集监控数据的,采集到数据之后传输给服务端,通常是直接写入时序库。然后就是对时序库的数据进行分析和可视化,分析部分最典型的就是告警规则判断(复杂一些的会引入统计算法和机器学习的能力做预判),即图上的告警引擎,告警引擎产生告警事件之后交给…

华为MPLS跨域带RR实验配置

目录 Option B方案实验配置 配置建立Vpnv4邻居 配置反射器 配置RR和ASBR取消RT值检测 配置ASBR相连接口开启MPLS 配置ASBR向RR发送路由时更改下一跳 Option C1方案实验配置 Option C2方案实验配置 接口IP地址、底层IGP路由协议&#xff08;ISIS&#xff09;、MPLS LDP协…

一种环状二肽3705-26-8,cyclo(Pro-Phe),环(PHE-PRO)环状二肽

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;3705-26-8中文名&#xff1a;环(PHE-PRO)英文名&#xff1a;cyclo(Pro-Phe)&#xff0c;CYCLO(-PHE-PRO)结构式&#xff08;Structural&#xff09;&#xff1a;详细产品数据&#xff08;…

qq消息撤回

开发工具 工具名称工具类型说明AndroidStuduo编辑工具开发工具jadxjava工具将apk解成java项目xposed插件工具插件qq版本8.8.80 开始 先通过jadx把apk反编译出来源码&#xff0c;通过build出来&#xff0c;在android studio打开&#xff0c;方便分析。 要撤回自己的消息&…

TMC步进电机驱动stealthChop

一直觉得tmc系列的芯片功能很强大&#xff0c;但是我自己读寄存器手册的感觉就是每个字我都认识&#xff0c;怎么就这么难懂。。。。 stealthChop 是一种电压控制技术&#xff0c;基于电压斩波器的工作远离&#xff0c;可在低速中速范围内以最大扭矩实现绝对静音的步进电机控制…

【推荐】自用软件工具推荐 WIN

一、图片查看器 Honeyview 蜂蜜浏览器 免费的图像查看器 下载和功能说明 (bandisoft.com) 轻量而快速可以显示包括 GPS 信息在内的 JPEG 格式的 EXIF 信息对图像格式进行批量转换和调整大小支持显示 GIF 和 WebP 动图无需解压即可直接查看压缩包中的图像支持的格式 图像格式…

大厂整个项目的开发规范流程

第1节、大厂码农开发基础 内容 本章节给大家介绍在互联网做开发&#xff0c;基础环境、开发技术以及上线和监控都会用到哪些东西。一般互联网大厂像阿里、京东、腾讯等都会有公司自研的一些技术组件&#xff0c;比如&#xff1a;RPC、MQ、数据库路由等&#xff0c;但所有的这些…

API 网关的功能用途及实现方式

1. API 网关诞生背景 前言 API 经济生态链已经在全球范围覆盖&#xff0c; 绝大多数企业都已经走在数字化转型的道路上&#xff0c;API 成为企业连接业务的核心载体&#xff0c; 并产生巨大的盈利空间。快速增长的 API 规模以及调用量&#xff0c;使得企业 IT 在架构上、模式…