mybatisPlus踩坑之--自动填充

这两天在做接口,数据库层采用的是mubatisPlus,在插入数据时,正常逻辑是只是插入create等信息,但是updateTime也自动插入。琢磨了两个小时,还是没找到问题所在,避免影响工期,最后手写SQL。

今天又有类似的功能开发,所以我还是想偷懒的用mybatisPlus,结果还是同样的问题,我已开始我以为是 fill填充不对

@TableField(fill = FieldFill.INSERT_UPDATE)
protected Date updateTime; // 更新日期

将 @TableField(fill = FieldFill.INSERT_UPDATE) 改成  @TableField(fill = FieldFill.UPDATE)

也可以解决问题,但是需要重写公司框架的DataEntity。

后面使用 FieldFill 查找了mybatisPlus 官方文档,终于发现问题:MetaObjectHandler 实现元对象处理器接口 里面配置有问题,在insert时也配置了update字段,所以导致数据插入异常。

直接上代码:

/**
 * mybatisplus自定义填充公共字段 ,即没有传的字段自动填充
 * @author updateBy 
 * @version 1.0.2 执行insert操作,不自动插入更新字段
 */
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    //新增填充
    @Override
    public void insertFill(MetaObject metaObject) {
    	UserInfo userInfo = ContextUtils.getUserInfo();
        String currentUser = "超级管理员";
        String currentUserId = "system";
        if(userInfo == null) {
    		ServiceContext context = ServiceContext.getContext();
    		if(context != null) {
    			currentUserId = StringUtils.isNotEmpty(context.getUserId()) ? context.getUserId() : "system";
    			currentUser = StringUtils.isNotEmpty(context.getUserName()) ? context.getUserName() : "system";
    		}
    	}else {
    		currentUser = userInfo.getNickname();
            currentUserId = userInfo.getUsername();
    	}
        //LOGGER.info("insert公共字段填充Start");
        Date now = new Date();
        Object id = getFieldValByName("id", metaObject);
        Object createUserId = getFieldValByName("createUserId", metaObject);
        Object createTime = getFieldValByName("createTime", metaObject);
        Object createUser = getFieldValByName("createUser", metaObject);
//        Object updateUser = getFieldValByName("updateUser", metaObject);
//        Object updateUserId = getFieldValByName("updateUserId", metaObject);
//        Object updateTime = getFieldValByName("updateTime", metaObject);
        //SysUser user = (SysUser)SecurityUtils.getSubject().getPrincipal();
        if (id == null) {
            setFieldValByName("id", UuidUtil.get32UUID(), metaObject); //mybatis-plus版本2.0.9+
        }
        if (createUserId == null) {
            setFieldValByName("createUserId", currentUserId, metaObject); //mybatis-plus版本2.0.9+
        }
        if (createTime == null) {
            setFieldValByName("createTime", now, metaObject); //mybatis-plus版本2.0.9+
        }
        if (createUser == null) {
            setFieldValByName("createUser", currentUser, metaObject); //mybatis-plus版本2.0.9+
        }
//        if (updateUser == null) {
//            setFieldValByName("updateUser", currentUser, metaObject); //mybatis-plus版本2.0.9+
//        }
//        if (updateUserId == null) {
//            setFieldValByName("updateUserId", currentUserId, metaObject); //mybatis-plus版本2.0.9+
//        }
//        if (updateTime == null) {
//            setFieldValByName("updateTime", now, metaObject); //mybatis-plus版本2.0.9+
//        }
        LOGGER.info("公共字段填充end");
    }

    //更新填充
    @Override
    public void updateFill(MetaObject metaObject) {
    	UserInfo userInfo = ContextUtils.getUserInfo();
    	if(userInfo == null) {
    		ServiceContext context = ServiceContext.getContext();
    		userInfo = new UserInfo();
    		userInfo.setUsername(context.getUserId());
    		userInfo.setNickname(context.getUserName());
    	}
    	String currentUser = userInfo != null ? userInfo.getNickname() : "system";
        String currentUserId = userInfo != null ? userInfo.getUsername() : "system";
        //LOGGER.info("update公共字段填充Start");
        Object updateUser = getFieldValByName("updateUser", metaObject);
        Object updateUserId = getFieldValByName("updateUserId", metaObject);
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (updateUser == null) {
            setFieldValByName("updateUser", currentUser, metaObject); //mybatis-plus版本2.0.9+
        }
        if (updateUserId == null) {
            setFieldValByName("updateUserId", currentUserId, metaObject); //mybatis-plus版本2.0.9+
        }
        if (updateTime == null) {
            setFieldValByName("updateTime", new Date(), metaObject); //mybatis-plus版本2.0.9+
        }
        //LOGGER.info("update公共字段填充end");
    }
}

注释掉update字段,完美解决问题。

结语:

1.解决问题,搜对关键字很重要

2. INSERT_UPDATE 和 UPDATE 到底有啥区别,请各位大佬帮忙解释下。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MybatisPlus 中的 `field-strategy` 更新策略,即在执行更新操作时,自动填充指定字段的值。具体来说,当执行更新操作时,MybatisPlus 会自动判断指定字段是否已经设置了值,如果没有设置值,则会将指定的值填充到该字段中。 举个例子,假设有一个用户表 `user`,其中包含了 `id`、`name`、`age` 和 `update_time` 四个字段。现在我们希望在更新用户信息时,自动将 `update_time` 字段的值设置为当前时间。那么我们可以在实体类中添加 `update_time` 字段,并在该字段上添加 `@TableField` 和 `@TableLogic` 注解,如下所示: ```java public class User { @TableId private Long id; private String name; private Integer age; @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime; // 省略 getter 和 setter 方法 } ``` 在这个例子中,我们使用了 `@TableField` 注解来标注 `updateTime` 字段,并指定了 `fill` 属性为 `FieldFill.UPDATE`,表示在执行更新操作时自动填充该字段。此外,我们还需要在 MybatisPlus 的配置文件中开启自动填充功能,如下所示: ```xml <!-- MybatisPlus 配置 --> <bean id="mybatisPlusConfig" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"> <property name="interceptors"> <list> <bean class="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"/> </list> </property> <property name="globalConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig"> <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig"> <!-- 开启自动填充功能 --> <property name="fieldStrategy" value="2"/> </bean> </property> </bean> </property> </bean> ``` 在配置文件中,我们使用了 `GlobalConfig.DbConfig.fieldStrategy` 属性来配置自动填充的策略,将其设置为 2,表示在更新操作时自动填充字段。 这样,当我们执行更新操作时,MybatisPlus 将会自动将 `updateTime` 字段的值设置为当前时间,从而实现了自动填充的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值