SpringBoot-SSMP超详细整合案例

£神魔★判官ぃ 2024-04-03 11:26 143阅读 0赞

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)配置信息

image-20221011152605536

(2)选择技术集

image-20221011152758199

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

1.pom.xml文件

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>druid-spring-boot-starter</artifactId>
  9. <version>1.2.6</version>
  10. </dependency>

image-20221011153444300

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

image-20221011154513375

2.tbl_book.sql文件

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

3.创建数据库

(1)创建数据库连接

image-20221011153832322

(2)粘贴完之后运行

image-20221011154010026

(3)建表完成

image-20221011154135396

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

image-20221011154305218

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

  1. server:
  2. port: 80

image-20221011154345263

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

  • Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发


    org.projectlombok
    lombok
  • lombok版本由SpringBoot提供,无需指定版本

  • 常用注解:@Data
  • 为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法等

    @Data
    //对应数据库中的字段名
    public class Book {

    1. private Integer id;
    2. private String type;
    3. private String name;
    4. private String description;

    }

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

1.导入MyBatisPlus与Druid对应的starter

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>druid-spring-boot-starter</artifactId>
  9. <version>1.2.6</version>
  10. </dependency>

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

  1. spring:
  2. datasource:
  3. druid:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
  6. username: root
  7. password: root
  8. #MybatisPlus
  9. mybatis-plus:
  10. global-config:
  11. db-config:
  12. table-prefix: tbl_
  13. id-type: auto #自增

3.继承BaseMapper并指定泛型

  1. @Mapper
  2. public interface BookDao extends BaseMapper<Book> {
  3. }

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

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

5.制作测试类结果

  1. @SpringBootTest
  2. public class BookDaoTestCase {
  3. @Autowired
  4. private BookDao bookDao;
  5. @Test
  6. void testGetById() {
  7. System.out.println(bookDao.getById(1));
  8. System.out.println(bookDao.selectById(1));
  9. }
  10. @Test
  11. void testSave() {
  12. Book book = new Book();
  13. book.setType("测试数据123");
  14. book.setName("测试数据123");
  15. book.setDescription("测试数据123");
  16. bookDao.insert(book);
  17. }
  18. @Test
  19. void testUpdate() {
  20. Book book = new Book();
  21. book.setId(13);
  22. book.setType("测试数据asfd");
  23. book.setName("测试数据123");
  24. book.setDescription("测试数据123");
  25. bookDao.updateById(book);
  26. }
  27. @Test
  28. void testDelete() {
  29. bookDao.deleteById(13);
  30. }
  31. @Test
  32. void testGetAll() {
  33. System.out.println(bookDao.selectList(null));
  34. }
  35. @Test
  36. void testGetPage() {
  37. }
  38. @Test
  39. void testGetBy() {
  40. }
  41. }

五.分页

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

    @Test

    1. void testGetPage() {
    2. IPage page = new Page(1, 5);
    3. bookDao.selectPage(page, null);
    4. }
  • IPage对象中封装了分页操作中的所有数据
    数据
    当前页码值
    每页数据总量
    最大页码值
    数据总量

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

    /**

    • @author QGC
    • @create 2022-10-11 16:13
      */
      @Configuration
      public class MybatisPlusConfig {

      @Bean
      public MybatisPlusInterceptor mybatisPlusInterceptor(){

      1. //1. 定义 Mp 拦截器
      2. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
      3. //2. 添加具体的拦截器 分页拦截器
      4. interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
      5. return interceptor;

      }
      }

  1. 使用IPage封装分页数据
  2. 分页操作依赖MyBatisPlus分页拦截器实现功能
  3. 借助MyBatisPlus日志查阅执行SQL语句

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

    @Test

    1. void testGetBy2() {
    2. LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    3. lambdaQueryWrapper.like(Book::getName, "Spring");
    4. bookDao.selectList(lambdaQueryWrapper);
    5. }

    @Test

    1. void testGetBy() {
    2. QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
    3. queryWrapper.like("name", "Spring");
    4. bookDao.selectList(queryWrapper);
    5. }
    • 支持动态拼写查询条件

    @Test

    1. void testGetBy2() {
    2. String name = "1";
    3. LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    4. //if (name != null) lambdaQueryWrapper.like(Book::getName,name);
    5. lambdaQueryWrapper.like(Strings.isNotEmpty(name), Book::getName, name);
    6. bookDao.selectList(lambdaQueryWrapper);
    7. }
  4. 使用QueryWrapper对象封装查询条件

  5. 推荐使用LambdaQueryWrapper对象
  6. 所有查询操作封装成方法调用
  7. 查询条件支持动态条件拼装

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

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

  • 接口定义

    public interface IBookService extends IService {

    }

  • 接口追加功能

    public interface IBookService extends IService {

  1. // 追加的操作与原始操作通过名称区分,功能类似
  2. Boolean delete(Integer id);
  3. Boolean insert(Book book);
  4. Boolean modify(Book book);
  5. Book get(Integer id);
  6. }
  • 实现类定义以及追加功能

    @Service
    public class BookServiceImpl extends ServiceImpl implements IBookService {

  1. @Autowired
  2. private BookDao bookDao;
  3. public Boolean insert(Book book) {
  4. return bookDao.insert(book) > 0;
  5. }
  6. public Boolean modify(Book book) {
  7. return bookDao.updateById(book) > 0;
  8. }
  9. public Boolean delete(Integer id) {
  10. return bookDao.deleteById(id) > 0;
  11. }
  12. public Book get(Integer id) {
  13. return bookDao.selectById(id);
  14. }
  15. }
  • 测试类定义

    @SpringBootTest
    public class BookServiceTest {

  1. @Autowired
  2. private IBookService bookService;
  3. @Test
  4. void testGetById() {
  5. System.out.println(bookService.getById(4));
  6. }
  7. @Test
  8. void testSave() {
  9. Book book = new Book();
  10. book.setType("测试数据qgc");
  11. book.setName("测试数据lxy");
  12. book.setDescription("测试数据qil");
  13. bookService.save(book);
  14. }
  15. @Test
  16. void testUpdate() {
  17. Book book = new Book();
  18. book.setId(14);
  19. book.setType("===========");
  20. book.setName("测试数据123");
  21. book.setDescription("测试数据123");
  22. bookService.updateById(book);
  23. }
  24. @Test
  25. void testDelete() {
  26. bookService.removeById(14);
  27. }
  28. @Test
  29. void testGetAll() {
  30. System.out.println(bookService.list());
  31. }
  32. @Test
  33. void testGetPage() {
  34. IPage<Book> page = new Page<>(2, 5);
  35. bookService.page(page);
  36. System.out.println(page.getCurrent());
  37. System.out.println(page.getSize());
  38. System.out.println(page.getPages());
  39. System.out.println(page.getTotal());
  40. System.out.println(page.getRecords());
  41. }
  42. }
总结:
  1. 使用通用接口(ISerivce)快速开发Service
  2. 使用通用实现类(ServiceImpl)快速开发ServiceImpl
  3. 可以在通用接口基础上做功能重载或功能追加
  4. 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

七.表现层标准开发

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

1.表现层开发

  1. /**
  2. * @author QGC
  3. * @create 2022-10-11 16:37
  4. */
  5. @RestController
  6. @RequestMapping("/books")
  7. public class BookController {
  8. @Autowired
  9. private IBookService bookService;
  10. @GetMapping
  11. public List<Book> getAll() {
  12. return bookService.list();
  13. }
  14. @PostMapping
  15. public Boolean save(@RequestBody Book book) {
  16. return bookService.save(book);
  17. }
  18. @PutMapping
  19. public Boolean update(@RequestBody Book book) {
  20. return bookService.modify(book);
  21. }
  22. @DeleteMapping("{id}")
  23. public Boolean delete(@PathVariable Integer id) {
  24. return bookService.delete(id);
  25. }
  26. @GetMapping("{id}")
  27. public Book getById(@PathVariable Integer id) {
  28. return bookService.getById(id);
  29. }
  30. @GetMapping("{currentPage}/{pageSize}")
  31. public IPage<Book> getPage(@PathVariable Integer currentPage, @PathVariable int pageSize) {
  32. return bookService.getPage(currentPage, pageSize);
  33. }
  34. }

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

IBookService

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

BookServiceImpl

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

3.功能测试(使用postman)

Postaman的简单使用

Postman界面

image-20221010205831114

一些常用的按钮

image-20221010210218841

1.GET请求——查询

image-20221010172720004

2.PUT请求——修改

image-20221010172845601

3.POST——添加

image-20221010174022649

4.DELETE——删除

image-20221010174235823

总结:

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

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

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

    @Data
    public class R {

    1. private Boolean flag;
    2. private Object data;
    3. private String msg;
    4. public R(){
    5. }
    6. public R(Boolean flag){
    7. this.flag = flag;
    8. }
    9. public R(Boolean flag,Object data){
    10. this.flag = flag;
    11. this.data = data;
    12. }
    13. public R(Boolean flag,String msg){
    14. this.flag = flag;
    15. this.msg = msg;
    16. }
    17. public R(String msg){
    18. this.flag = false;
    19. this.msg = msg;
    20. }

    }

  • 表现层接口统一返回值类型结果

    @RestController
    @RequestMapping(“/books”)
    public class BookController {

  1. @Autowired
  2. private IBookService bookService;
  3. @GetMapping
  4. public R getAll() {
  5. return new R(true, bookService.list());
  6. }
  7. @PostMapping
  8. public R save(@RequestBody Book book) {
  9. return new R(bookService.save(book));
  10. }
  11. @PutMapping
  12. public R update(@RequestBody Book book) {
  13. return new R(bookService.modify(book));
  14. }
  15. @DeleteMapping("{id}")
  16. public R delete(@PathVariable Integer id) {
  17. return new R(bookService.delete(id));
  18. }
  19. @GetMapping("{id}")
  20. public R getById(@PathVariable Integer id) {
  21. return new R(true, bookService.getById(id));
  22. }
  23. @GetMapping("{currentPage}/{pageSize}")
  24. public R getPage(@PathVariable Integer currentPage, @PathVariable int pageSize) {
  25. return new R(true, bookService.getPage(currentPage, pageSize));
  26. }
  27. }
到这里后端开发基本上差不多完成了,前端开发这里不做介绍了,想要前端的资料关注私聊发,但是条件查询的时候需要改一下后端代码,下面将修改代码。

九.异常消息处理

  • 对异常进行统一处理,出现异常后,返回指定信息

    /**

    • @author QGC
    • @create 2022-10-11 17:09
      */
      @RestControllerAdvice
      public class ProjectExceptionAdvice {
  1. //拦截所有的异常信息
  2. @ExceptionHandler(Exception.class)
  3. public R doException(Exception ex) {
  4. // 记录日志
  5. // 发送消息给运维
  6. // 发送邮件给开发人员 ,ex 对象发送给开发人员
  7. ex.printStackTrace();
  8. return new R( "系统错误,请稍后再试!");
  9. }
  10. }
  • 可以在表现层Controller中进行消息统一处理

    @PostMapping

    1. public R save(@RequestBody Book book) throws IOException {
    2. //if (book.getName().equals("123")) throw new IOException();
    3. boolean flag = bookService.save(book);
    4. return new R(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    5. }
小结:
  1. 使用注解@RestControllerAdvice定义SpringMVC异常处理器用来处理异常的
  2. 异常处理器必须被扫描加载,否则无法生效
  3. 表现层返回结果的模型类中添加消息属性用来传递消息到页面

十.条件查询

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

    @GetMapping(“{currentPage}/{pageSize}”)
    public R getAll(@PathVariable int currentPage,@PathVariable int pageSize,Book book) {

    1. System.out.println("参数=====>"+book);
    2. IPage<Book> pageBook = bookService.getPage(currentPage,pageSize);
    3. return new R(null != pageBook ,pageBook);

    }

  • 业务层接口功能开发

    /**

    • 分页的条件查询
      *
    • @param currentPage
    • @param pageSize
    • @param book
    • @return
      */
      IPage getPage(Integer currentPage, int pageSize, Book book);
  • 业务层接口实现类功能开发

    @Override

    1. public IPage<Book> getPage(Integer currentPage, int pageSize, Book book) {
  1. LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  2. lambdaQueryWrapper.like(Strings.isNotEmpty(book.getType()), Book::getType, book.getType());
  3. lambdaQueryWrapper.like(Strings.isNotEmpty(book.getName()), Book::getName, book.getName());
  4. lambdaQueryWrapper.like(Strings.isNotEmpty(book.getDescription()), Book::getDescription, book.getDescription());
  5. IPage page = new Page(currentPage, pageSize);
  6. bookDao.selectPage(page, lambdaQueryWrapper);
  7. return page;
  8. }
  • Controller调用业务层分页条件查询接口

    @GetMapping(“{currentPage}/{pageSize}”)

    1. public R getPage(@PathVariable Integer currentPage, @PathVariable int pageSize, Book book) {
  1. // System.out.println("book=>" + book);
  2. IPage<Book> page = bookService.getPage(currentPage, pageSize, book);
  3. // 如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值
  4. if (currentPage > page.getPages()) {
  5. page = bookService.getPage((int) page.getPages(), pageSize, book);
  6. }
  7. return new R(true, page);
  8. }

前端目录显示:

f8b9762a51449e0cdc0f63fdc74d4915.png

十一.案例演示

1.在idea中启动项目

image-20221011171726549

2.浏览器输入

image-20221011171943352

3.页面展示

image-20221011172058086

总结:

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

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

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

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

service测试类

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

发表评论

表情:
评论列表 (有 0 条评论,143人围观)

还没有评论,来说两句吧...

相关阅读