# :-: [MybatisPlus中@TableField注解的使用](https://blog.csdn.net/qq_40241957/article/details/101772536)
## 實現
官方文檔說明:
* com.baomidou.mybatisplus.annotations.TableField

* TableField 注解新增屬性 update 預處理 set 字段自定義注入
(`講解:比如我們使用mybatisplus自帶的insert()方法向數據庫插入數據時,假設我們給age字段賦值為1,但是我們在age字段上的@TableField注解里面加了update="%s+1",那么真真插入到數據庫的值就是age=2,而不是age+1了`)
```
例如:@TableField(.. , update="%s+1") 其中 %s 會填充為字段
輸出 SQL 為:update 表 set 字段=字段+1 where ...
```
* 如果給某個字段上@TableField注解里面寫update=“now()”,那么最后我們使用mybatisplus自帶的insert()方法向數據庫插入數據時,這個字段插入到數據庫中的值就為當前時間,看下面代碼的sql語句即可明白
~~~json
例如:@TableField(.. , update="now()") 使用數據庫時間
輸出 SQL 為:update 表 set 字段=now() where ...
~~~
* TableField 注解新增屬性 condition 預處理 WHERE 實體條件自定義運算規則,下面會有代碼講解
~~~json
@TableField(condition = SqlCondition.LIKE)
private String name;
輸出 SQL 為:select 表 where name LIKE CONCAT('%',值,'%')
~~~
講解:舉個例子來說明@TableField(condition = SqlCondition.LIKE)的作用
~~~java
@Data
@TableName("admin_role")
public class RoleDO extends Model<RoleDO> {
/**
* 角色ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 角色名稱
*/
@TableField(condition = SqlCondition.LIKE)
private String name;
/**
* 角色描述
*/
private String description;
/**
* 是否啟用:0-不可用,1-可用
*/
private Boolean enabled;
/**
* 刪除標示:0-未刪除,1-已刪除
*/
@TableLogic
private Boolean deleted;
/**
* 創建人ID
*/
protected Long creatorId;
/**
* 創建人
*/
protected String creator;
/**
* 創建時間
*/
@SuppressFBWarnings("EI_EXPOSE_REP")
protected Date dateCreated;
/**
* 修改人ID
*/
protected Long modifierId;
/**
* 修改人
*/
protected String modifier;
/**
* 更新時間
*/
@SuppressFBWarnings("EI_EXPOSE_REP")
protected Date lastModified;
/** 指定主鍵 */
@Override
protected Serializable pkVal() {
return this.id;
}
}
~~~
`我們通過直接給EntityWrapper對象傳入RoleDO實體類來構造EntityWrapper`, EntityWrapper eWrapper = new EntityWrapper(roleDO); (代碼如下)
~~~java
/**
* 查詢角色列表(分頁)
*
* @param roleParam 角色參數
* @return 查詢角色分頁列表
*/
public Page<RoleDO> selectListPage(ListRoleParam roleParam) {
RoleDO roleDO = new RoleDO();
BeanUtils.copyProperties(roleParam, roleDO);
Page<RoleDO> page = new Page<RoleDO>((int)roleParam.getPi(), (int)roleParam.getPs()); //得到分頁的信息
EntityWrapper<RoleDO> eWrapper = new EntityWrapper<RoleDO>(roleDO);//構建條件查詢對象
Page<RoleDO> roleDOList = roleDO.selectPage(page, eWrapper);//這里使用的就是Model提供的AR
return roleDOList;
}
~~~
而對于name這樣的字段在日常查詢中往往是通過like方式來進行匹配的而非精確匹配,所以此處通過@TableField(condition = SqlCondition.LIKE)來實現動態組合查詢條件,會根據前臺傳入的參數自動組合查詢語句并進行分頁。
* 字段填充策略 FieldFill

講解如下:
實體類中有如下屬性,通過上面的自動填充屬性,我們可以實現在進行插入(insert)操作時對添加了注解@TableField(fill = FieldFill.INSERT)的字段進行自動填充(`解釋:后面會寫配置自動填充的配置類,該配置類的作用用于配置自動填充的值`)。
對添加了注解@TableField(fill = FieldFill.INSERT\_UPDATE)的字段在進行插入(insert)和更新(update)時進行自動填充。(`解釋:后面會寫配置自動填充的配置類,該配置類的作用用于配置自動填充的值`)。
~~~java
/**
* 創建人
*/
@TableField(fill = FieldFill.INSERT)
private Long creatorId;
/**
* 創建時間
*/
@TableField(fill = FieldFill.INSERT)
private Date gmtCreat;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long modifierId;
/**
* 修改時間
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
/**
* 是否可用
*/
@TableField(fill = FieldFill.INSERT)
private Boolean availableFlag;
~~~
這樣我們在具體業務中對實體類進行賦值就可以不用對這些公共字段進行賦值,在執行插入或者更新時就能自動賦值并插入數據庫。
那么要自動賦的值在哪里配置?
在項目的config包下新建自動填充處理類使其實現接口MetaObjectHandler,接下來我們來寫自動賦值的配置類,并重寫其方法:
~~~java
package com.ws.api.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 自動填充處理類
* @author badao
* @version 1.0
* @see
**/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override //在執行mybatisPlus的insert()時,為我們自動給某些字段填充值,這樣的話,我們就不需要手動給insert()里的實體類賦值了
public void insertFill(MetaObject metaObject) {
//其中方法參數中第一個是前面自動填充所對應的字段,第二個是要自動填充的值。第三個是指定實體類的對象
this.setFieldValByName("modifierId", new Long(111), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
this.setFieldValByName("creatorId", new Long(111), metaObject);
this.setFieldValByName("gmtCreat",new Date(), metaObject);
this.setFieldValByName("availableFlag",true, metaObject);
}
@Override//在執行mybatisPlus的update()時,為我們自動給某些字段填充值,這樣的話,我們就不需要手動給update()里的實體類賦值了
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("modifierId", new Long(111), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
~~~
到此,@TableField完成字段自動填充的內容就講完了
接下來我們來看@TableField(exist=false)的作用
比如在實體類中有一個屬性為remark,但是在數據庫中沒有這個字段,但是在執行插入操作時給實體類的remark屬性賦值了,那么可以通過在實體類的remark屬性上添加
~~~java
@TableField(exist=false)
private String remark;
~~~
就不會報錯了。