SpringBoot的SSMP案例(后端开发)

简介: SpringBoot的SSMP案例(后端开发)

在这里插入图片描述

🍁博客主页:👉不会压弯的小飞侠
✨欢迎关注:👉点赞👍收藏⭐留言✒
✨系列专栏:👉SpringBoot专栏(每日更新)

 🔥SpringBoot入门案例-阿里云版和纯手工版:👉[点击查看](https://editor.csdn.net/md/?articleId=125673623)

✨如果觉得博主的文章还不错的话,请三连支持一下博主。
🔥欢迎大佬指正,一起学习!一起加油!
在这里插入图片描述

✨创建数据表

创建一个tbl_book表
在这里插入图片描述
在这里插入图片描述

✨IDEA配置MySQL数据库连接

🔥详细步骤操作👉 点击直接查看

✨搭建项目

不同版本的搭建项目在我springboot专栏里,本次项目采用的是阿里云版。模块的创建就不用多说了。
⭐注意:选择需要的技术
在这里插入图片描述
在这里插入图片描述
⭐Lombok开发工具可以简化实体类的开发。
在这里插入图片描述
🔥导入druid的依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.11</version>
        </dependency>

🔥设置服务器端口号:

server:
  port: 80

🔥Lombok注解
常用注解: @Data @setter @Getter

  • @Data

    • 为当前实体类在编译期设置对应的get/set,toString方法,hashCode方法,equals方法等。
    • @Constructor

      • @AllArgsConstructor: 有参构造
      • @NoArgsConstructor: 无参构造

🔥Book

package com.jkj.domain;
import lombok.*;
//@Setter
//@Getter
@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

✨数据层开发

🔥编写yml

server:
  port: 80

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    
 mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_

🔥编写Dao层(采用MyBatis-Plus技术)

package com.jkj.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jkj.domain.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BookMapper extends BaseMapper<Book> {

}

🔥测试MyBatis-Plus的其他操作

package com.jkj.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.jkj.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 SsmpTest {
    @Autowired
    private BookMapper bookMapper;
    @Test
    void findById() {
        System.out.println(bookMapper.selectById(2));
    }
    @Test
    void insert() {
        Book book=new Book();
        book.setName("springboot");
        book.setType("框架");
        book.setDescription("好用");
        bookMapper.insert(book);
    }
    @Test
    void updateById() {
        Book book=new Book();
        book.setId(4);
        book.setDescription("666");
        bookMapper.updateById(book);
    }

    @Test
    void delete() {
        bookMapper.deleteById(4);

    }
    @Test
    void findAll() {
        bookMapper.selectList(null);
    }
}

🔥注意:在进行添加操作过程中,会爆id自增的问题在yml文件中添加这行代码: id-type: auto

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto

✨开启MP运行日志

🔥编辑yml

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

🔥测试类

 @Test
    void findAll() {
        bookMapper.selectList(null);

    }

在这里插入图片描述

✨分页查询

🔥编写拦截器MPConfig类

package com.jkj.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(){
        //定义MP拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加具体拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

🔥分页测试

    @Test
    void page(){
        IPage page = new Page(2,5);
        bookMapper.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());

    }

在这里插入图片描述

✨条件查询

🔥编写测试类
推荐使用

  • 使用 QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用。
    //推荐使用
    @Test
    void ByCondition1(){
        String name="一";
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
        //支持动态拼写查询条件
        lqw.like(name!=null,Book::getName,name);
        bookMapper.selectList(lqw);
    }
  @Test
    void ByCondition(){
        QueryWrapper<Book> wrapper = new QueryWrapper<>();
        wrapper.like("name","一");
        bookMapper.selectList(wrapper);
    }

在这里插入图片描述

✨业务层开发

🔥基础(CRUD)

  • Service层接口定义与数据层接口定义具有较大区别,不要混用。

    • selectByUserNameAndPassword(String username, String password);
    • login(String username , string password );

🔥编写service层

package com.jkj.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jkj.domain.Book;

import java.util.List;

public interface BookService {
    Boolean save(Book book);
    Boolean update(Book book);
    Boolean delete(Integer id);
    Book selectById(Integer id);
    List<Book> SelectAll();
    IPage<Book> getPage(int currentPage,int pageSize);

}

🔥实现类

package com.jkj.service.impl;

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

import java.util.List;
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookMapper bookMapper;
    @Override
    public Boolean save(Book book) {
        return bookMapper.insert(book)>0;
    }

    @Override
    public Boolean update(Book book) {
        return bookMapper.updateById(book)>0;
    }

    @Override
    public Boolean delete(Integer id) {
        return bookMapper.deleteById(id)>0;
    }

    @Override
    public Book selectById(Integer id) {
        return bookMapper.selectById(id);
    }

    @Override
    public List<Book> SelectAll() {
        return bookMapper.selectList(null);
    }

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

🔥测试类

package com.jkj.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jkj.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(required = true)
    private BookService bookService;

    @Test
    void testGetById(){
        System.out.println(bookService.selectById(1));
    }

    @Test
    void testSave(){
        Book book = new Book();
        book.setType("测试");
        book.setName("测试");
        book.setDescription("测试");
        bookService.save(book);
    }

    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(11);
        book.setType("测试1");
        book.setName("测试1");
        book.setDescription("测试1");
        bookService.update(book);
    }

    @Test
    void testDelete(){
        bookService.delete(14);
    }

    @Test
    void testGetAll(){
        bookService.SelectAll();
    }

    @Test
    void testGetPage(){
        IPage<Book> page = new Page<Book>(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());
    }
}

🔥MyBatis-Plus快速开发

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

    • 在通用类基础上做功能重载或功能追加
  • 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

🔥service层接口定义

package com.jkj.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jkj.domain.Book;

public interface IBookService extends IService<Book> {
}

🔥实现类

package com.jkj.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jkj.dao.BookMapper;
import com.jkj.domain.Book;
import com.jkj.service.IBookService;
import org.springframework.stereotype.Service;
@Service
public class IBookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
}

🔥测试类

package com.jkj.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jkj.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 IBookServiceTest {
    @Autowired
    private IBookService iBookService;

    @Test
    void save(){
        Book b=new Book();
        b.setType("文学");
        b.setName("白鹿原");
        b.setDescription("好看");
        iBookService.save(b);
    }
    @Test
    void update(){
        Book b=new Book();
        b.setId(15);
        b.setType("文学");
        b.setName("白鹿原");
        b.setDescription("666");
        iBookService.updateById(b);
    }
    @Test
    void delete(){
        iBookService.removeById(15);
    }
    @Test
    void findById(){
        System.out.println(iBookService.getById(1));

    }
    @Test
    void findAll(){
        iBookService.list();
    }
    @Test
    void page(){
        IPage<Book> page = new Page<Book>(2,5);
        iBookService.page(page);
        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());

    }
}

✨表现层开发(前后端数据协调统一)

  • 基于Restful进行表现层接口开发 (目前正在更新可到这里查看👉SpringBoot专栏
  • 使用Postman测试表现层接口功能(目前正在更新可到这里查看👉SpringBoot专栏

🔥标准版开发

🔥编写Controller类

package com.jkj.controller;

import com.jkj.domain.Book;
import com.jkj.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
/*@RestController
@RequestMapping("/book")*/
public class BookController {
    @Autowired
    private BookService bookService;
    @GetMapping
    public List<Book> selectAll(){
        return bookService.SelectAll();
    }
    @PostMapping
    public Boolean save(@RequestBody Book book){
        return bookService.save(book);
    }
    @PutMapping
    public Boolean update(@RequestBody Book book){
        return bookService.update(book);
    }
    @DeleteMapping("{id}")
    public Boolean delete(@PathVariable Integer id){
        return bookService.delete(id);
    }
    @GetMapping("{id}")
    public Book selectById(@PathVariable Integer id){
        return bookService.selectById(id);
    }
}

🔥启动postman测试
查全部
在这里插入图片描述
通过id查询
在这里插入图片描述
添增
在这里插入图片描述
修改
在这里插入图片描述
修改之后再查询一次
在这里插入图片描述
删除
在这里插入图片描述

🔥表现层消息一致性处理(前后端分离)

  • 设计表现层返回结果模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议。

🔥编写R.java

package com.jkj.controller.utils;

import lombok.Data;

@Data
public class R {
    private Boolean flag;
    private Object data;

    public R(){}

    public R(Boolean flag){
        this.flag = flag;
    }

    public R(Boolean flag,Object data){
        this.flag = flag;
        this.data = data;
    }
}

🔥编写IController类

package com.jkj.controller;
import com.jkj.domain.Book;
import com.jkj.controller.utils.R;
import com.jkj.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/book")
public class IBookController {
    @Autowired
    private IBookService iBookService;
    @GetMapping
    public R selectAll(){
        return new R(true,iBookService.list());
    }
    @PostMapping
    public R save(@RequestBody Book book){
        /*R r = new R();
        boolean flag = iBookService.save(book);
        r.setFlag(flag);*/
        return new R(iBookService.save(book));
    }
    @PutMapping
    public R update(@RequestBody Book book){
        return new R(iBookService.updateById(book));
    }
    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id){
        return new R(iBookService.removeById(id));
    }
    @GetMapping("{id}")
    public R selectById(@PathVariable Integer id){
        return new R(true,iBookService.getById(id));
    }
}

🔥postman测试,如上。

在这里插入图片描述

相关文章
|
10天前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
80 2
|
5月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
460 1
|
6月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
429 7
|
6月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
399 70
|
3月前
|
XML 人工智能 IDE
Springboot整合SSMP报错分析
本文介绍了Springboot整合SSMP框架时常见的报错及解决方案,包括MyBatis-Plus版本不兼容导致的Lambda表达式条件构造器报错及表名不匹配问题。通过升级或降级MyBatis-Plus版本、使用@TableName注解或配置table-prefix属性,可有效解决上述问题,帮助开发者避免在整合SSMP时出现不必要的错误。
179 0
|
7月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
545 79
|
5月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
474 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
4月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
422 0
|
7月前
|
人工智能 自然语言处理 前端开发
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
本文介绍如何使用Spring Boot3与Vue2快速构建基于DeepSeek的AI对话系统。系统具备实时流式交互、Markdown内容渲染、前端安全防护等功能,采用响应式架构提升性能。后端以Spring Boot为核心,结合WebFlux和Lombok开发;前端使用Vue2配合WebSocket实现双向通信,并通过DOMPurify保障安全性。项目支持中文语义优化,API延迟低,成本可控,适合个人及企业应用。跟随教程,轻松开启AI应用开发之旅!