springboot + Vue前后端项目(第五记)

本文详细介绍了如何在SpringBoot项目中集成MyBatis-Plus进行数据操作,并配合Swagger进行接口文档管理,包括依赖引入、接口重写、分页插件配置及Swagger配置和问题解决方案。
摘要由CSDN通过智能技术生成

1.写在前面

  • 本篇博客需对mybatis-plus技术有一定了解
  • 本篇博客代码改动较大,注意改动的地方

2. 后台集成mybatis-plus

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2.1 导入依赖

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

2.2 引入mybatis-plus分页插件(mp配置类)

将MybatisPlusConfig放在配置文件夹下
在这里插入图片描述

package com.ppj.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
        //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
        return interceptor;
    }

}

2.3 重写接口

为什么要重写接口?集成mybatis-plus之后,之前写的单表的crud以及分页,mybatis-plus已经封装好了,直接调用就行。

2.3.1 UserMaper接口和UserMaper.xml改动

package com.ppj.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ppj.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @author ppj
 * @date 2024/04/10
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {   //BaseMapper封装了对数据层的操作

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 的值设定为被映射的包名.类名 -->
<mapper namespace="com.ppj.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.ppj.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="nickname" column="nickname"/>
        <result property="email" column="email"/>
        <result property="address" column="address"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
</mapper>

注:删除了所有单表的操作

2.3.2 UserService

package com.ppj.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ppj.entity.User;
import com.ppj.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author ppj
 * @date 2024/04/11
 */
@Service
public class UserService extends ServiceImpl<UserMapper,User> {   //对于单表的操作,完全没有方法,只需继承ServiceImpl

}

2.3.3 UserController

package com.ppj.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ppj.entity.User;
import com.ppj.mapper.UserMapper;
import com.ppj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ppj
 * @date 2024/04/10
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/")
    public List<User> findAll(){
        return userService.list();
    }

    @PostMapping("/")
    public boolean saveOrUpdate(@RequestBody User user){
        return userService.saveOrUpdate(user);
    }

    @DeleteMapping("/{id}")
    public boolean delUser(@PathVariable("id") Integer id){
        return userService.removeById(id);
    }

    @GetMapping("/page")
    public IPage<User> page(@RequestParam Integer pageNum,
                                   @RequestParam Integer pageSize,
                                   @RequestParam(required = false) String username,
                                   @RequestParam(required = false) String address){
        IPage<User> page = new Page<>(pageNum,pageSize);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if(!"".equals(username)){
            queryWrapper.like("username",username);
        }
        if(!"".equals(address)){
            queryWrapper.like("address",address);
        }
        return userService.page(page, queryWrapper);
    }
}

2.3.4 要注意的地方

  1. 之前的数据库用户表名为sys_user当MyBatis Plus中实体类没有添加注解 @TableName 则默认从数据库中找与实体类名称一样的表进行查询
package com.ppj.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * @author ppj
 * @date 2024/04/10
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "sys_user")
public class User {
    private Integer id;
    private String username;
    private String password;
    private String nickname;
    private String email;
    private String address;
    private String phone;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @TableField(value = "create_time")    //字段与属性不一致时,用@TableField
    private Date createTime;
}
  1. 日志打印换成mp的日志打印
server:
  port: 9000
# 应用服务 WEB 访问端口
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/fb?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456

# mybatis配置文件注入
mybatis:
  # classpath*:mapper/*.xml
  #如果项目中的Mapper XML文件分布在多个jar包或多个路径下,可以使用classpath*:mapper/*.xml来加载所有的Mapper XML文件;
  #如果所有的Mapper XML文件都在同一个路径下,可以使用classpath:mapper/*.xml来加载这些文件
  mapper-locations: classpath:mapper/*.xml
  # 日志打印
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:  # mybatis-plus日志打印
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.3.5 接口测试(读者用postman自行测试,与上一篇博客测试相同)

3. 后台集成swagger

3.1 swagger认知

也是一种接口测试工具,在前后端开发中,前端可以很好的通过swagger-ui知道要调用哪个接口,接口需要传什么参数,提高开发效率。

3.2 导入依赖

<!-- swagger       -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

3.3 编写swagger配置类(SwaggerConfig)

package com.ppj.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 *
 * swagger-ui访问 http://localhost:9600/swagger-ui.html
 * @author ppj
 **/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    /**
     * 创建Docket对象,交给spring管理
     * Docket是swagger中全局配置对象
     *
     * @return springfox.documentation.spring.web.plugins.Docket
     * @author ppj
     **/

    @Bean
    public Docket docket(){

        Docket docket = new Docket(DocumentationType.SWAGGER_2);

        //API帮助文档的描述信息
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("API接口文档")
                .description("用于开发restfulAPI的帮助文档")
                .version("1.1")
                .build();

        //给docket上下文配置api描述信息
        docket.apiInfo(apiInfo);

        docket.select()  //获取Docket中的选择器。返回是ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解
                //.apis(RequestHandlerSelectors.basePackage("com.ppj.controller"))//设定扫描哪个包(包含子包)中的注解
                .apis(RequestHandlerSelectors.any())
                //不显示错误的接口地址
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .paths(PathSelectors.regex("/.*"))
                .build();
        return docket;
    }

}

3.4 测试访问swagger页面

直接访问 http://localhost:9000/swagger-ui.html改成自己在application.yml中设置的端口),成功页面如下图所示:
在这里插入图片描述

3.5 可能出现的问题

  1. 因为Springfox2.x使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher本篇将原来springboot2.6.2版本降到2.4.2(只要降到2.6.x以下)就行

总结

  1. 读者可深入了解mybatis-plus封装的方法;
  2. 集成swagger,注意springboot版本,可继续学习swagger注解使用;

声明

项目源于此地址:程序员青戈

写在最后

如果此文对您有所帮助,请帅戈靓女们务必不要吝啬你们的Zan,感谢!!不懂的可以在评论区评论,有空会及时回复。
文章会一直更新

  • 40
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值