SSMP整合案例

学习视频链接: 黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战
完整代码链接: https://github.com/HaiLei-Fly/SpringBoot_ssmp

1、功能介绍

1.1 案例功能

  1. 实体类开发— —使用Lombok快速制作实体类
  2. Dao开发— —整合MyBatisPlus,制作数据层测试
  3. Service开发— —基于MyBatisPlus进行增量开发,制作业务层测试类
  4. Controller开发— —基于Restful开发
  5. Controller开发— —前后端开发协议制作
  6. 页面开发— —基于VUE+ElementUI制作,前后端联调,页面数据处理,页面消息处理
    • 列表
    • 新增
    • 修改
    • 删除
    • 分页
    • 查询
  7. 项目异常处理
  8. 按条件查询

1.2 案例效果

主页面


添加功能


删除功能


条件查询

2、工程准备

2.1 所需环境

MySQL 8.0.22
JDK 11.0.10
MAVEN 3.6.0
Navicat 16
IDEA 2021.3.3

2.2 新建SpringBoot工程

选择Spring Initializr


选择需要导入的技术集

3、数据库

建立表的sql语句

DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book`  (`id` int(11) NOT NULL AUTO_INCREMENT,`type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tbl_book
-- ----------------------------
INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Spring实战 第5版', 'Spring入门经典教程,深入理解Spring原理技术内幕');
INSERT INTO `tbl_book` VALUES (2, '计算机理论', 'Spring 5核心原理与30个类手写实战', '十年沉淀之作,手写Spring精华思想');
INSERT INTO `tbl_book` VALUES (3, '计算机理论', 'Spring 5设计模式', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
INSERT INTO `tbl_book` VALUES (4, '计算机理论', 'Spring MVC+MyBatis开发从入门到项目实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
INSERT INTO `tbl_book` VALUES (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
INSERT INTO `tbl_book` VALUES (6, '计算机理论', 'Java核心技术卷I基础知识(原书第11版)', 'Core Java第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新');
INSERT INTO `tbl_book` VALUES (7, '计算机理论', '深入理解Java虚拟机', '5个维度全面剖析JVM,大厂面试知识点全覆盖');
INSERT INTO `tbl_book` VALUES (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉');
INSERT INTO `tbl_book` VALUES (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术');
INSERT INTO `tbl_book` VALUES (10, '市场营销', '直播就该这么做:主播高效沟通实战指南', '李子染、李佳琦、薇娅成长为网红的秘密都在书中');
INSERT INTO `tbl_book` VALUES (11, '市场营销', '直播销讲实战—本通', '和秋叶—起学系列网络营销书籍');
INSERT INTO `tbl_book` VALUES (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '—本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');SET FOREIGN_KEY_CHECKS = 1;

tbl_book表

4、工程结构

项目整体结构


详细结构

配置pom.xml

<?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.7.1</version><relativePath/></parent><groupId>com.hailei</groupId><artifactId>springboot_ssmp</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>11</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><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>

配置application.yml

server:port: 80spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: 12345678mybatis-plus:global-config:db-config:table-prefix: tbl_id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5、功能实现(后端)

定义MP拦截器并将其设置为Spring管控的bean
MPConfig

package com.hailei.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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

在表现层做统一的异常处理,使用SpringMVC提供的异常处理器做统一的异常处理
ProjectExceptionAdvice

package com.hailei.controller.utils;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;//@ControllerAdvice
@RestControllerAdvice
public class ProjectExceptionAdvice {//拦截所有的异常信息@ExceptionHandler(Exception.class)public R doException(Exception ex){//记录日志//通知运维//通知开发ex.printStackTrace();return new R("服务器故障,请稍后再试!");}
}

将所有操作的操作结果数据格式统一起来,需要设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议
R

package com.hailei.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;}
}

表现层实现类如下
BookController

package com.hailei.controller;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hailei.controller.utils.R;
import com.hailei.domain.Book;
import com.hailei.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.io.IOException;@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic R getAll(){return new R(true, bookService.list());}@PostMappingpublic R save(@RequestBody Book book) throws IOException {if (book.getName().equals("123") ) throw new IOException();boolean flag = bookService.save(book);return new R(flag, flag ? "添加成功^_^" : "添加失败-_-!");}@PutMappingpublic R update(@RequestBody Book book) throws IOException {if (book.getName().equals("123") ) throw new IOException();boolean flag = bookService.modify(book);return new R(flag, flag ? "修改成功^_^" : "修改失败-_-!");}@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,Book book){IPage<Book> page = bookService.getPage(currentPage, pageSize,book);//如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值if( currentPage > page.getPages()){page = bookService.getPage((int)page.getPages(), pageSize,book);}return new R(true, page);}
}

数据层开发本次使用MyBatisPlus技术,数据源使用Druid
BookDao

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

实体类的开发可以自动通过工具手工生成get/set方法。Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发
Book

package com.hailei.domain;import lombok.Data;@Data
public class Book {private Integer id;private String type;private String name;private String description;
}

业务层实现类如下,转调数据层即可
BookServiceImpl

package com.hailei.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.hailei.dao.BookDao;
import com.hailei.domain.Book;
import com.hailei.service.BookService;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {@Autowiredprivate BookDao bookDao;@Overridepublic boolean saveBook(Book book) {return bookDao.insert(book) > 0;}@Overridepublic boolean modify(Book book) {return bookDao.updateById(book) > 0;}@Overridepublic boolean delete(Integer id) {return bookDao.deleteById(id) > 0;}@Overridepublic IPage<Book> getPage(int currentPage, int pageSize) {IPage page = new Page(currentPage,pageSize);bookDao.selectPage(page,null);return page;}@Overridepublic IPage<Book> getPage(int currentPage, int pageSize, Book book) {LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();lqw.like(Strings.isNotEmpty(book.getType()),Book::getType,book.getType());lqw.like(Strings.isNotEmpty(book.getName()),Book::getName,book.getName());lqw.like(Strings.isNotEmpty(book.getDescription()),Book::getDescription,book.getDescription());IPage page = new Page(currentPage,pageSize);bookDao.selectPage(page,lqw);return page;}
}

业务层接口定义如下
BookService

package com.hailei.service;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hailei.domain.Book;public interface BookService extends IService<Book> {boolean saveBook(Book book);boolean modify(Book book);boolean delete(Integer id);IPage<Book> getPage(int currentPage, int pageSize);IPage<Book> getPage(int currentPage,int pageSize,Book book);
}

SSMPApplication

package com.hailei;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SSMPApplication {public static void main(String[] args) {SpringApplication.run(SSMPApplication.class);}}

6、功能实现(前端)

books

<!DOCTYPE html><html><head><!-- 页面meta --><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>基于SpringBoot整合SSM案例</title><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"><!-- 引入样式 --><link rel="stylesheet" href="../plugins/elementui/index.css"><link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css"><link rel="stylesheet" href="../css/style.css"></head><body class="hold-transition"><div id="app"><div class="content-header"><h1>图书管理</h1></div><div class="app-container"><div class="box"><div class="filter-container"><el-input placeholder="图书类别" v-model="pagination.type" style="width: 200px;" class="filter-item"></el-input><el-input placeholder="图书名称" v-model="pagination.name" style="width: 200px;" class="filter-item"></el-input><el-input placeholder="图书描述" v-model="pagination.description" style="width: 200px;" class="filter-item"></el-input><el-button @click="getAll()" class="dalfBut">查询</el-button><el-button type="primary" class="butT" @click="handleCreate()">新建</el-button></div><el-table size="small" current-row-key="id" :data="dataList" stripe highlight-current-row><el-table-column type="index" align="center" label="序号"></el-table-column><el-table-column prop="type" label="图书类别" align="center"></el-table-column><el-table-column prop="name" label="图书名称" align="center"></el-table-column><el-table-column prop="description" label="描述" align="center"></el-table-column><el-table-column label="操作" align="center"><template slot-scope="scope"><el-button type="primary" size="mini" @click="handleUpdate(scope.row)">编辑</el-button><el-button type="danger" size="mini" @click="handleDelete(scope.row)">删除</el-button></template></el-table-column></el-table><!--分页组件--><div class="pagination-container"><el-paginationclass="pagiantion"@current-change="handleCurrentChange":current-page="pagination.currentPage":page-size="pagination.pageSize"layout="total, prev, pager, next, jumper":total="pagination.total"></el-pagination></div><!-- 新增标签弹层 --><div class="add-form"><el-dialog title="新增图书" :visible.sync="dialogFormVisible"><el-form ref="dataAddForm" :model="formData" :rules="rules" label-position="right" label-width="100px"><el-row><el-col :span="12"><el-form-item label="图书类别" prop="type"><el-input v-model="formData.type"/></el-form-item></el-col><el-col :span="12"><el-form-item label="图书名称" prop="name"><el-input v-model="formData.name"/></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="描述"><el-input v-model="formData.description" type="textarea"></el-input></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button @click="cancel()">取消</el-button><el-button type="primary" @click="handleAdd()">确定</el-button></div></el-dialog></div><!-- 编辑标签弹层 --><div class="add-form"><el-dialog title="编辑检查项" :visible.sync="dialogFormVisible4Edit"><el-form ref="dataEditForm" :model="formData" :rules="rules" label-position="right" label-width="100px"><el-row><el-col :span="12"><el-form-item label="图书类别" prop="type"><el-input v-model="formData.type"/></el-form-item></el-col><el-col :span="12"><el-form-item label="图书名称" prop="name"><el-input v-model="formData.name"/></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="描述"><el-input v-model="formData.description" type="textarea"></el-input></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button @click="cancel()">取消</el-button><el-button type="primary" @click="handleEdit()">确定</el-button></div></el-dialog></div></div></div></div></body><!-- 引入组件库 --><script src="../js/vue.js"></script><script src="../plugins/elementui/index.js"></script><script type="text/javascript" src="../js/jquery.min.js"></script><script src="../js/axios-0.18.0.js"></script><script>var vue = new Vue({el: '#app',data:{dataList: [],//当前页要展示的列表数据dialogFormVisible: false,//添加表单是否可见dialogFormVisible4Edit:false,//编辑表单是否可见formData: {},//表单数据rules: {//校验规则type: [{ required: true, message: '图书类别为必填项', trigger: 'blur' }],name: [{ required: true, message: '图书名称为必填项', trigger: 'blur' }]},pagination: {//分页相关模型数据currentPage: 1,//当前页码pageSize:10,//每页显示的记录数total:0,//总记录数type: "",name: "",description: ""}},//钩子函数,VUE对象初始化完成后自动执行created() {//调用查询全部数据的操作this.getAll();},methods: {//分页查询getAll() {//组织参数,拼接url请求地址param = "?type="+this.pagination.type;param +="&name="+this.pagination.name;param +="&description="+this.pagination.description;//发送异步请求axios.get("/books/"+this.pagination.currentPage+"/"+this.pagination.pageSize+param).then((res)=>{this.pagination.pageSize = res.data.data.size;this.pagination.currentPage = res.data.data.current;this.pagination.total = res.data.data.total;this.dataList = res.data.data.records;});},//切换页码handleCurrentChange(currentPage) {//修改页码值为当前选中的页码值this.pagination.currentPage = currentPage;//执行查询this.getAll();},//弹出添加窗口handleCreate() {this.dialogFormVisible = true;this.resetForm();},//重置表单resetForm() {this.formData = {};},//添加handleAdd () {axios.post("/books",this.formData).then((res)=>{//判断当前操作是否成功if(res.data.flag){//1.关闭弹层this.dialogFormVisible = false;this.$message.success(res.data.msg);}else{this.$message.error(res.data.msg);}}).finally(()=>{//2.重新加载数据this.getAll();});},//取消cancel(){this.dialogFormVisible = false;this.dialogFormVisible4Edit = false;this.$message.info("当前操作取消");},// 删除handleDelete(row) {// console.log(row);this.$confirm("此操作永久删除当前信息,是否继续?","提示",{type:"info"}).then(()=>{axios.delete("/books/"+row.id).then((res)=>{if(res.data.flag){this.$message.success("删除成功");}else{this.$message.error("数据同步失败,自动刷新");}}).finally(()=>{//2.重新加载数据this.getAll();});}).catch(()=>{this.$message.info("取消操作");});},//弹出编辑窗口handleUpdate(row) {axios.get("/books/"+row.id).then((res)=>{if(res.data.flag && res.data.data != null ){this.dialogFormVisible4Edit = true;this.formData = res.data.data;}else{this.$message.error("数据同步失败,自动刷新");}}).finally(()=>{//2.重新加载数据this.getAll();});},//修改handleEdit() {axios.put("/books",this.formData).then((res)=>{//判断当前操作是否成功if(res.data.flag){//1.关闭弹层this.dialogFormVisible4Edit = false;this.$message.success("修改成功");}else{this.$message.error("修改失败");}}).finally(()=>{//2.重新加载数据this.getAll();});},//条件查询}})</script></html>

7、工程打包

跳过Test


clean命令


package命令


打包完成


终端运行


希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

黑马程序员SpringBoot基础篇SSMP整合案例相关推荐

  1. 黑马 程序员——Java基础---流程控制

    黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...

  2. 黑马 程序员——Java基础---IO(下)

    黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...

  3. 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...

    看黑马程序员Python基础班视频挺好,犹豫该不该报班? 如果看视频比较好的话,还是建议自学吧,毕竟录制视频的老师不一定参与实质的讲课,且能自学也省一笔培训费用了.我是看的bilibili上黑马程序员 ...

  4. 黑马程序员_java高级篇网络编程TCP实战Day8(上)

    ---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...

  5. 黑马程序员-黑马程序员训练营基础测试

    ---------------------- ASP.Net+Unity开发. .Net培训.期待与您交流! ---------------------- 为了帮助更多的人了解黑马,让更多想知道黑马测 ...

  6. 黑马程序员_基础测试

    -------android培训.java培训.期待与您交流! ---------- 黑马程序员训练营基础测试题及个人代码(包含思路.步骤和基本注释) 1. 编写程序计算12+22+32+....+1 ...

  7. 黑马程序员-iOS基础-Objective-C基础(六)内存管理

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序员-iOS基础-Objective-C基础(六)内存管理 一.内存管理的必要性 移动设备 ...

  8. 黑马程序员——JavaScript基础1(初识 JavaScript)

    文章目录 一.初识 JavaScript 1.1 JavaScript 是什么 1.2 JavaScript 的作用 1.3 HTML/CSS/JS 的关系 1.4 浏览器执行 JS 简介 1.5 J ...

  9. 黑马程序员 C++ 基础语法入门 学习记录

    基础语法入门 文章目录 一.初识C++ 1.1 新建项目 1.2 编写项目 1.3 运行程序 1.4 注释 1.5 变量 1.6 常量 1.7 关键字 1.8 标识符命名规则 二.数据类型 2.1 整 ...

  10. 黑马程序员--Java基础加强篇

    开发工具使用 --------------------------------------------------------------------------------------------- ...

最新文章

  1. 【进展】不只是感谢信,物联网平台哪家强?冰箱运行监测系统项目重启
  2. R开发(part11)--基于S4的面向对象编程
  3. 直播平台虚拟币与人民币的关系
  4. 计算机网络之网络层:9、BGP协议
  5. 45 SD配置-销售凭证设置-分配订单类型/状态参数文件
  6. Java使用Springboot集成Es官方推荐(RestHighLevelClient)
  7. file.delete删除不了文件_巧用磁盘清理,彻底清除Windows系统垃圾文件
  8. main方法 如何去掉http debug日志_Spring Boot 常见错误及解决方法
  9. educoder Redis安全与性能
  10. 【Java后台】从零开始的Java后台开发(一)
  11. 3D STL文件解析
  12. xp系统总是弹出宽带连接服务器,XP系统电脑总是弹出拨号连接怎么办-系统城...
  13. minecraft服务器stats文件夹,《我的世界》文件夹目录作用讲述
  14. [机器学习基石]台大林轩田笔记1 -- The Learning Problem
  15. 蜕变测试(metamorphic testing)经典论文阅读 Compiler Validation via Equivalence Modulo Inputs
  16. Vue 设置图片不转为base64
  17. 单片机 数码管0~F显示
  18. 避坑:git在push本地文件到远程时,报错ailed to push some refs to https://xx/xx.git的解决办法
  19. intellijnbsp;idenbsp;激活
  20. 软考系统集成项目管理工程师视频教程(计算机系统集成部分)-乔俊峰-专题视频课程...

热门文章

  1. CollectionUtils取交集,并集和差集
  2. The semaphore timeout period has expired
  3. SAP 获取不同币种间的汇率 RFC BAPI_EXCHANGERATE_GETDETAIL
  4. 基于百度指数的股票收益率多因子模型研究
  5. C语言_循环队列具体实现
  6. 《程序员必读之软件架构》作者Simon Brown:架构师与程序员的区别
  7. TAGE Branch Predictor/分支预测
  8. Oracle TFA日志收集工具简介
  9. Linux TCP Timestamps 没鸟用
  10. 名震GitHub,字节跳动内部顶级数据结构刷题学习笔记根本停不下来