01.07 节省工作量,Mybatis-plus里面常见的一些坑……

前言:

前面我们说过mybatis-plus框架的好处以及使用方法,这个所谓的保留原有的东西,只做升级的框架给我们确实带来了很大的方便,如果我们可以灵活运用mybatis-plus框架,那么我们的工作必定会事半功倍的。

我们都知道在一个系统中,尤其是管理类型的系统里面,所有的实体entity类都会有一些共有的属性,比如:主键id,创建人,创建时间,更新人,更新时间,是否删除,支持乐观锁的version字段等。

如果有部门的话,诸如:创建人/更新人所在的部门id,名称等字段。像这些共有的属性如果在每一个实体entity做新增的时候都去set未免太过于麻烦,繁琐不说,其带来的工作量也是可想而知。


闲言少叙,言归正传,本文我们说下具体配置,避免初学者入坑。

下面以创建时间,更新时间,是否删除为例说明:

1.添加maven依赖:

<dependency>
<groupid>com.baomidou/<groupid>
<artifactid>mybatis-plus-boot-starter/<artifactid>
<version>3.0.6/<version>
/<dependency>

说明:

由于mybatis-plus只是在mybatis上做了新增,并未改变原有的知识点,因此这里只需要一个jar包就可以了。

2.自动生成代码的工具类

这一步骤,请移步看我之前的发文《SpringBoot 零基础 集成Mybatis-Plus》链接地址:

此处不再赘述。

3.编写基础实体类BaseEntity.java

BaseEntity.java完整代码如下:

package com.bj.hydra.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 实体基础类
*
* @author @IT讲坛
*/
@Data
public abstract class BaseEntity implements Serializable {
@TableId(type = IdType.UUID)
private String id;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
private Long creatorDepartmentId;
private String creatorDepartmentName;
private String creatorId;
private String creatorName;
@TableLogic
@TableField(value = "is_deleted", fill = FieldFill.INSERT)
private Boolean deleted;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
private Long updatorDepartmentId;
private String updatorDepartmentName;
private String updatorId;
private String updatorName;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
}

说明:

这里可能会有人犯两个坑

1):

value = "is_deleted",如果你的实体类字段名称和数据库除去下划线可以完全吻合的话,比如数据库里面字段:create_time,这里你在java类中起名createTime就是吻合的。但是如果你要是column:is_deleted,但是java实体类里面你起名不是isDeleted,那么你就需要在@TableField注解里面表名对应数据库里面的哪个字段。

不然会报错的:如下错误信息:

截图如下:

节省工作量,Mybatis-plus里面常见的一些坑……

2):

fill = FieldFill.INSERT设置insert的时候,只有在做insert新增的时候该字段才会自动填充(适用于创建时间填充项)

fill = FieldFill. INSERT_UPDATE,设置insert的时候,在做insert/update的时候该字段均会自动填充(适用于更新时间填充项

写到这里有的人以为就万事大吉了,实则不然。

网上看到很多问题示例,大意就是说,设置了

fill = FieldFill.INSERT之后,为什么新增时候没有生效,字段并没有自动填充,其实还有一个关键的步骤,接着往下看:

4.关键类CreateTimeOrUpdateTimeMetaObjectHandler.java配置

CreateTimeOrUpdateTimeMetaObjectHandler.java完整代码如下:

package com.bj.hydra.util;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Objects;
/**
* 自定填充插入更新默认值
*

* @author @IT讲坛
*/
@Component
public class CreateTimeOrUpdateTimeMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
if (Objects.isNull(this.getFieldValByName("createTime", metaObject))) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
if (Objects.isNull(this.getFieldValByName("updateTime", metaObject))) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
if (Objects.isNull(this.getFieldValByName("version", metaObject))) {
this.setFieldValByName("version", 0, metaObject);
}
if (Objects.isNull(this.getFieldValByName("deleted", metaObject))) {
this.setFieldValByName("deleted", false, metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);

}
}

说明:

MetaObjectHandler.java是核心接口,这个接口就是mybatis-plus里面实现自动填充的公共字段的配置接口,只有你在实体类里面添加了@TableField注解,并且在这里给字段配置上默认值,那么在你业务代码里面就无需关注这些公共字段的赋值问题,只管使用就好了。

在上面我们设置了创建时间为new Date(),以及更新时候设置更新时间为new Date(),新增时候默认deleted为false。

5.写代码验证

编写controller层代码HydraTemplateItemPoolController.java:

节省工作量,Mybatis-plus里面常见的一些坑……

截图:save方法代码:

package com.bj.hydra.controller;
import com.alibaba.fastjson.JSONObject;
import com.bj.hydra.dto.HydraTemplateItemPoolDTO;
import com.bj.hydra.service.HydraTemplateItemPoolService;
import com.bj.hydra.util.InvokeResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @package: com.bj.hydra.controller
* @description: HydraTemplateItemPool控制层
* @author: @IT讲坛
* @create: 2018-12-26 18:21
**/
@Slf4j
@RestController
@RequestMapping("/itemPool")
public class HydraTemplateItemPoolController {
@Autowired
private HydraTemplateItemPoolService hydraTemplateItemPoolService;
@PostMapping("/save")
public InvokeResult<hydratemplateitempooldto> save(@RequestBody HydraTemplateItemPoolDTO hydraTemplateItemPoolDTO){
log.info(">>>>>>>>>>保存附件项开始,入参:{}", JSONObject.toJSONString(hydraTemplateItemPoolDTO));
InvokeResult<hydratemplateitempooldto> invokeResult = new InvokeResult<>();
try {
HydraTemplateItemPoolDTO hydraTemplateItemPoolDTORes = hydraTemplateItemPoolService.save(hydraTemplateItemPoolDTO);
invokeResult.setData(hydraTemplateItemPoolDTORes);
invokeResult.success();
} catch (Exception e) {
log.error("==========保存附件项异常", e);
invokeResult.failure(e.getMessage());
}
log.info("<<<<<<<<< return invokeResult;
}
}
/<hydratemplateitempooldto>/<hydratemplateitempooldto>

1)从页面测试,(这里也可以用postman直接发起rest请求测试)

Request URL: http://192.168.2.176:8088/hydra/itemPool/save

请求截图如下:

节省工作量,Mybatis-plus里面常见的一些坑……

页面显示创建时间为空。

2)后台代码断点调试:

断点截图如下:

节省工作量,Mybatis-plus里面常见的一些坑……

后台显示创建时间,更新时间,是否删除均为空。

3)查看数据库字段是否插入:

数据库结果截图如下:

节省工作量,Mybatis-plus里面常见的一些坑……

从数据库可以看出确实是按照我们的配置类里面设置的时间入库的。


以上就是有关mybatis-plus里面公共字段的配置问题说明以及常见的坑。

肯定还有没提及到的坑,欢迎大家提出来,我们一起探讨。


分享到:


相關文章: