1.概述
MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了基本的整合SpringBoot和基础用法。
2.引入依赖
在项目中 pom 文件引入 mybatisplus 和 mysql 驱动依赖,如下
1 2 3 4 5 6 7 8 9 10 |
< 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.配置连接信息
在项目中application.yaml文件中配置数据库的连接信息
1 2 3 4 5 6 |
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.新建两个表
本案例通过一个完整的业务流程来介绍如何使用 mybatispuls ,首先在数据库中新建两个表,一个是字典类型表 sys_dict_type 和一个字典数据表 sys_dict_data
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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 |
5.在项目中创建相应的实体类
通过观察SQL语句发现两个表中有很多相同的字段,所有我们把相同的字段抽离出来,放到一个基础的实体类中,其他实体类通过集成方式获取公共的字段。
5.1 创建基础实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package com.didiplus测试数据mon.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测试数据 * 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中的一个注解,后面会讲解到的。
基础实体类创建好了,接着我们把剩下的两个实体类也一同创建吧。
5.2 SysDictType实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
package com.didiplus.modules.sys.domain;
import com.didiplus测试数据mon.base.BaseDomain; import com.didiplus测试数据mon.base.ValidGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;
import javax.validation.constraints.*;
/** * Author: didiplus * Email: 972479352@qq测试数据 * 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.3 SysDictData实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package com.didiplus.modules.sys.domain;
import com.baomidou.mybatisplus.annotation.TableField; import com.didiplus测试数据mon.base.BaseDomain; import com.didiplus测试数据mon.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测试数据 * 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; } |
6.创建DAO继承MybatisPlus增强接口
为两个实体类中分别添加DAO继承MybatisPlus增强接口,这样就可以集成了增删改查的功能了。
6.1 SysDictTypeMapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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测试数据 * CreateTime: 2022/4/29 * Desc: 字典类型接口 */ @Mapper public interface SysDictTypeMapper extends BaseMapper<SysDictType> { } |
6.2 SysDictDataMapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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测试数据 * CreateTime: 2022/4/29 * Desc: 字典数据接口 */
@Mapper public interface SysDictDataMapper extends BaseMapper<SysDictData> { } |
7.进一步封装到Service层
7.1 定义Service接口中的抽象方法
1.SysDictDataService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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测试数据 * CreateTime: 2022/4/29 * Desc: */
public interface SysDictDataService extends IService<SysDictData> { } |
2.SysDictTypeService
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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测试数据 * CreateTime: 2022/4/29 * Desc: */ public interface SysDictTypeService extends IService<SysDictType> { } |
7.2 实现Service接口中的方法
1.SysDictTypeServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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测试数据 * CreateTime: 2022/4/29 * Desc: */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { } |
2.SysDictDataServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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测试数据 * CreateTime: 2022/4/29 * Desc: */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { } |
8.在控制层上进行增删改查操作
8.1 SysDictTypeController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com.didiplus.modules.sys.controller;
import com.didiplus测试数据mon.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测试数据 * 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.自动填充功能
原理:
实现元对象处理器接口: com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 注解填充字段 @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!
9.1 自定义实现类 DomainInterceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.didiplus测试数据mon.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测试数据 * 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()); } } |
10.分页查询
10.1 添加分页插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.didiplus测试数据mon.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测试数据 * 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; } } |
10.2 定义分页接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.didiplus.modules.sys.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.didiplus测试数据mon.web.domain.PageDomain; import com.didiplus.modules.sys.domain.SysDictType;
/** * Author: didiplus * Email: 972479352@qq测试数据 * CreateTime: 2022/4/29 * Desc: 数据字典类型服务类 */ public interface SysDictTypeService extends IService<SysDictType> {
IPage<SysDictType> page(PageDomain pageDomain); } |
10.3 实现分页接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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测试数据mon.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测试数据 * 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 ); } } |
10.4 控制层调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@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类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.didiplus测试数据mon.web.domain;
import lombok.Data;
/** * Author: didiplus * Email: 972479352@qq测试数据 * CreateTime: 2022/5/4 * Desc: 分 页 参 数 封 装 */ @Data public class PageDomain { /** * 当前页 */ private Integer page; /** * 每页数量 */ private Integer limit;
} |
10.5 体验效果
以上就是SpringBoot整合MybatisPlus实现增删改查功能的详细内容,更多关于SpringBoot MybatisPlus增删改查的资料请关注其它相关文章!
原文链接:https://HdhCmsTestcnblogs测试数据/alanlin/p/16224187.html
查看更多关于SpringBoot整合MybatisPlus实现增删改查功能的详细内容...