精华内容
下载资源
问答
  • MybatisPlus中@TableField注解的使用

    万次阅读 多人点赞 2019-09-30 14:51:29
    实现 官方文档说明: ... TableField 注解新增属性 ...(讲解:比如我们使用mybatisplus自带的insert()方法向数据库插入数据时,假设我们给age字段赋值为1,但是我们在age字段上的@TableField注解里面加了update="%s...

    实现

    官方文档说明:

    • 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;
    

    就不会报错了。

    在这里插入图片描述

    接下来的一段时间,我会专注Java技术栈,计算机网络,数据结构和算法,操作系统,设计模式,计算机组成原理,数据库原理,设计模式来做分享,欢迎你们和我一起学习,一起提高,Fighting!

    本文转载自:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/89425635

    展开全文
  • 主要介绍了MybatisPlus中@TableField注解的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • @TableField 注解 填充策略主要是告诉他我啥时候开始填充, 1。在实体类加上@TableField 注解, //字段插入自动填充 @TableField(fill = FieldFill.INSERT) private Date createTime; //字段更新自动填充 @TableField...

    @TableField 注解

    填充策略主要是告诉他我啥时候开始填充,
    1。在实体类加上@TableField 注解,

    //字段插入自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //字段更新自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    2.看看@TableField的源码

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
    public @interface TableField {
        String value() default "";
    
        boolean exist() default true;
    
        String condition() default "";
    
        String update() default "";
    
        FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
    
        FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
    
        FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
    
        FieldFill fill() default FieldFill.DEFAULT;
    
        boolean select() default true;
    
        boolean keepGlobalFormat() default false;
    
        JdbcType jdbcType() default JdbcType.UNDEFINED;
    
        Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
    
        String numericScale() default "";
    }
    

    其中的FieldFill 就是填充的策略,默认 FieldFill.DEFAULT,不填充

    public enum FieldFill {
        DEFAULT,
        INSERT,
        UPDATE,
        INSERT_UPDATE;
    
        private FieldFill() {
        }
    }

    DEFAULT, 默认,不填充
    INSERT, 插入时填充
    UPDATE, 更新时填充
    INSERT_UPDATE; 插入更新都填充
    3。要写处理器handler,去告诉到底填充那几个字段

    @Slf4j
    @Component//记得加到容器
    public class MybatisObjectHandler implements MetaObjectHandler {
    
        //插入时的填充出的略
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("star insert fill...");
            //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
            this.setFieldValByName("createTime",new Date(),metaObject);
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    //更新时填充
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("star update fill...");
            //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }

    this.setFieldValByName(“createTime”,new Date(),metaObject);
    createTime就是要填充的。

    4.测试

    @Test
    public void insetTest(){
        User user=new User();
        user.setAge(19);
        user.setEmail("code@qq.com");
        user.setName("mzh");
    
        int result=userMapper.insert(user);//自动生成id
        System.out.println("result"+result);
        System.out.println("user"+user);///id自动回填
    }
    JDBC Connection [HikariProxyConnection@1621615881 wrapping com.mysql.cj.jdbc.ConnectionImpl@2e13f304] will not be managed by Spring
    ==>  Preparing: INSERT INTO user ( name, age, email, create_time, update_time, version ) VALUES ( ?, ?, ?, ?, ?, ? ) 
    ==> Parameters: meng(String), 19(Integer), code@qq.com(String), 2020-06-19 08:44:17.474(Timestamp), 2020-06-19 08:44:17.474(Timestamp), 0(Integer)
    <==    Updates: 1
    展开全文
  • 文章目录MyBatisPlus中使用@TableField注解处理默认填充时间的情况1.利用数据库填写默认时间2.使用自动填充默认填充插入或更新数据库时表中牵涉到的时间编写处理器类给实体类的属性添加@TableField注解测试测试成功...

    MyBatisPlus中使用@TableField注解处理默认填充时间的情况

    在数据库的表中创建时间,修改时间!这些个操作一般都是自动化完成的,我们不希望手动更新。

    阿里巴巴开发手册:所有的数据库表:gmt_create,gmt_modified几乎所有的表都要配置上!而且需要自动化!

    1.利用数据库填写默认时间

    1.在表中新增字段create_time,update_time,给这个字段设置一个current_timestamp时间戳,这样默认值就是当前时间,但是mysql版本如果过低的话是不支持current_timestamp关键字的,如下图:

    在这里插入图片描述

    2.使用自动填充默认填充插入或更新数据库时表中牵涉到的时间

    编写处理器类

    首先需要编写一个处理器,如下图:

    在这里插入图片描述

    注意上面的处理器一定要加上@Component注解表示把此处理器注入到IOC容器中。SpringBoot中无论是处理器包handler还是配置包config都需要把里面的类加上@Component注解表示把类注入到IOC容器中,要不然处理器和配置类不会生效。

    给实体类的属性添加@TableField注解

    其次要在对应的实体类上的属性上加上@TableField注解,如下图:

    在这里插入图片描述

    测试

    最后写一个单元测试,测试更新或者插入的时候能否实现createTime和updateTime的自动填充操作,如下图:

    在这里插入图片描述

    测试成功的结果状态

    数据库中的字段类型要设置成是datetime,添加成功后的数据格式如下图:

    在这里插入图片描述

    类型设置

    数据库中的表中的时间字段create_time和update_time设置成datetime类型,User实体中的createTime和updateTime和处理器中的new Date()所有的时间类型用java.util.Date包中的Date类型。

    展开全文
  • 在前后分离项目中 返回JSON 数据中 因为有分级情况的存在 对应的级层中 使数据如果它为空的时候 我不需要这个字段的返回 但是它不为空的时候 我要用得到 这个注解就完美的解决了这个问题·· ···· @JsonInclude...

    @JsonInclude

    @JsonInclude的使用场景

    在前后分离项目中 返回JSON 数据中 因为有分级情况的存在 对应的级层中 使数据如果它为空的时候 我不需要这个字段的返回 但是它不为空的时候 我要用得到 这个注解就完美的解决了这个问题·· ····

    @JsonInclude的使用

    实体类中使用在这里插入图片描述

    属于com.fasterxml.jackson.annotation.JsonInclude;

    注解中的源码

     public Include value() default Include.ALWAYS;
     
     public Include content() default Include.ALWAYS;
        public enum Include
        {
        ALWAYS,
        NON_NULL,
        NON_ABSENT,
         NON_EMPTY,
         NON_DEFAULT,
          CUSTOM,
    

    JsonJsonInclude.Include.ALWAYS

    任何情况下都序列化该字段,和不写这个注解是一样的效果。

    JsonJsonInclude.Include.NON_NULL

    这个最常用,即如果加该注解的字段为null,那么就不序列化这个字段了。

    JsonJsonInclude.Include.NON_ABSENT

    这个包含NON_NULL,即为null的时候不序列化

    @TableField

    @TableField的使用场景

    这个属性不是数据库里面的 多用于一对多 或多对对

    @TableField的使用

    在这里插入图片描述
    在实体类类属性注解上加即可

    属于import com.baomidou.mybatisplus.annotation.TableField;

    注解中的源码 看之即懂

    /*
     * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
     * <p>
     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
     * use this file except in compliance with the License. You may obtain a copy of
     * the License at
     * <p>
     * https://www.apache.org/licenses/LICENSE-2.0
     * <p>
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     * License for the specific language governing permissions and limitations under
     * the License.
     */
    package com.baomidou.mybatisplus.annotation;
    
    import org.apache.ibatis.mapping.ParameterMapping;
    import org.apache.ibatis.mapping.ResultMapping;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.TypeHandler;
    import org.apache.ibatis.type.UnknownTypeHandler;
    
    import java.lang.annotation.*;
    
    
    /**
     * 表字段标识
     *
     * @author hubin sjy tantan
     * @since 2016-09-09
     */
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface TableField {
    
        /**
         * 字段值(驼峰命名方式,该值可无)
         */
        String value() default "";
    
        /**
         * 是否为数据库表字段
         * 默认 true 存在,false 不存在
         */
        boolean exist() default true;
    
        /**
         * 字段 where 实体查询比较条件
         * 默认 `=` 等值
         */
        String condition() default "";
    
        /**
         * 字段 update set 部分注入, 该注解优于 el 注解使用
         * <p>
         * 例1:@TableField(.. , update="%s+1") 其中 %s 会填充为字段
         * 输出 SQL 为:update 表 set 字段=字段+1 where ...
         * <p>
         * 例2:@TableField(.. , update="now()") 使用数据库时间
         * 输出 SQL 为:update 表 set 字段=now() where ...
         */
        String update() default "";
    
        /**
         * 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略
         * IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty});
         * NOT_NULL: insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
         * NOT_EMPTY: insert into table_a(<if test="columnProperty != null and columnProperty!=''">column</if>) values (<if test="columnProperty != null and columnProperty!=''">#{columnProperty}</if>)
         *
         * @since 3.1.2
         */
        FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
    
        /**
         * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略
         * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去
         * NOT_NULL: update table_a set <if test="columnProperty != null">column=#{columnProperty}</if>
         * NOT_EMPTY: update table_a set <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
         *
         * @since 3.1.2
         */
        FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
    
        /**
         * 字段验证策略之 where: 表示该字段在拼接where条件时的策略
         * IGNORED: 直接拼接 column=#{columnProperty}
         * NOT_NULL: <if test="columnProperty != null">column=#{columnProperty}</if>
         * NOT_EMPTY: <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
         *
         * @since 3.1.2
         */
        FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
    
        /**
         * 字段自动填充策略
         */
        FieldFill fill() default FieldFill.DEFAULT;
    
        /**
         * 是否进行 select 查询
         * <p>大字段可设置为 false 不加入 select 查询范围</p>
         */
        boolean select() default true;
    
        /**
         * 是否保持使用全局的 Format 的值
         * <p> 只生效于 既设置了全局的 Format 也设置了上面 {@link #value()} 的值 </p>
         * <li> 如果是 false , 全局的 Format 不生效 </li>
         *
         * @since 3.1.1
         */
        boolean keepGlobalFormat() default false;
    
        /**
         * JDBC类型 (该默认值不代表会按照该值生效)
         * <p>
         * {@link ResultMapping#jdbcType} and {@link ParameterMapping#jdbcType}
         *
         * @since 3.1.2
         */
        JdbcType jdbcType() default JdbcType.UNDEFINED;
    
        /**
         * 类型处理器 (该默认值不代表会按照该值生效)
         * <p>
         * {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler}
         *
         * @since 3.1.2
         */
        Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
    
        /**
         * 指定小数点后保留的位数
         * <p>
         * {@link ParameterMapping#numericScale}
         *
         * @since 3.1.2
         */
        String numericScale() default "";
    }
    
    
    展开全文
  • 背景: 在做一个SpringBoot2+MybatisPlus3项目时,要求数据库中有个更新时间(UPDATE_DATE)字段,在插入和更新数据时,字段自动插入/更新为当前时间;在网上搜了很多方法,发现...@TableField(value = "UPDATE_DAT...
  • https://blog.csdn.net/qq_40241957/article/details/101772536
  • 如果给某个字段上@TableField注解里面写update=“now()”,那么最后我们使用mybatisplus自带的insert()方法向数据库插入数据时,这个字段插入到数据库中的值就为当前时间,看下面代码的sql语句即可明白 例如:@...
  • } } @TableField注解完成自动填充赋值使用 案例: package com.jt.pojo; import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.FieldFill; import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 506
精华内容 202
关键字:

tablefield注解