龙空技术网

Mybatis-plus实现自动插入创建人,修改人,创建时间

二手代码 112

前言:

如今小伙伴们对“c语言计时代码”大致比较关注,朋友们都需要剖析一些“c语言计时代码”的相关资讯。那么小编也在网摘上网罗了一些关于“c语言计时代码””的相关内容,希望朋友们能喜欢,我们快快来学习一下吧!

在做新增修改的时候,往往需要手动去加创建人,创建时间。十分的繁琐且都是重复操作。于是想让其自动注入,这几个特殊字段。

首先我们可以看到mybatis-plus提供有一个抽象类,可以实现公共字段的自动写入该类:MetaObjectHandler

/* * Copyright (c) 2011-2021, baomidou (jobob@qq.com). * * 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 * *      * * 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.annotation.FieldFill;import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;import com.baomidou.mybatisplus.core.metadata.TableInfo;import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;import org.apache.ibatis.reflection.MetaObject;import java.util.Collections;import java.util.List;import java.util.Objects;import java.util.Optional;import java.util.function.Supplier;/** * 元对象字段填充控制器抽象类,实现公共字段自动写入<p> * <p> * 所有入参的 MetaObject 必定是 entity 或其子类的 MetaObject * * @author hubin * @since 2016-08-28 */public interface MetaObjectHandler {    /**     * 是否开启了插入填充     */    default boolean openInsertFill() {        return true;    }    /**     * 是否开启了更新填充     */    default boolean openUpdateFill() {        return true;    }    /**     * 插入元对象字段填充(用于插入时对公共字段的填充)     *     * @param metaObject 元对象     */    void insertFill(MetaObject metaObject);    /**     * 更新元对象字段填充(用于更新时对公共字段的填充)     *     * @param metaObject 元对象     */    void updateFill(MetaObject metaObject);    /**     * 通用填充     *     * @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 (Objects.nonNull(fieldVal) && metaObject.hasSetter(fieldName)) {            metaObject.setValue(fieldName, fieldVal);        }        return this;    }    /**     * get value from java bean by propertyName     *     * @param fieldName  java bean property name     * @param metaObject parameter wrapper     * @return 字段值     */    default Object getFieldValByName(String fieldName, MetaObject metaObject) {        return metaObject.hasGetter(fieldName) ? metaObject.getValue(fieldName) : null;    }    /**     * insert 时填充,只会填充 fill 被标识为 INSERT 与 INSERT_UPDATE 的字段     *     * @param fieldName  java bean property name     * @param fieldVal   java bean property value     * @param metaObject meta object parameter     * @since 3.0.7     * @deprecated 3.3.0 please use {@link #strictInsertFill}     */    @Deprecated    default MetaObjectHandler setInsertFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {        return setFieldValByName(fieldName, fieldVal, metaObject, FieldFill.INSERT);    }    /**     * update 时填充,只会填充 fill 被标识为 UPDATE 与 INSERT_UPDATE 的字段     *     * @param fieldName  java bean property name     * @param fieldVal   java bean property value     * @param metaObject meta object parameter     * @since 3.0.7     * @deprecated 3.3.0 please use {@link #strictUpdateFill}     */    @Deprecated    default MetaObjectHandler setUpdateFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {        return setFieldValByName(fieldName, fieldVal, metaObject, FieldFill.UPDATE);    }    /**     * Common method to set value for java bean.     *     * @param fieldName  java bean property name     * @param fieldVal   java bean property value     * @param metaObject meta object parameter     * @param fieldFill  填充策略枚举     * @since 3.0.7     * @deprecated 3.3.0 please use like {@link #strictInsertFill} or {@link #strictUpdateFill}     */    @Deprecated    default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {        if (Objects.nonNull(fieldVal) && isFill(fieldName, fieldVal, metaObject, fieldFill)) {            metaObject.setValue(fieldName, fieldVal);        }        return this;    }    /**     * 填充判断     * <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     * @deprecated 3.3.0     */    @Deprecated    default boolean isFill(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {        Optional<TableFieldInfo> first = findTableInfo(metaObject).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 == fieldFill || FieldFill.INSERT_UPDATE == fill;        }        return false;    }    /**     * find the tableInfo cache by metaObject </p>     * 获取 TableInfo 缓存     *     * @param metaObject meta object parameter     * @return TableInfo     * @since 3.3.0     */    default TableInfo findTableInfo(MetaObject metaObject) {        return TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default <T, E extends T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Class<T> fieldType, E fieldVal) {        return strictInsertFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default <T, E extends T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {        return strictInsertFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldVal, fieldType)));    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default MetaObjectHandler strictInsertFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {        return strictFill(true, tableInfo, metaObject, strictFills);    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default <T, E extends T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {        return strictUpdateFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldVal, fieldType)));    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default <T, E extends T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Class<T> fieldType, E fieldVal) {        return strictUpdateFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));    }    /**     * @param metaObject metaObject meta object parameter     * @return this     * @since 3.3.0     */    default MetaObjectHandler strictUpdateFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {        return strictFill(false, tableInfo, metaObject, strictFills);    }    /**     * 严格填充,只针对非主键的字段,只有该表注解了fill 并且 字段名和字段属性 能匹配到才会进行填充(null 值不填充)     *     * @param insertFill  是否验证在 insert 时填充     * @param tableInfo   cache 缓存     * @param metaObject  metaObject meta object parameter     * @param strictFills 填充信息     * @return this     * @since 3.3.0     */    default MetaObjectHandler strictFill(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {        if ((insertFill && tableInfo.isWithInsertFill()) || (!insertFill && tableInfo.isWithUpdateFill())) {            strictFills.forEach(i -> {                final String fieldName = i.getFieldName();                final Class<?> fieldType = i.getFieldType();                tableInfo.getFieldList().stream()                    .filter(j -> j.getProperty().equals(fieldName) && fieldType.equals(j.getPropertyType()) &&                        ((insertFill && j.isWithInsertFill()) || (!insertFill && j.isWithUpdateFill()))).findFirst()                    .ifPresent(j -> strictFillStrategy(metaObject, fieldName, i.getFieldVal()));            });        }        return this;    }    /**     * 填充策略,默认有值不覆盖,如果提供的值为null也不填充     *     * @param metaObject metaObject meta object parameter     * @param fieldName  java bean property name     * @param fieldVal   java bean property value of Supplier     * @return this     * @since 3.3.0     */    default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {        if (getFieldValByName(fieldName, metaObject) == null) {            setFieldValByName(fieldName, fieldVal, metaObject);        }        return this;    }    /**     * 严格模式填充策略,默认有值不覆盖,如果提供的值为null也不填充     *     * @param metaObject metaObject meta object parameter     * @param fieldName  java bean property name     * @param fieldVal   java bean property value of Supplier     * @return this     * @since 3.3.0     */    default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {        if (metaObject.getValue(fieldName) == null) {            Object obj = fieldVal.get();            if (Objects.nonNull(obj)) {                metaObject.setValue(fieldName, obj);            }        }        return this;    }}

可以看到有很多方法去操作,那我们重点在新增和修改上,即:insertFill和updateFill这两个方法上。我们自己去写一个工具类去实现这两个方法。

/** * @Description: 处理新增和更新的基础数据填充,配合BaseEntity和MyBatisPlusConfig使用 * @Authorliu * @Create: 2023-01-06 */@Componentpublic class MetaHandler implements MetaObjectHandler {    private static final Logger logger = LoggerFactory.getLogger(MetaHandler.class);    /**     * 新增数据执行     *     * @param metaObject     */    @Override    public void insertFill(MetaObject metaObject) {        LoginUser userEntity = null;        try {            userEntity = SecurityUtils.getLoginUser();        } catch (Exception e) {        }        this.setFieldValByName("createTime", new Date(), metaObject);        this.setFieldValByName("createBy", userEntity != null ? userEntity.getUsername() : "", metaObject);        this.setFieldValByName("updateTime", new Date(), metaObject);        this.setFieldValByName("updateBy", userEntity != null ? userEntity.getUsername() : "", metaObject);    }    /**     * 更新数据执行     *     * @param metaObject     */    @Override    public void updateFill(MetaObject metaObject) {        LoginUser userEntity = null;        try {            userEntity = SecurityUtils.getLoginUser();        } catch (Exception e) {        }        this.setFieldValByName("updateTime", new Date(), metaObject);        this.setFieldValByName("updateBy", userEntity != null ? userEntity.getUsername() : "", metaObject);    }}

那这里我是从SecurityUtils.getLoginUser(); 获取的当前用户信息,这个地方各自根据项目情况获取对应的数据进行填充即可。

最后配合@TableField(),以及fill = FieldFill.INSERT_UPDATE参数才能生效

/** * 字段填充策略枚举类 * * <p> * 判断注入的 insert 和 update 的 sql 脚本是否在对应情况下忽略掉字段的 if 标签生成 * <if test="...">......</if> * 判断优先级比 {@link FieldStrategy} 高 * </p> * * @author hubin * @since 2017-06-27 */public enum FieldFill {    /**     * 默认不处理     */    DEFAULT,    /**     * 插入时填充字段     */    INSERT,    /**     * 更新时填充字段     */    UPDATE,    /**     * 插入和更新时填充字段     */    INSERT_UPDATE}

fill参数传入的枚举类型,根据需要可以自己选择合适自己项目情况的枚举。

#头条创作挑战赛#

标签: #c语言计时代码