第六篇:基于SpringBoot的SSMP整合案例 -- 后端开发篇

举报
花花叔叔 发表于 2022/08/12 22:14:07 2022/08/12
【摘要】 文章目录 案例实现方案分析数据库创建实体类开发数据层开发基本开发分页功能查询功能增删改 业务层开发增删改查分页业务层总结 表现层开发表现层消息一致性处理增加信息删除信息改查 案例...

案例实现方案分析

实体类开发————使用Lombok快速制作实体类
Dao开发————整合MyBatisPlus,制作数据层测试类
Service开发————基于MyBatisPlus进行增量开发,制作业务层测试类
Controller开发————基于Restful开发,使用PostMan测试接口功能,前后端开发协议制作
页面开发————基于VUE+ElementUI制作,前后端联调,页面数据处理,页面消息处理
列表、新增、修改、删除、分页、查询
项目异常处理
按条件查询————页面功能调整、Controller修正功能、Service修正功能

数据库创建

在这里插入图片描述

实体类开发

@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}

  

数据层开发

基本开发

@Mapper
public interface BookDao extends BaseMapper<Book> {

}

  

MyBatisPlus
Druid – 默认使用的是日本的一个叫做 光 的数据库

手工导入两个坐标

<!--        使用mp-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

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

  

配置文件

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

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

  

继承BaseMapper并指定泛型

@Mapper就可以不用写实体类,编译运行的时候就会自动生成
继承 extends BaseMapper 里面要写对应实体类 就是要操作哪一个bean对象。

@Repository   // 这个注释就是将bean对象存放到Spring容器中
@Mapper  // 这个注解就是编译的时候会自动生成实体类
public interface BookDao extends BaseMapper<Book> {

}

  

开发流程

  1. 手工导入starter坐标(2个) 一个是mp坐标,一个是druid
  2. 配置数据源与MyBatisPlus对应的配置 – 配置坐标不知道的信息,比如哪一个数据库,数据库账号和密码
  3. 开发Dao接口(继承BaseMapper)-- 继承这个类之后,就相当于产生了很多种已经写好的方法了。直接调用即可。
  4. 制作测试类测试Dao功能是否有效

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

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

  

分页功能

分页操作需要设定分页对象IPage

@Test
void testGetPage(){
IPage page = new Page(1,5);
bookDao.selectPage(page,null);
}

  

bookDao中有一个方法叫做selectPage的方法,就可以实现分页效果,一个参数是Ipage对象,一个参数对象是null;

Ipage对象的参数是 第一个参数指的是显示第几页信息,第二个参数指的是一页展示几条数据。

selectPage返回对象就是上面定义的page对象。

System.out.println(page.getRecords());

还需要注意的是,需要再写一个拦截器。分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现。

package com.itheima.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() {

        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

        return interceptor;

    }

}


  

查询功能

推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用

    //    条件查询功能
    @Test
    void testGetByCondition() {

        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper();

        String name = "Spring";

        lqw.like(name != null ,Book::getName , name);

        bookDao.selectList(lqw);

    }

  

还有一个方法就是可以通过id直接查询到对象信息。

//    测试通过id进行查询
    @Test
    void contextLoads() {

        System.out.println(bookDao.selectById(1));

    }

  

还有一个获取全部信息的功能。

//    获取数据库的全部资料
    @Test
    void testGetAll() {

        System.out.println(bookDao.selectList(null));

    }

  

增删改

//    测试增加数据
    @Test
    void testSave() {

        Book book = new Book();

        book.setType("测试");

        book.setName("测试");

        book.setDescription("测试");

        bookDao.insert(book);

    }


  

删除 – 通过id进行数据删除

//    通过id删除数据
    @Test
    void testDelete() {

        bookDao.deleteById(10);

    }

  

更新 – 通过id修改数据信息,参数是Book对象,但是修改是通过id索引的。所以必须要写出id。

//    测试修改数据
    @Test
    void testUpdate() {

        Book book = new Book();

        book.setId(10);

        book.setType("测试");

        book.setName("测试");

        book.setDescription("测试");

        bookDao.updateById(book);

    }

  

业务层开发

使用MyBatisPlus提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl<M,T>,在通用类基础上做功能重载或功能追加。

接口

public interface IBookService extends IService<Book> {

//    自己写的方法
    Book findById(Integer id);

//    自己写的分页方法
    IPage<Book> getPage(int currentPage , int pageSize);

}


  

实体类

@Service
public class BookServlceImpl extends ServiceImpl<BookDao, Book> implements IBookService {

    @Autowired
    private BookDao bookDao;
    

    @Override
    public Book findById(Integer id) {

        return  bookDao.selectById(id);

    }

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

        IPage page = new Page(currentPage,pageSize);

        bookDao.selectPage(page,null);

        return page;
    }


}

  

增删改

//    测试增加数据
    @Test
    void testSave() {

        Book book = new Book();

        book.setType("测试");

        book.setName("测试");

        book.setDescription("测试");

        iBookService.save(book);

    }

  

//    通过id删除数据
    @Test
    void testDelete() {

        iBookService.removeById(8);

    }

  

//    测试修改数据
    @Test
    void testUpdate() {

        Book book = new Book();

        book.setId(11);

        book.setType("测试");

        book.setName("测试");

        book.setDescription("测试");

        boolean b = iBookService.updateById(book);

    }

  

查询所有信息

//    获取数据库的全部资料
    @Test
    void testGetAll() {

        System.out.println(iBookService.list());

    }

  

通过id进行查询

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

  

分页

//    分页效果
    @Test
    void testGetPage() {

        IPage page = new Page(1,5);

        iBookService.page(page);

    }

  

业务层总结

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

表现层开发

表现层消息一致性处理

在这里插入图片描述

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

@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;
    }
}


  

增加信息

post提交方式,前端传送的是json数据,需要使用@RequestBody

@PostMapping
    public R save(@RequestBody Book book) {

        return new R(bookService.save(book));

    }

  

删除信息

Delete提交方式,只需要提交一个参数id给后端,需要url有一个占位符。

//    删除操作
    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id) {

        return new R(bookService.removeById(id));

//        return bookService.removeById(id);

    }

  

使用Put提交数据,前端需要传入json格式给后端,

//    更新数据操作
    @PutMapping
    public R update(@RequestBody Book book) {

//        return bookService.update(book,null);

        return new R(bookService.updateById(book));
    }

  

不需要添加任何东西

查询所有信息

//    查询所有的信息
    @GetMapping
    public R getAll() {

        return new R(true,bookService.list());

//        return bookService.list();

    }

  

根据id进行查询

//    根据id进行查询
    @GetMapping("{id}")
    public R getById(@PathVariable Integer id) {

        return new R(true,bookService.getById(id));
//        return bookService.getById(id);
    }

  

分页查询时自己写的

public interface IBookService extends IService<Book> {

//    自己写的方法
    Book findById(Integer id);

//    自己写的分页方法
    IPage<Book> getPage(int currentPage , int pageSize);

}

  
@Service
public class BookServlceImpl extends ServiceImpl<BookDao, Book> implements IBookService {

    @Autowired
    private BookDao bookDao;
    

    @Override
    public Book findById(Integer id) {

        return  bookDao.selectById(id);

    }

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

        IPage page = new Page(currentPage,pageSize);

        bookDao.selectPage(page,null);

        return page;
    }


}


  
//    分页查询
    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable int currentPage ,@PathVariable int pageSize) {

//        return bookService.getPage(currentPage,pageSize);
        return new R(true,bookService.getPage(currentPage,pageSize));
    }

  

需要注意的是,增删改返回结果都是布尔值,所以只需要使用一个参数的构造器,但是查询需要使用两个参数的构造器,这两个参数第一个参数都是true,第二个参数是获取的数据。

前端请求分为两种,一种是参数多的时候需要采用json格式,第二种是参数较少的时候采用url占位符书写。

文章来源: blog.csdn.net,作者:花花叔叔,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_52077949/article/details/122900772

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。