mybatisplus.MetaObjectHandler;元对象字段填充控制器抽象类,实现公共字段自动写入
程序员文章站
2022-07-03 19:36:42
先放一张表生成策略对应的结果值描述DEFAULT默认不处理INSERT插入时填充字段UPDATE更新时填充字段INSERT_UPDATE插入和更新时填充字段/* * Copyright (c) 2011-2014, hubin (jobob@qq.com). *
* Licensed under the Apache License, Version 2.0 (the "License"); * you...
先放一张表生成策略对应的结果
值 | 描述 |
---|---|
DEFAULT | 默认不处理 |
INSERT | 插入时填充字段 |
UPDATE | 更新时填充字段 |
INSERT_UPDATE | 插入和更新时填充字段 |
/*
* Copyright (c) 2011-2014, hubin (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>
* http://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;
/**
* <p>
* 字段填充策略枚举类
* </p>
*
* @author hubin
* @since 2017-06-27
*/
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
此处需要注意一下,如果MyBatisPlus中有一些公共字段例如修改时间,创建时间,乐观锁等等
创建是采用INSERT方案
修改时采用UPDATE
在修改时注意,使用MyBatis-Plus的update方法,传入QueryWrapper或者直接传null
用updateById会出现策略不生效的情况
贴上实现生成策略接口的代码
package com.mengxiangnongfu.project.configure.mybatisplus.tools;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.mengxiangnongfu.project.util.TimeHelper;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
/**
* 自动填充处理类
* mybatis-plus 3.3版本以上 使用注解的方式
* https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/89450006?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
*
* @author Yang
* @version 1.0
* @see
**/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) { //version是字段名 第二个参数是填充的数据
this.setFieldValByName("version", new Long(0), metaObject);
this.setFieldValByName("createTime", TimeHelper.getCurrentTime14(), metaObject);
this.setFieldValByName("updateTime", TimeHelper.getCurrentTime14(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", TimeHelper.getCurrentTime14(), metaObject);
}
}
package cn.king.core.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 实体基类
*
* @description:
* @author: Admin
* @create: 2020-12-27 13:39
**/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
@TableField(update = "now()", fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 软删除(1:存在、2:已删除)
*/
@TableLogic
private Integer isDeleted;
/**
* 版本
*/
@Version
private Integer version;
}
/*
* Copyright (c) 2011-2020, hubin (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>
* http://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.core.handlers;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
/**
* <p>
* 元对象字段填充控制器抽象类,实现公共字段自动写入
* </p>
*
* @author hubin
* @since 2016-08-28
*/
public interface MetaObjectHandler {
/**
* 插入元对象字段填充(用于插入时对公共字段的填充)
*
* @param metaObject 元对象
*/
void insertFill(MetaObject metaObject);
/**
* 更新元对象字段填充(用于更新时对公共字段的填充)
*
* @param metaObject 元对象
*/
void updateFill(MetaObject metaObject);
/**
* <p>
* Common method to set value for java bean.
* </p>
* <p>
* 如果包含前缀 et 使用该方法,否则可以直接 metaObject.setValue(fieldName, fieldVal);
* </p>
*
* @param fieldName java bean property name
* @param fieldVal java bean property value
* @param metaObject meta object parameter
*/
default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
metaObject.setValue(fieldName, fieldVal);
} else if (metaObject.hasGetter(Constants.ENTITY)) {
Object et = metaObject.getValue(Constants.ENTITY);
if (et != null) {
MetaObject etMeta = SystemMetaObject.forObject(et);
if (etMeta.hasSetter(fieldName)) {
etMeta.setValue(fieldName, fieldVal);
}
}
}
return this;
}
/**
* <p>
* get value from java bean by propertyName
* </p>
* <p>
* 如果包含前缀 et 使用该方法,否则可以直接 metaObject.setValue(fieldName, fieldVal);
* </p>
*
* @param fieldName java bean property name
* @param metaObject parameter wrapper
* @return 字段值
*/
default Object getFieldValByName(String fieldName, MetaObject metaObject) {
if (metaObject.hasGetter(fieldName)) {
return metaObject.getValue(fieldName);
} else if (metaObject.hasGetter(Constants.ENTITY_SPOT + fieldName)) {
return metaObject.getValue(Constants.ENTITY_SPOT + fieldName);
}
return null;
}
/**
* 是否开启了插入填充
*/
default boolean openInsertFill() {
return true;
}
/**
* 是否开启了更新填充
*/
default boolean openUpdateFill() {
return true;
}
}
本文地址:https://blog.csdn.net/hhj13978064496/article/details/111997934