三、@TableField
1、value屬性
功能同TableId的value屬性
注意:MP會自動將數據庫中的下划線命名風格轉化為實體類中的駝峰命名風格
例如,數據庫中的列 create_time 和 update_time 自動對應實體類中的 createTime 和 updateTime
private LocalDateTime createTime;
private LocalDateTime updateTime;
擴展知識:為什么建議使用你 LocalDateTime ,而不是 Date?https://zhuanlan.zhihu.com/p/87555377
- java.util.Date的大多數方法已經過時
- java.util.Date的輸出可讀性差
- java.util.Date對應的格式化類SimpleDateFormat是線程不安全的類。阿里巴巴開發手冊中禁用static修飾SimpleDateFormat。
- LocalDateTime 對應的格式化類DateTimeFormatter是線程安全的
2、自動填充
需求描述:
項目中經常會遇到一些數據,每次都使用相同的方式填充,例如記錄的創建時間,更新時間等。我們可以使用MyBatis Plus的自動填充功能,完成這些字段的賦值工作。
例如,阿里巴巴的開發手冊中建議每個數據庫表必須要有create_time 和 update_time字段,我們可以使用自動填充功能維護這兩個字段
- step1:添加fill屬性
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
- step2:實現元對象處理器接口 -> 創建handler包,創建MyMetaObjectHandler類
注意:不要忘記添加 @Component 注解
package com.atguigu.mybatisplus.handler;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
3、測試
- 測試新增
- 測試修改
4、優化
- 避免自動填充時開銷過大,填充前先判斷當前對象中是否有相關屬性
@Override
public void insertFill(MetaObject metaObject) {
//其他代碼
//判斷是否具備author屬性
boolean hasAuthor = metaObject.hasSetter("author");
if(hasAuthor){
log.info("start insert fill author....");
this.strictInsertFill(metaObject, "author", String.class, "Helen");
}
}
- 用戶明確定義了屬性值,則無需自動填充,否則使用自動填充
@TableField(fill = FieldFill.INSERT)
private Integer age;
@Override
public void insertFill(MetaObject metaObject) {
//其他代碼
//判斷age是否賦值
Object age = this.getFieldValByName("age", metaObject);
if(age == null){
log.info("start insert fill age....");
this.strictInsertFill(metaObject, "age", String.class, "18");
}
}