1. 程式人生 > 程式設計 >MybatisPlus中@TableField註解的使用詳解

MybatisPlus中@TableField註解的使用詳解

實現

官方文件說明:

com.baomidou.mybatisplus.annotations.TableField

MybatisPlus中@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語句即可明白

例如: @TableField(..,update="now()") 使用資料庫時間
輸出 SQL 為:update 表 set 欄位=now() where ...

TableField 註解新增屬性 condition 預處理 WHERE 實體條件自定義運算規則,下面會有程式碼講解

@TableField(condition = SqlCondition.LIKE)
private String name;
輸出 SQL 為:select 表 where name LIKE CONCAT('%',值,'%')

講解:舉個例子來說明@TableField(condition = SqlCondition.LIKE)的作用

@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); (程式碼如下)

/**
   * 查詢角色列表(分頁)
   *
   * @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

MybatisPlus中@TableField註解的使用詳解

講解如下:

實體類中有如下屬性,通過上面的自動填充屬性,我們可以實現在進行插入(insert)操作時對添加了註解@TableField(fill = FieldFill.INSERT)的欄位進行自動填充(解釋:後面會寫配置自動填充的配置類,該配置類的作用用於配置自動填充的值)。

對添加了註解@TableField(fill = FieldFill.INSERT_UPDATE)的欄位在進行插入(insert)和更新(update)時進行自動填充。(解釋:後面會寫配置自動填充的配置類,該配置類的作用用於配置自動填充的值)。

/**
   * 建立人
   */
  @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,接下來我們來寫自動賦值的配置類,並重寫其方法:

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",metaObject);
    this.setFieldValByName("gmtCreat",metaObject);
    this.setFieldValByName("availableFlag",true,metaObject);
   
 
  }
 
  @Override//在執行mybatisPlus的update()時,為我們自動給某些欄位填充值,這樣的話,我們就不需要手動給update()裡的實體類賦值了
  public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("modifierId",metaObject);
  }
}

到此,@TableField完成欄位自動填充的內容就講完了

接下來我們來看@TableField(exist=false)的作用

比如在實體類中有一個屬性為remark,但是在資料庫中沒有這個欄位,但是在執行插入操作時給實體類的remark屬性賦值了,那麼可以通過在實體類的remark屬性上新增

@TableField(exist=false)
 private String remark;

就不會報錯了。

到此這篇關於MybatisPlus中@TableField註解的使用詳解的文章就介紹到這了,更多相關MybatisPlus @TableField註解內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!