当前位置: 首页 > news >正文

[简化开发] mybatis plus自动填充 INSERT 与 INSERT_UPDATE 坑(记录)

目录

1. 场景:  用了mybatis自动填充后

然后再实体类上添加注解

可是有的业务场景不想要这种, 希望根据注解进行判断到底是否需要填充, 去找相关文章根本没有

MetaObjectHandler 

修改方式:  ->


1. 场景:  用了mybatis自动填充后

填充时间确实好了很多 但是 发现了一个问题, 根据网上的方式 粘贴下来 后 

package com.aisce.axmall.activity.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 存在问题一: 从缓存中 获取的数据  插入数据库中 会自动覆盖掉, 不管加没加自动填充注解
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override//入库 created
    public void insertFill(MetaObject metaObject) {
        Date date = new Date();
        /**
         *   this.setFieldValByName(arg1,arg2,arg3 )
         *   arg1: 自动填充的字段名称
         *   arg2: 自动填充 的值
         *   arg3: metaObject固定写法
         */
        this.setFieldValByName("createTime", date, metaObject);
    }

    @Override//更新调用 updated
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updatedTime", new Date(), metaObject);
    }
}

然后再实体类上添加注解

@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT_UPDATE)

 说就生效了(字段对应上)

然后再把注解删除掉后 也不会影响它自动填充

可是有的业务场景不想要这种, 希望根据注解进行判断到底是否需要填充, 去找相关文章根本没有

只能看人家封装好的源码

MetaObjectHandler 

/**
     * 填充判断
     * <li> 如果是主键,不填充 </li>
     * <li> 根据字段名找不到字段,不填充 </li>
     * <li> 字段类型与填充值类型不匹配,不填充 </li>
     * <li> 字段类型需在TableField注解里配置fill: @TableField(value="test_type", fill = FieldFill.INSERT), 没有配置或者不匹配时不填充 </li>
     * v_3.1.0以后的版本(不包括3.1.0),子类的值也可以自动填充,Timestamp的值也可以填入到java.util.Date类型里面
     *
     * @param fieldName  java bean property name
     * @param fieldVal   java bean property value
     * @param metaObject meta object parameter
     * @param fieldFill  填充策略枚举
     * @return 是否进行填充
     * @since 3.0.7
     */
    default boolean isFill(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
        TableInfo tableInfo = metaObject.hasGetter(Constants.MP_OPTLOCK_ET_ORIGINAL) ?
            TableInfoHelper.getTableInfo(metaObject.getValue(Constants.MP_OPTLOCK_ET_ORIGINAL).getClass())
            : TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());
        if (Objects.nonNull(tableInfo)) {
            Optional<TableFieldInfo> first = tableInfo.getFieldList().stream()
                //v_3.1.1+ 设置子类的值也可以通过
                .filter(e -> e.getProperty().equals(fieldName) && e.getPropertyType().isAssignableFrom(fieldVal.getClass()))
                .findFirst();
            if (first.isPresent()) {
                FieldFill fill = first.get().getFieldFill();
                return fill.equals(fieldFill) || FieldFill.INSERT_UPDATE.equals(fill);
            }
        }
        return false;
    }

找到这个校验后通用填充

并没有这个校验 

setFieldValByName 

 this.setFieldValByName("createTime", date, metaObject); 这句话意思也是无需注解 也可以生效

修改方式:  ->

setUpdateFieldValByName 只更新
setInsertFieldValByName 只添加

相关文章:

  • 如何构建一款自定义的开源微服务架构?
  • SNMP工具
  • Python学习:函数中定义参数的四种方式
  • 4个非常实用的Java项目,快用起来
  • 基于Sentry打造前端性能监控平台
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • 强化学习(ICML2022)
  • CS5181E 单节锂电池充电管理IC特点及应用
  • 计算机毕业论文基于springboot的社区物业服务管理项目源码
  • Hbase大批量数据迁移之BulkLoad
  • java计算机毕业设计外贸服装订单管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • C#基于asp.net的社区团购网站
  • Spring Boot + Netty + WebSocket 消息推送
  • 【Elasticsearch教程13】Mapping字段类型之nested
  • Java基础之:线程可重入锁,公平锁,非公平锁
  • Google 是如何开发 Web 框架的
  • ES6 学习笔记(一)let,const和解构赋值
  • FineReport中如何实现自动滚屏效果
  • JavaScript学习总结——原型
  • python学习笔记-类对象的信息
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud中负载均衡器概览
  • SQLServer之创建数据库快照
  • windows-nginx-https-本地配置
  • 多线程 start 和 run 方法到底有什么区别?
  • 二维平面内的碰撞检测【一】
  • 飞驰在Mesos的涡轮引擎上
  • 聚簇索引和非聚簇索引
  • 如何进阶一名有竞争力的程序员?
  • 深度学习中的信息论知识详解
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 怎么把视频里的音乐提取出来
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • linux 淘宝开源监控工具tsar
  • Linux权限管理(week1_day5)--技术流ken
  • 交换综合实验一
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2022 CVPR) Unbiased Teacher v2
  • (二)c52学习之旅-简单了解单片机
  • (二)hibernate配置管理
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (六)激光线扫描-三维重建
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)【Hibernate总结系列】使用举例
  • (转)详解PHP处理密码的几种方式
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 材料检测系统崩溃分析
  • .net经典笔试题
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] STL---stack与queue
  • []AT 指令 收发短信和GPRS上网 SIM508/548