MybatisPlus中@TableField注解的使用详解
作者:BADAO_LIUMANG_QIZHI 发布时间:2021-11-01 23:05:35
实现
官方文档说明:
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<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
讲解如下:
实体类中有如下属性,通过上面的自动填充属性,我们可以实现在进行插入(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", 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属性上添加
@TableField(exist=false)
private String remark;
就不会报错了。
来源:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/89425635
猜你喜欢
- 引言对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现、配置管理,非常好用的一个工具。然而这样的技术用的人越多面试被问的概
- 1. 获取绝对文件路径System.IO.Path.GetFullPath(string path)string fileName = &q
- 在这篇文章中,我将向您展示如何用新的Java 8 forEach语句循环一个List和Map。1、forEach 和 Map1.1、常规循环
- 本文介绍了JAVA中实现原生的 socket 通信机制原理,分享给大家,具体如下:当前环境jdk == 1.8知识点socket 的连接处理
- 目录前言正文自定义NameSpaceHandler自定义schemaParserDecorator总结前言在早期基于Xml配置的Spring
- 下载maven 解压路径: 打开环境变量:右键此电脑-属性-高级系统设置-高级-环境变量添加以下系统变量:测试:win+
- 本文实例为大家分享了java web个人通讯录系统的具体代码,供大家参考,具体内容如下现在开始上截图:下面粘贴代码:首先是目录结构:<
- 这一篇博客我们来使用 UGUI 实现图片的拖拽功能。说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还
- 本文实例为大家分享了C#绘制饼状图和柱状图的具体代码,供大家参考,具体内容如下#代码如下:using System;using System
- 不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,如果面试者这样说,
- 在springboot中,默认继承好了一套完好的redis包,可以直接使用,但是如果使用中出了错不容易找到错误的原因,因此这里使用自己配置的
- 首先引入pom <!--SpringBoot 2.1.0--> <parent>  
- 1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期 * 实现在
- public class Wrapper { public static void main
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- 场景重现:1.微信小程序向后台发送请求 ——而后台web采用的springSecuriry没有token生成,就会拦截请求,,所以小编记录下
- 这篇文章主要介绍了java io读取文件操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 前言本文主要介绍的是关于CentOS 7配置自定义JDK的方法教程,分享出来供大家参考学习,下面来一起看看详细的介绍:配置教程由于选择的是C
- 前言记一次为了节省代码没有在方法体中声明HttpServletRequest,而用autowire直接注入所钻的坑结论:给心急的人。 直接在
- 一、 测试代码:二、添加参数1、在终端工具中①先编译: javac Test.java②再运行: java Test args1 args2