前言:
如今小伙伴们对“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语言计时代码