基于Spring Boot的SSMP整合案例上

导读:本篇文章讲解 基于Spring Boot的SSMP整合案例上,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、案例实现方案分析

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

二、模块创建

        此次项目先不做前后端分离

1. 创建一个新项目

        勾选SpringMVC与MySQL坐标

基于Spring Boot的SSMP整合案例上

2. pom添加依赖

        <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.8</version>
        </dependency>

3. 修改配置文件为yml格式

#3.设置端口为80方便访问
server:
  port: 80

4. 实体类

        Lombok,一个Java类库,提供了一组注解,简化poJo实体类开发,可看相关博客:

第02讲:LomBok模板代码生成器_萧篱衣的博客-CSDN博客

<!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

常用注解:@Data

package com.jf.domain;

import lombok.Data;

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

        为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法。@AllArgsConstructor 有参构造,@NoArgsConstructor 无参构造。

5. 数据层开发

5.1 配置yml

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

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_

5.2 创建数据层接口继承并指定泛型

        使用MP写法

package com.jf.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jf.domain.Book;
import org.apache.ibatis.annotations.Mapper;

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

5.3 建一个测试类校验代码是否正确

package com.jf.mapper;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookMapperTestCase {

    @Autowired
    private BookMapper bookMapper;

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

5.4 启动

基于Spring Boot的SSMP整合案例上

5.5 其他功能

5.5.1 添加功能

    /**
     * 添加
     */
    @Test
    void testSave(){
        Book book = new Book();
        book.setType("土地");
        book.setName("测试123");
        book.setDescription("测试123");
        bookMapper.insert(book);
    }

运行后会报错:

基于Spring Boot的SSMP整合案例上

原因: 

        MP默认生成id的算法是雪花算法,而我们想要的是数据库默认的最基本的自增模式

解决办法:

        yml直接配置

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

基于Spring Boot的SSMP整合案例上

5.5.2 修改功能

    /**
     * 修改
     */
    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(13);
        book.setType("土地abcg");
        book.setName("测试123");
        book.setDescription("测试123");
        bookMapper.updateById(book);
    }

基于Spring Boot的SSMP整合案例上

5.5.3 删除功能 

    /**
     * 删除
     */
    @Test
    void testDelete(){
        bookMapper.deleteById(13);
    }

基于Spring Boot的SSMP整合案例上

5.5.4 查询全部功能 

    /**
     * 查询全部
     */
    @Test
    void testGetALL(){
        System.out.println(bookMapper.selectList(null));
    }

基于Spring Boot的SSMP整合案例上

        分页和根据条件查询后补

6. MP运行日志

6.1 yml配置

        使用配置方式开启日志

  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#设置日志输出方式为标准输出

基于Spring Boot的SSMP整合案例上

基于Spring Boot的SSMP整合案例上

7. 分页

    /**
     * 分页查询
     */
    @Test
    void testGetPage(){
        IPage page = new Page(1,5);
        //这里的1和5分别指第几页显示几条数据
        bookMapper.selectPage(page,null);
    }

问题:没有起到分页效果

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

解决办法:

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

基于Spring Boot的SSMP整合案例上

小结:

基于Spring Boot的SSMP整合案例上

8. 按条件查询

    /**
     * 根据条件查询
     */
    @Test
    void testGetBy(){
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        //查询条件
        queryWrapper.like("name","Spring");
        bookMapper.selectList(queryWrapper);
    }

基于Spring Boot的SSMP整合案例上

        但是上面这种写法一旦写错就无法识别,可以使用下面这种写法制动编译

    /**
     * 根据条件查询2
     */
    @Test
    void testGetBy2(){
        LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //查询条件
        lambdaQueryWrapper.like(Book::getName,"Spring");
        bookMapper.selectList(lambdaQueryWrapper);
    }

         这种写法在实际中还存在一个问题,就是如果获得数据为空,它当作字符进行查询,我们需要进行判断

    @Test
    void testGetBy2(){
        String name = "1";
        LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //查询条件
        //lambdaQueryWrapper.like(Book::getName,"Spring");
        lambdaQueryWrapper.like(name != null,Book::getName,name);
        bookMapper.selectList(lambdaQueryWrapper);
    }

基于Spring Boot的SSMP整合案例上

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

9. 业务层开发

package com.jf.service;

import com.jf.domain.Book;

import java.util.List;

public interface IBookService {
    Boolean save(Book book);
    Boolean update(Book book);
    Boolean delete(Integer id);
    Book getById(Integer id);
    List<Book> getAll();
}

9.1 定义实现类 

package com.jf.service.impl;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jf.domain.Book;
import com.jf.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookServiceImpl implements IBookService {

    @Autowired
    private BaseMapper baseMapper;

    @Override
    public Boolean save(Book book) {
        return baseMapper.insert(book) > 0;
    }

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

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

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

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

基于Spring Boot的SSMP整合案例上

9.2 定义测试类

package com.jf.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jf.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
    private IBookService bookService;

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

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

    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(14);
        book.setType("土地abcg");
        book.setName("测试123");
        book.setDescription("测试123");
        bookService.update(book);
    }

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

    @Test
    void testGetALL(){
        bookService.getAll();
    }

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

9.3 快速开发

package com.jf.service;

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

public interface IBookService extends IService<Book> {
}

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

在通用类基础上做功能重载或功能追加

注意重载时不要覆盖原始操作,避免原始提供的功能丢失 

package com.jf.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jf.domain.Book;
import com.jf.mapper.BookMapper;
import com.jf.service.IBookService;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
}
package com.jf.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jf.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
    private IBookService bookService;

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

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

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

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

    @Test
    void testGetALL(){
        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.getTotal());
        System.out.println(page.getPages());
        System.out.println(page.getRecords());
    }
}

基于Spring Boot的SSMP整合案例中_萧篱衣的博客-CSDN博客 

基于Spring Boot的SSMP整合案例下_萧篱衣的博客-CSDN博客

基于SpringBoot的SSMP整合案例-Java文档类资源-CSDN下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111722.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!