SpringBoot-SSMP超详细整合案例

SpringBoot-SSMP超详细整合案例

案例实现方案分析与流程解析–适合于所有管理系统

文章目录

  • SpringBoot-SSMP超详细整合案例
      • 案例实现方案分析与流程解析--适合于所有管理系统
        • **后端开发:需要前端资料的关注我,私信发**
      • 一.模块创建
      • 二.导入需要用到的技术坐标以及sql文件
      • 三.实体类快速开发(lombok)
      • 四.数据层标准开发(基础CRUD)
      • 五.分页
      • 六.业务层快速开发(基于MyBatisPlus构建)
        • 总结:
      • 七.表现层标准开发
        • Postaman的简单使用
      • 总结:
      • **八.表现层数据一致性处理(R对象)**
        • 到这里后端开发基本上差不多完成了,前端开发这里不做介绍了,想要前端的资料关注私聊发,但是条件查询的时候需要改一下后端代码,下面将修改代码。
      • 九.异常消息处理
        • 小结:
      • 十.条件查询
      • 十一.案例演示
      • 总结:


@[TOC](这里写自定义目录标题)

后端开发:需要前端资料的关注我,私信发

  1. 案例实现方案分析
    实体类开发————使用Lombok快速制作实体类
    Dao开发————整合MyBatisPlus,制作数据层测试类
    Service开发————基于MyBatisPlus进行增量开发,制作业务层测试类
    Controller开发————基于Restful开发,使用PostMan测试接口功能
    Controller开发————前后端开发协议制作
    页面开发————基于VUE+ElementUI制作,前后端联调,页面数据处理,页面消息处理
    列表、新增、修改、删除、分页、查询
    项目异常处理
    按条件查询————页面功能调整、Controller修正功能、Service修正功能
  2. SSMP案例制作流程解析
    先开发基础CRUD功能,做一层测一层
    调通页面,确认异步提交成功后,制作所有功能
    添加分页功能与查询功能

一.模块创建

(1)配置信息

SpringBoot-SSMP超详细整合案例_第1张图片

(2)选择技术集

SpringBoot-SSMP超详细整合案例_第2张图片

二.导入需要用到的技术坐标以及sql文件

1.pom.xml文件

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

SpringBoot-SSMP超详细整合案例_第3张图片

点击刷新按钮(选择其中一个即可)

SpringBoot-SSMP超详细整合案例_第4张图片

2.tbl_book.sql文件

DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(20) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- 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设计模式', '深入Spring源码剖析Spring源码中蕴含的10大设计模式');
INSERT INTO `tbl_book` VALUES ('4', '计算机理论', 'Spring MVC+ MyBatis开发从入门到项目实战', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
INSERT INTO `tbl_book` VALUES ('5', '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
INSERT INTO `tbl_book` VALUES ('6', '计算机理论', 'Java核心技术卷|基础知识(原书第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+');

3.创建数据库

(1)创建数据库连接

SpringBoot-SSMP超详细整合案例_第5张图片

(2)粘贴完之后运行

SpringBoot-SSMP超详细整合案例_第6张图片

(3)建表完成

image-20221011154135396

(4)修改配置文件为yml格式

SpringBoot-SSMP超详细整合案例_第7张图片

(5)设置端口为80方便访问

server:
  port: 80

image-20221011154345263

三.实体类快速开发(lombok)

  • Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发
    <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
  • lombok版本由SpringBoot提供,无需指定版本
  • 常用注解:@Data
  • 为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法等
@Data
//对应数据库中的字段名
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

四.数据层标准开发(基础CRUD)

1.导入MyBatisPlus与Druid对应的starter

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

2.配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
      username: root
      password: root

#MybatisPlus
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto #自增

3.继承BaseMapper并指定泛型

@Mapper
public interface BookDao extends BaseMapper<Book> {
}

4.为方便调试可以开启MyBatisPlus的日志

configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.制作测试类结果

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

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

    @Test
    void testSave() {
        Book book = new Book();
        book.setType("测试数据123");
        book.setName("测试数据123");
        book.setDescription("测试数据123");
        bookDao.insert(book);
    }

    @Test
    void testUpdate() {
        Book book = new Book();
        book.setId(13);
        book.setType("测试数据asfd");
        book.setName("测试数据123");
        book.setDescription("测试数据123");
        bookDao.updateById(book);
    }

    @Test
    void testDelete() {
        bookDao.deleteById(13);
    }

    @Test
    void testGetAll() {
        System.out.println(bookDao.selectList(null));
    }

    @Test
    void testGetPage() {
    }

    @Test
    void testGetBy() {
    }
}

五.分页

  • 分页操作需要设定分页对象IPage
    @Test
    void testGetPage() {
        IPage page = new Page(1, 5);
        bookDao.selectPage(page, null);
    }
  • IPage对象中封装了分页操作中的所有数据
    数据
    当前页码值
    每页数据总量
    最大页码值
    数据总量
  • 分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句因此需要增强对应的功能,
    使用MyBatisPlus拦截器实现
/**
 * @author QGC
 * @create 2022-10-11 16:13
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1. 定义 Mp 拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //2. 添加具体的拦截器 分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
  1. 使用IPage封装分页数据
  2. 分页操作依赖MyBatisPlus分页拦截器实现功能
  3. 借助MyBatisPlus日志查阅执行SQL语句
  • 使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用
    @Test
    void testGetBy2() {
        LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(Book::getName, "Spring");
        bookDao.selectList(lambdaQueryWrapper);
    }
    @Test
    void testGetBy() {
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", "Spring");
        bookDao.selectList(queryWrapper);
    }
  • 支持动态拼写查询条件
    @Test
    void testGetBy2() {
        String name = "1";
        LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //if (name != null) lambdaQueryWrapper.like(Book::getName,name);
        lambdaQueryWrapper.like(Strings.isNotEmpty(name), Book::getName, name);
        bookDao.selectList(lambdaQueryWrapper);
    }
  1. 使用QueryWrapper对象封装查询条件
  2. 推荐使用LambdaQueryWrapper对象
  3. 所有查询操作封装成方法调用
  4. 查询条件支持动态条件拼装

六.业务层快速开发(基于MyBatisPlus构建)

快速开发方案
使用MyBatisPlus提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl
在通用类基础上做功能重载或功能追加
注意重载时不要覆盖原始操作,避免原始提供的功能丢失

  • 接口定义
public interface IBookService extends IService<Book> {
}
  • 接口追加功能
public interface IBookService extends IService<Book> {

    // 追加的操作与原始操作通过名称区分,功能类似
    Boolean delete(Integer id);

    Boolean insert(Book book);

    Boolean modify(Book book);

    Book get(Integer id);
}
  • 实现类定义以及追加功能
@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService {

    @Autowired
    private BookDao bookDao;

    public Boolean insert(Book book) {
        return bookDao.insert(book) > 0;
    }

    public Boolean modify(Book book) {
        return bookDao.updateById(book) > 0;
    }

    public Boolean delete(Integer id) {
        return bookDao.deleteById(id) > 0;
    }

    public Book get(Integer id) {
        return bookDao.selectById(id);
    }
}
  • 测试类定义
@SpringBootTest
public class BookServiceTest {

    @Autowired
    private IBookService bookService;

    @Test
    void testGetById() {
        System.out.println(bookService.getById(4));
    }

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

    @Test
    void testUpdate() {
        Book book = new Book();
        book.setId(14);
        book.setType("===========");
        book.setName("测试数据123");
        book.setDescription("测试数据123");
        bookService.updateById(book);
    }

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

    @Test
    void testGetAll() {
        System.out.println(bookService.list());
    }

    @Test
    void testGetPage() {
        IPage<Book> page = new Page<>(2, 5);
        bookService.page(page);
        System.out.println(page.getCurrent());
        System.out.println(page.getSize());
        System.out.println(page.getPages());
        System.out.println(page.getTotal());
        System.out.println(page.getRecords());
    }
}

总结:

  1. 使用通用接口(ISerivce)快速开发Service
  2. 使用通用实现类(ServiceImpl)快速开发ServiceImpl
  3. 可以在通用接口基础上做功能重载或功能追加
  4. 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

七.表现层标准开发

  • 基于Restful进行表现层接口开发
  • 使用Postman测试表现层接口功能

1.表现层开发

/**
 * @author QGC
 * @create 2022-10-11 16:37
 */
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private IBookService bookService;

    @GetMapping
    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.modify(book);
    }

    @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 Integer currentPage, @PathVariable int pageSize) {
        return bookService.getPage(currentPage, pageSize);
    }
}

2.添加分页的业务层方法

IBookService

 IPage<Book> getPage(int currentPage,int pageSize);

BookServiceImpl

    @Override
    public IPage<Book> getPage(int currentPage, int pageSize) {

        IPage page = new Page(currentPage, pageSize);
        bookDao.selectPage(page, null);

        return page;
    }

3.功能测试(使用postman)

Postaman的简单使用

Postman界面

SpringBoot-SSMP超详细整合案例_第8张图片

一些常用的按钮

SpringBoot-SSMP超详细整合案例_第9张图片

1.GET请求----查询

SpringBoot-SSMP超详细整合案例_第10张图片

2.PUT请求----修改

SpringBoot-SSMP超详细整合案例_第11张图片

3.POST----添加

SpringBoot-SSMP超详细整合案例_第12张图片

4.DELETE----删除

SpringBoot-SSMP超详细整合案例_第13张图片

总结:

  1. 基于Restful制作表现层接口
    新增:POST
    删除:DELETE
    修改:PUT
    查询:GET
  2. 接收参数
    实体数据:@RequestBody
    路径变量:@PathVariable

八.表现层数据一致性处理(R对象)

  • 设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议
@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;
    }
}
  • 表现层接口统一返回值类型结果
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private IBookService bookService;

    @GetMapping
    public R getAll() {
        return new R(true, bookService.list());
    }

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

    }

    @PutMapping
    public R update(@RequestBody Book book) {
        return new R(bookService.modify(book));
    }

    @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 Integer currentPage, @PathVariable int pageSize) {
        return new R(true, bookService.getPage(currentPage, pageSize));
    }
}

到这里后端开发基本上差不多完成了,前端开发这里不做介绍了,想要前端的资料关注私聊发,但是条件查询的时候需要改一下后端代码,下面将修改代码。

九.异常消息处理

  • 对异常进行统一处理,出现异常后,返回指定信息
/**
 * @author QGC
 * @create 2022-10-11 17:09
 */
@RestControllerAdvice
public class ProjectExceptionAdvice {

    //拦截所有的异常信息
    @ExceptionHandler(Exception.class)
    public R doException(Exception ex) {
        // 记录日志
        // 发送消息给运维
        // 发送邮件给开发人员 ,ex 对象发送给开发人员
        ex.printStackTrace();
        return new R( "系统错误,请稍后再试!");
    }
}
  • 可以在表现层Controller中进行消息统一处理
    @PostMapping
    public 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 ? "添加成功^_^" : "添加失败-_-!");
    }

小结:

  1. 使用注解@RestControllerAdvice定义SpringMVC异常处理器用来处理异常的
  2. 异常处理器必须被扫描加载,否则无法生效
  3. 表现层返回结果的模型类中添加消息属性用来传递消息到页面

十.条件查询

  • 条件参数组织可以通过条件判定书写的更简洁

  • Controller接收参数

@GetMapping("{currentPage}/{pageSize}")
public R getAll(@PathVariable int currentPage,@PathVariable int pageSize,Book book) {
	System.out.println("参数=====>"+book);
	IPage<Book> pageBook = bookService.getPage(currentPage,pageSize);
	return new R(null != pageBook ,pageBook);
}
  • 业务层接口功能开发
     /**
   * 分页的条件查询
   *
   * @param currentPage
   * @param pageSize
   * @param book
   * @return
   */
  IPage<Book> getPage(Integer currentPage, int pageSize, Book book);

  • 业务层接口实现类功能开发
    @Override
    public IPage<Book> getPage(Integer currentPage, int pageSize, Book book) {

        LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();

        lambdaQueryWrapper.like(Strings.isNotEmpty(book.getType()), Book::getType, book.getType());
        lambdaQueryWrapper.like(Strings.isNotEmpty(book.getName()), Book::getName, book.getName());
        lambdaQueryWrapper.like(Strings.isNotEmpty(book.getDescription()), Book::getDescription, book.getDescription());

        IPage page = new Page(currentPage, pageSize);
        bookDao.selectPage(page, lambdaQueryWrapper);

        return page;
    }

  • Controller调用业务层分页条件查询接口
    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable Integer currentPage, @PathVariable int pageSize, Book book) {

        // System.out.println("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);
    }

前端目录显示:

SpringBoot-SSMP超详细整合案例_第14张图片

十一.案例演示

1.在idea中启动项目

SpringBoot-SSMP超详细整合案例_第15张图片

2.浏览器输入

image-20221011171943352

3.页面展示

SpringBoot-SSMP超详细整合案例_第16张图片

总结:

基于SpringBoot的SSMP整合案例
pom.xml
配置起步依赖

application.yml
设置数据源、端口、框架技术相关配置等

dao继承BaseMapper、设置@Mapper
dao测试类

service
调用数据层接口或MyBatis-Plus提供的接口快速开发

service测试类

controller
基于Restful开发,使用Postman测试跑通功能

你可能感兴趣的:(spring,boot,后端,java)