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裡面公共字段的配置問題說明以及常見的坑。

肯定還有沒提及到的坑,歡迎大家提出來,我們一起探討。


分享到:


相關文章: