您的当前位置:首页正文

MybatisPlus中@TableField注解的使用详解

2022-09-24 来源:好走旅游网
MybatisPlus中@TableField注解的使⽤详解

实现

官⽅⽂档说明:

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语句即可明⽩例如: @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 { /**

* ⾓⾊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 = newEntityWrapper(roleDO); (代码如下)

/**

* 查询⾓⾊列表(分页) *

* @param roleParam ⾓⾊参数 * @return 查询⾓⾊分页列表 */

public Page selectListPage(ListRoleParam roleParam) { RoleDO roleDO = new RoleDO();

BeanUtils.copyProperties(roleParam, roleDO);

Page page = new Page((int)roleParam.getPi(), (int)roleParam.getPs()); //得到分页的信息 EntityWrapper eWrapper = new EntityWrapper(roleDO);//构建条件查询对象 Page 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)时进⾏⾃动填充。(解释:后⾯会写配置⾃动填充的配置类,该配置类的作⽤⽤于配置⾃动填充的值)。

/**

* 创建⼈ */

@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\ this.setFieldValByName(\"gmtModified\ this.setFieldValByName(\"creatorId\ this.setFieldValByName(\"gmtCreat\ this.setFieldValByName(\"availableFlag\ }

@Override//在执⾏mybatisPlus的update()时,为我们⾃动给某些字段填充值,这样的话,我们就不需要⼿动给update()⾥的实体类赋值了 public void updateFill(MetaObject metaObject) {

this.setFieldValByName(\"modifierId\ this.setFieldValByName(\"gmtModified\ }}

到此,@TableField完成字段⾃动填充的内容就讲完了接下来我们来看@TableField(exist=false)的作⽤

⽐如在实体类中有⼀个属性为remark,但是在数据库中没有这个字段,但是在执⾏插⼊操作时给实体类的remark属性赋值了,那么可以通过在实体类的remark属性上添加

@TableField(exist=false) private String remark;

就不会报错了。

到此这篇关于MybatisPlus中@TableField注解的使⽤详解的⽂章就介绍到这了,更多相关MybatisPlus @TableField注解内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容