MybatisPlus中@TableField注解的使用詳解
實(shí)現(xiàn)
官方文檔說明:
com.baomidou.mybatisplus.annotations.TableField
TableField注解新增屬性 update 預(yù)處理 set 字段自定義注入
(講解:比如我們使用mybatisplus自帶的insert()方法向數(shù)據(jù)庫插入數(shù)據(jù)時(shí),假設(shè)我們給age字段賦值為1,但是我們?cè)赼ge字段上的@TableField注解里面加了update="%s+1",那么真真插入到數(shù)據(jù)庫的值就是age=2,而不是age+1了)
例如: @TableField(.. , update="%s+1") 其中 %s 會(huì)填充為字段
輸出 SQL 為:update 表 set 字段=字段+1 where ...
如果給某個(gè)字段上@TableField注解里面寫update=“now()”,那么最后我們使用mybatisplus自帶的insert()方法向數(shù)據(jù)庫插入數(shù)據(jù)時(shí),這個(gè)字段插入到數(shù)據(jù)庫中的值就為當(dāng)前時(shí)間,看下面代碼的sql語句即可明白
例如: @TableField(.. , update="now()") 使用數(shù)據(jù)庫時(shí)間
輸出 SQL 為:update 表 set 字段=now() where ...
TableField 注解新增屬性 condition 預(yù)處理 WHERE 實(shí)體條件自定義運(yùn)算規(guī)則,下面會(huì)有代碼講解
@TableField(condition = SqlCondition.LIKE) private String name; 輸出 SQL 為:select 表 where name LIKE CONCAT('%',值,'%')
講解:舉個(gè)例子來說明@TableField(condition = SqlCondition.LIKE)的作用
@Data @TableName("admin_role") public class RoleDO extends Model<RoleDO> { /** * 角色I(xiàn)D */ @TableId(type = IdType.AUTO) private Long id; /** * 角色名稱 */ @TableField(condition = SqlCondition.LIKE) private String name; /** * 角色描述 */ private String description; /** * 是否啟用:0-不可用,1-可用 */ private Boolean enabled; /** * 刪除標(biāo)示:0-未刪除,1-已刪除 */ @TableLogic private Boolean deleted; /** * 創(chuàng)建人ID */ protected Long creatorId; /** * 創(chuàng)建人 */ protected String creator; /** * 創(chuàng)建時(shí)間 */ @SuppressFBWarnings("EI_EXPOSE_REP") protected Date dateCreated; /** * 修改人ID */ protected Long modifierId; /** * 修改人 */ protected String modifier; /** * 更新時(shí)間 */ @SuppressFBWarnings("EI_EXPOSE_REP") protected Date lastModified; /** 指定主鍵 */ @Override protected Serializable pkVal() { return this.id; } }
我們通過直接給EntityWrapper對(duì)象傳入RoleDO實(shí)體類來構(gòu)造EntityWrapper,, EntityWrapper eWrapper = new EntityWrapper(roleDO); (代碼如下)
/** * 查詢角色列表(分頁) * * @param roleParam 角色參數(shù) * @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);//構(gòu)建條件查詢對(duì)象 Page<RoleDO> roleDOList = roleDO.selectPage(page, eWrapper);//這里使用的就是Model提供的AR return roleDOList; }
而對(duì)于name這樣的字段在日常查詢中往往是通過like方式來進(jìn)行匹配的而非精確匹配,所以此處通過@TableField(condition = SqlCondition.LIKE)來實(shí)現(xiàn)動(dòng)態(tài)組合查詢條件,會(huì)根據(jù)前臺(tái)傳入的參數(shù)自動(dòng)組合查詢語句并進(jìn)行分頁。
字段填充策略 FieldFill
講解如下:
實(shí)體類中有如下屬性,通過上面的自動(dòng)填充屬性,我們可以實(shí)現(xiàn)在進(jìn)行插入(insert)操作時(shí)對(duì)添加了注解@TableField(fill = FieldFill.INSERT)的字段進(jìn)行自動(dòng)填充(解釋:后面會(huì)寫配置自動(dòng)填充的配置類,該配置類的作用用于配置自動(dòng)填充的值
)。
對(duì)添加了注解@TableField(fill = FieldFill.INSERT_UPDATE)的字段在進(jìn)行插入(insert)和更新(update)時(shí)進(jìn)行自動(dòng)填充。(解釋:后面會(huì)寫配置自動(dòng)填充的配置類,該配置類的作用用于配置自動(dòng)填充的值
)。
/** * 創(chuàng)建人 */ @TableField(fill = FieldFill.INSERT) private Long creatorId; /** * 創(chuàng)建時(shí)間 */ @TableField(fill = FieldFill.INSERT) private Date gmtCreat; /** * 修改人 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Long modifierId; /** * 修改時(shí)間 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date gmtModified; /** * 是否可用 */ @TableField(fill = FieldFill.INSERT) private Boolean availableFlag;
這樣我們?cè)诰唧w業(yè)務(wù)中對(duì)實(shí)體類進(jìn)行賦值就可以不用對(duì)這些公共字段進(jìn)行賦值,在執(zhí)行插入或者更新時(shí)就能自動(dòng)賦值并插入數(shù)據(jù)庫。
那么要自動(dòng)賦的值在哪里配置?
在項(xiàng)目的config包下新建自動(dòng)填充處理類使其實(shí)現(xiàn)接口MetaObjectHandler,接下來我們來寫自動(dòng)賦值的配置類,并重寫其方法:
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; /** * 自動(dòng)填充處理類 * @author badao * @version 1.0 * @see **/ @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override //在執(zhí)行mybatisPlus的insert()時(shí),為我們自動(dòng)給某些字段填充值,這樣的話,我們就不需要手動(dòng)給insert()里的實(shí)體類賦值了 public void insertFill(MetaObject metaObject) { //其中方法參數(shù)中第一個(gè)是前面自動(dòng)填充所對(duì)應(yīng)的字段,第二個(gè)是要自動(dòng)填充的值。第三個(gè)是指定實(shí)體類的對(duì)象 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//在執(zhí)行mybatisPlus的update()時(shí),為我們自動(dòng)給某些字段填充值,這樣的話,我們就不需要手動(dòng)給update()里的實(shí)體類賦值了 public void updateFill(MetaObject metaObject) { this.setFieldValByName("modifierId", new Long(111), metaObject); this.setFieldValByName("gmtModified", new Date(), metaObject); } }
到此,@TableField完成字段自動(dòng)填充的內(nèi)容就講完了
接下來我們來看@TableField(exist=false)的作用
比如在實(shí)體類中有一個(gè)屬性為remark,但是在數(shù)據(jù)庫中沒有這個(gè)字段,但是在執(zhí)行插入操作時(shí)給實(shí)體類的remark屬性賦值了,那么可以通過在實(shí)體類的remark屬性上添加
@TableField(exist=false) private String remark;
就不會(huì)報(bào)錯(cuò)了。
到此這篇關(guān)于MybatisPlus中@TableField注解的使用詳解的文章就介紹到這了,更多相關(guān)MybatisPlus @TableField注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例
這篇文章主要介紹了Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09一篇文章教你使用枚舉來實(shí)現(xiàn)java單例模式
本篇文章主要介紹了Java實(shí)現(xiàn)單例的3種普遍的模式,餓漢式、懶漢式、枚舉式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-07-07springboot使用redis緩存亂碼(key或者value亂碼)的解決
在通過springboot緩存數(shù)據(jù)的時(shí)候,發(fā)現(xiàn)key是一堆很不友好的東西,本文主要介紹了springboot使用redis緩存亂碼(key或者value亂碼)的解決,感興趣的可以了解一下2023-11-11Java如何獲取@TableField,@TableName注解的值
這篇文章主要介紹了Java如何獲取@TableField,@TableName注解的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java中Redisson的看門狗機(jī)制的實(shí)現(xiàn)
本文主要介紹了java中Redisson的看門狗機(jī)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Mybatis CachingExecutor二級(jí)緩存使用示例詳解
這篇文章主要介紹了?Mybatis的CachingExecutor與二級(jí)緩存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09