前言:
前面我们说过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里面常见的一些坑……](http://p2.ttnews.xyz/loading.gif)
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里面常见的一些坑……](http://p2.ttnews.xyz/loading.gif)
截图: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
请求截图如下:
页面显示创建时间为空。
2)后台代码断点调试:
断点截图如下:
后台显示创建时间,更新时间,是否删除均为空。
3)查看数据库字段是否插入:
数据库结果截图如下:
从数据库可以看出确实是按照我们的配置类里面设置的时间入库的。
以上就是有关mybatis-plus里面公共字段的配置问题说明以及常见的坑。
肯定还有没提及到的坑,欢迎大家提出来,我们一起探讨。
閱讀更多 IT講壇 的文章