概述

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

引入依赖

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

    <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>

配置连接信息

在项目中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

新建两个表

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

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

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

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

创建基础实体类

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: 基 础 实 体 类
*/ @Data
public 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中的一个注解,后面会讲解到的。

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

SysDictType实体类

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

SysDictData实体类

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: 字典值领域模型
*/ @Data
public 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;
}

创建DAO继承MybatisPlus增强接口

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

SysDictTypeMapper

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: 字典类型接口
*/
@Mapper
public interface SysDictTypeMapper extends BaseMapper<SysDictType> {
}

SysDictDataMapper

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: 字典数据接口
*/ @Mapper
public interface SysDictDataMapper extends BaseMapper<SysDictData> {
}

进一步封装到Service层

定义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> {
}

实现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:
*/
@Service
public 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:
*/
@Service
public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService {
}

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

SysDictTypeController

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)? "删除成功":"删除失败";
} }

体验效果

新增数据



修改数据



删除数据

自动填充功能

原理:

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

自定义实现类 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: 字 段 填 充 拦 截 器
*/
@Component
public 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());
}
}

分页查询

添加分页插件

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分页插件
*/
@Configuration
public class MyBatisPlusConfig { /**
* mybatis-plus分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

定义分页接口

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

实现分页接口

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:
*/
@Service
public 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);
}
}

控制层调用

@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: 分 页 参 数 封 装
*/
@Data
public class PageDomain {
/**
* 当前页
*/
private Integer page;
/**
* 每页数量
*/
private Integer limit; }

体验效果



下一篇,我们继续来学习mybatisPlus的代码生成器

SpringBoot整合MybatisPlus基本的增删改查,保姆级教程的更多相关文章

  1. SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)

    软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...

  2. 04-springboot整合elasticsearch初识-简单增删改查及复杂排序,分页,聚合操作

        前面大概了解了一下elasticsearch的数据存储和数据的查询.现在学习一下,es的复杂操作.     官网相关文档地址:https://www.elastic.co/guide/en/e ...

  3. Spring Boot 知识笔记(整合Mybatis续-补充增删改查)

    续上篇,补充数据库增删改查的其他场景. 一.Mapper中添加其他场景操作 package net.Eleven.demo.Mapper; import net.Eleven.demo.domain. ...

  4. spring boot整合mybatis框架及增删改查(jsp视图)

    工具:idea.SQLyog 版本:springboot1.5.9版本.mysql5.1.62 第一步:新建项目 第二步:整合依赖(pom.xml) <dependencies> < ...

  5. ssh框架整合之登录以及增删改查

    1.首先阐述一下我用得开发工具,myeclipse2017+oracle,所以我的基本配置步骤可能不一样,下面我用几张图来详解我的开发步骤. ---1先配置structs (Target 选择apac ...

  6. SpringBoot 集成Elasticsearch进行简单增删改查

    一.引入的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  7. Mysql 常用增删改查命令集合教程

    创建:create      插入:insert 更新:update  查询:select 删除:delete 修改:alter     销毁:drop 创建一个数据库: create databas ...

  8. Spring Boot入门系列(六)如何整合Mybatis实现增删改查

    前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/z ...

  9. SSH登录与增删改查demo详解+源代码

    点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679   一.框架概述 spri ...

随机推荐

  1. 如何在自定义端口上运行 Spring Boot 应用程序?

    为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口. server.port = 8090

  2. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  3. Python form...import...和import的区别(自己理解的)

    Python有两种导入包和模块的方式,区别如下 form...import... import 相对导包 导入不同包子模块 可以导入模块所需变量/函数/类   init文件的__all__特殊变量(模 ...

  4. 快速注册service服务

    一.通过SpringContextHolder的getBean来注册service服务 导入的包:import com.bessky.platform.context.SpringContextHol ...

  5. (stm32f103学习总结)—GPIO结构

    一.GPIO基本结构 二.GPIO工作模式 输入模式 输入浮空 输入上拉 输入下拉 模拟输入 输出模式 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 库函数中所对应的代码 1 typedef e ...

  6. 原理图Checklist

    类别 描述 检视规则 原理图需要进行检视,提交集体检视是需要完成自检,确保没有低级问题. 检视规则 原理图要和公司团队和可以邀请的专家一起进行检视. 检视规则 第一次原理图发出进行集体检视后所有的修改 ...

  7. ES6实战:新数字方法

    本文翻译自:https://www.sitepoint.com/es6... 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文介绍了ES6中全新的数字方 ...

  8. Android优化应用启动速度

    一.应用的启动 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动 ...

  9. java中public和缺省这两个访问权限的根本区别?

    为了区分开public和缺省的区别,我们要引进包(package)的概念.包就像咱们磁盘上的目录一样,马克-to-win.package a;就是定义说当前的目录为a.底下编的任何的类,都会出现在当前 ...

  10. CCF201909-2小明种苹果(续)

    解题思路:解题思路很简答,就是用数组将数据存起来然后再进行统计,具体思路就见代码注释,记录这道题的是为了警示自己好好审题啊...... 审题有问题,写题火葬场啊.......以为每棵树就疏一次果,把D ...