SpringBoot整合MybatisPlus基本的增删改查,保姆级教程

发布于:2023-01-12 ⋅ 阅读:(515) ⋅ 点赞:(0)

1|0概述
MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了基本的整合SpringBoot和基础用法。

2|0引入依赖

在项目中pom文件引入mybatisplus和mysql驱动依赖,如下图

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

3|0配置连接信息

在项目中application.yaml文件中配置数据库的连接信息

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/didiadmin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true    username: root    password: 123456

4|0新建两个表

本案例通过一个完整的业务流程来介绍如何使用mybatispuls,首先在数据库中新建两个表,一个是字典类型表sys_dict_type和一个字典数据表sys_dict_data

CREATE TABLE `sys_dict_type` (`id` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标识',`type_name` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型名称', `type_code` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型标识', `description` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型描述', `enable` CHAR (1) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否启用', `create_by` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人ID',  `create_name` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人名称', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人ID', `update_name` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名称', `update_time` datetime DEFAULT NULL COMMENT '修改时间', `remark` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMICCREATE TABLE `sys_dict_data` (`data_id` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标识',`data_label` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典标签', `data_value` CHAR (20) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典值', `type_code` CHAR (20) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所属类型', `is_default` CHAR (1) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否默认', `update_by` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人ID',   `update_name` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名称', `update_time` datetime DEFAULT NULL COMMENT '修改时间', `create_by` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人ID',   `create_name` CHAR (19) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人名称', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `remark` VARCHAR (255) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', `enable` CHAR (1) CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否启用', PRIMARY KEY (`data_id`) USING BTREE) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC

5|0在项目中创建相应的实体类

通过观察SQL语句发现两个表中有很多相同的字段,所有我们把相同的字段抽离出来,放到一个基础的实体类中,其他实体类通过集成方式获取公共的字段。

5|1创建基础实体类

package com.didiplus.common.base;import com.baomidou.mybatisplus.annotation.FieldFill;import com.baomidou.mybatisplus.annotation.TableField;import lombok.Data;import java.io.Serializable;import java.time.LocalDateTime;/*** Author: didiplus* Email: 972479352@qq.com* CreateTime: 2022/4/29* Desc: 基 础 实 体 类*/@Datapublic class BaseDomain implements Serializable {        /**    * 创建时间    */    @TableField(value = "create_time", fill = FieldFill.INSERT)    private LocalDateTime createTime;        /**    * 创建人    */    @TableField(value = "create_by", fill = FieldFill.INSERT)    private String createBy;        /**    * 创建人名称    */    @TableField(value = "create_name", fill = FieldFill.INSERT)    private String createName;        /**    * 修改时间    */    @TableField(value = "update_time", fill = FieldFill.UPDATE)    private LocalDateTime updateTime;        /**    * 修改人    */    @TableField(value = "update_by", fill = FieldFill.UPDATE)    private String updateBy;        /**    * 修改人名称    */    @TableField(value = "update_name", fill = FieldFill.UPDATE)    private String updateName;            /**    * 备注    */    private String remark;}

@TableField 是mybatisplus中的一个注解,后面会讲解到的。

基础实体类创建好了,接着我们把剩下的两个实体类也一同创建吧。

5|2SysDictType实体类

package com.didiplus.modules.sys.domain;import com.didiplus.common.base.BaseDomain;import com.didiplus.common.base.ValidGroup;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import javax.validation.constraints.*;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/25 * Desc: 字典类型领域模型 */@Data@ApiModel(value = "字典类型")public class SysDictType extends BaseDomain {    /**     * 标识     */    @Null(groups = ValidGroup.Crud.Create.class)    @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典ID不能为空")    @ApiModelProperty("ID")    private String id;    /**     * 字典名称     */    @NotBlank(message = "字典名称必填项")    @ApiModelProperty(value = "字典名称",example = "用户ID")    private String typeName;    /**     * 字典类型     */    @NotBlank(message = "字典编码不能为空")    @ApiModelProperty(value = "字典编码")    private String typeCode;    /**     * 字典描述     */    @ApiModelProperty(value = "字典描述")    private String description;    /**     * 字典可用状态     */    @NotBlank(message = "字典状态不能为空")    @ApiModelProperty(value = "字典状态")    private Boolean enable;}

5|3SysDictData实体类

package com.didiplus.modules.sys.domain;import com.baomidou.mybatisplus.annotation.TableField;import com.didiplus.common.base.BaseDomain;import com.didiplus.common.base.ValidGroup;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import javax.validation.constraints.NotBlank;import javax.validation.constraints.NotNull;import javax.validation.constraints.Null;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典值领域模型 */@Datapublic class SysDictData extends BaseDomain {    /**     * id 编号     */    @Null(groups = ValidGroup.Crud.Create.class)    @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典数据ID不能为空")    @ApiModelProperty("ID")    @TableField(value = "data_id")    private String dataId;    /**     * 字典显示     */    @NotBlank(message = "字典数据名称必填项")    @ApiModelProperty(value = "字典数据名称")    private String dataLabel;    /**     * 字典值     */    @NotBlank(message = "字典数据值不能为空")    @ApiModelProperty(value = "字典数据值")    private String dataValue;    /**     * 字典类型     */    @ApiModelProperty(value = "字典编码")    @NotBlank(message = "字典数据值不能为空")    private String typeCode;    /**     * 是否为默认     */    @ApiModelProperty(value = "字典编码")    @NotBlank(message = "字典数据值不能为空")    private String isDefault;    /**     * 是否启用     */    @NotBlank(message = "字典状态不能为空")    @ApiModelProperty(value = "字典数据状态")    private Boolean enable;}

6|0创建DAO继承MybatisPlus增强接口

为两个实体类中分别添加DAO继承MybatisPlus增强接口,这样就可以集成了增删改查的功能了。

6|1SysDictTypeMapper

package com.didiplus.modules.sys.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.didiplus.modules.sys.domain.SysDictType;import org.apache.ibatis.annotations.Mapper;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典类型接口 */@Mapperpublic interface SysDictTypeMapper extends BaseMapper<SysDictType> {}

6|2SysDictDataMapper

package com.didiplus.modules.sys.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.didiplus.modules.sys.domain.SysDictData;import org.apache.ibatis.annotations.Mapper;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典数据接口 */@Mapperpublic interface SysDictDataMapper extends BaseMapper<SysDictData> {}

7|0进一步封装到Service层

7|1定义Service接口中的抽象方法

SysDictDataService

package com.didiplus.modules.sys.service;import com.baomidou.mybatisplus.extension.service.IService;import com.didiplus.modules.sys.domain.SysDictData;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */public interface SysDictDataService extends IService<SysDictData> {}

SysDictTypeService

package com.didiplus.modules.sys.service;import com.baomidou.mybatisplus.extension.service.IService;import com.didiplus.modules.sys.domain.SysDictType;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */public interface SysDictTypeService extends IService<SysDictType> {}

7|2实现Service接口中的方法

SysDictTypeServiceImpl

package com.didiplus.modules.sys.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.didiplus.modules.sys.domain.SysDictType;import com.didiplus.modules.sys.mapper.SysDictTypeMapper;import com.didiplus.modules.sys.service.SysDictTypeService;import org.springframework.stereotype.Service;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */@Servicepublic class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService {}

SysDictDataServiceImpl

package com.didiplus.modules.sys.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.didiplus.modules.sys.domain.SysDictType;import com.didiplus.modules.sys.mapper.SysDictTypeMapper;import com.didiplus.modules.sys.service.SysDictTypeService;import org.springframework.stereotype.Service;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */@Servicepublic class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService {}

8|0在控制层上进行增删改查操作

8|1SysDictTypeController

package com.didiplus.modules.sys.controller;import com.didiplus.common.base.ValidGroup;import com.didiplus.modules.sys.domain.SysDictType;import com.didiplus.modules.sys.service.SysDictTypeService;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import io.swagger.v3.oas.annotations.parameters.RequestBody;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.*;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/25 * Desc: 数据字典控制器 */@RestController@Api(tags = "数据字典")@RequestMapping("/api/sys/dictType")public class SysDictTypeController {    @Autowired    SysDictTypeService sysDictTypeService;    @ApiOperation("字典添加")    @PostMapping("/add")    public String add(@Validated(value = ValidGroup.Crud.Create.class) @RequestBody SysDictType sysDictType) {        return  sysDictTypeService.save(sysDictType)? "添加成功":"添加失败";    }    @ApiOperation("字典修改")    @PutMapping("/edit")    public String edit(@Validated(value = ValidGroup.Crud.Update.class) @RequestBody SysDictType sysDictType) {        return  sysDictTypeService.updateById(sysDictType)? "修改成功":"修改失败";    }    @ApiOperation("字典删除")    @DeleteMapping("/del/{id}")    public  String del( @PathVariable String id) {        return  sysDictTypeService.removeById(id)? "删除成功":"删除失败";    }}

体验效果

新增数据

修改数据 

删除数据 

9|0自动填充功能

原理:

  • 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
  • 注解填充字段 @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!

9|1自定义实现类 DomainInterceptor

package com.didiplus.common.web.interceptor;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;import java.time.LocalDateTime;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: 字 段 填 充 拦 截 器 */@Componentpublic class DomainInterceptor implements MetaObjectHandler {    @Override    public void insertFill(MetaObject metaObject) {        createField(metaObject);    }    @Override    public void updateFill(MetaObject metaObject) {        updateField(metaObject);    }    /**     * @Field 创建时间     * */    public void createField(MetaObject metaObject){        this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now());    }     /**     * @Field 修改时间     * */    public void updateField(MetaObject metaObject) {        this.strictUpdateFill(metaObject,"updateTime",LocalDateTime.class,LocalDateTime.now());    }}

10|0分页查询

10|1添加分页插件

package com.didiplus.common.config;import com.baomidou.mybatisplus.annotation.DbType;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;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: mybatis-plus分页插件 */@Configurationpublic class MyBatisPlusConfig {    /**     * mybatis-plus分页插件     */    @Bean    public MybatisPlusInterceptor  mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        return interceptor;    }}

10|2定义分页接口

package com.didiplus.modules.sys.service;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.service.IService;import com.didiplus.common.web.domain.PageDomain;import com.didiplus.modules.sys.domain.SysDictType;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 数据字典类型服务类 */public interface SysDictTypeService extends IService<SysDictType> {    IPage<SysDictType> page(PageDomain pageDomain);}

10|3实现分页接口

package com.didiplus.modules.sys.service.impl;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.didiplus.common.web.domain.PageDomain;import com.didiplus.modules.sys.domain.SysDictType;import com.didiplus.modules.sys.mapper.SysDictTypeMapper;import com.didiplus.modules.sys.service.SysDictTypeService;import org.springframework.stereotype.Service;import javax.annotation.Resource;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */@Servicepublic class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService {    @Resource    SysDictTypeMapper sysDictTypeMapper;    @Override    public IPage<SysDictType> page(PageDomain pageDomain) {        IPage<SysDictType> page = new Page<>(pageDomain.getPage(),pageDomain.getLimit());        return sysDictTypeMapper.selectPage(page,null);    }}

10|4控制层调用

@RestController@Api(tags = "数据字典")@RequestMapping("/api/sys/dictType")public class SysDictTypeController {    @Autowired    SysDictTypeService sysDictTypeService;    @ApiOperation("字典分页查询")    @GetMapping    public IPage list(@RequestBody PageDomain pageDomain){        return sysDictTypeService.page(pageDomain);    }}

PageDomain定义了分页接收的两个参数

PageDomain类

package com.didiplus.common.web.domain;import lombok.Data;/** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: 分 页 参 数 封 装 */@Datapublic class PageDomain {    /**     * 当前页     */    private  Integer page;    /**     * 每页数量     */    private  Integer limit;}

10|5体验效果

 

我们继续来学习mybatisPlus的代码生成器 


网站公告

今日签到

点亮在社区的每一天
去签到