feat(sj_1.1.0-beta1): mp自动填充createDt,updateDt字段

This commit is contained in:
dhb52 2024-06-16 23:36:15 +08:00
parent 5d24bf4838
commit 14342e8929
4 changed files with 109 additions and 4 deletions

View File

@ -2,9 +2,11 @@ package com.aizuda.snailjob.template.datasource.config;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.template.datasource.enums.DbTypeEnum; import com.aizuda.snailjob.template.datasource.enums.DbTypeEnum;
import com.aizuda.snailjob.template.datasource.handler.InjectionMetaObjectHandler;
import com.aizuda.snailjob.template.datasource.utils.DbUtils; import com.aizuda.snailjob.template.datasource.utils.DbUtils;
import com.aizuda.snailjob.template.datasource.utils.RequestDataHelper; import com.aizuda.snailjob.template.datasource.utils.RequestDataHelper;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
@ -46,15 +48,24 @@ public class SnailJobTemplateAutoConfiguration {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource); factoryBean.setDataSource(dataSource);
DbTypeEnum dbTypeEnum = DbUtils.getDbType(); DbTypeEnum dbTypeEnum = DbUtils.getDbType();
// 动态设置mapper资源: 通用 + 数据库专用
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources1 = resolver.getResources("classpath*:/template/mapper/*.xml"); Resource[] templateMapperResource = resolver.getResources("classpath*:/template/mapper/*.xml");
Resource[] resources2 = resolver.getResources(MessageFormat.format("classpath*:/{0}/mapper/*.xml", dbTypeEnum.getDb())); Resource[] specificMapperResource = resolver.getResources(MessageFormat.format("classpath*:/{0}/mapper/*.xml", dbTypeEnum.getDb()));
List<Resource> resources = new ArrayList<>(); List<Resource> resources = new ArrayList<>();
resources.addAll(Arrays.asList(resources1)); resources.addAll(List.of(templateMapperResource));
resources.addAll(Arrays.asList(resources2)); resources.addAll(List.of(specificMapperResource));
factoryBean.setMapperLocations(resources.toArray(new Resource[0])); factoryBean.setMapperLocations(resources.toArray(new Resource[0]));
// 分页插件
factoryBean.setPlugins(mybatisPlusInterceptor); factoryBean.setPlugins(mybatisPlusInterceptor);
factoryBean.setTypeAliasesPackage(mybatisPlusProperties.getTypeAliasesPackage()); factoryBean.setTypeAliasesPackage(mybatisPlusProperties.getTypeAliasesPackage());
// 自动填充
GlobalConfig globalConfig = mybatisPlusProperties.getGlobalConfig();
globalConfig.setMetaObjectHandler(new InjectionMetaObjectHandler());
factoryBean.setGlobalConfig(mybatisPlusProperties.getGlobalConfig()); factoryBean.setGlobalConfig(mybatisPlusProperties.getGlobalConfig());
return factoryBean.getObject(); return factoryBean.getObject();
@ -91,4 +102,5 @@ public class SnailJobTemplateAutoConfiguration {
return dynamicTableNameInnerInterceptor; return dynamicTableNameInnerInterceptor;
} }
} }

View File

@ -0,0 +1,52 @@
package com.aizuda.snailjob.template.datasource.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.aizuda.snailjob.template.datasource.exception.SnailJobDatasourceException;
import com.aizuda.snailjob.template.datasource.persistence.po.CreateDt;
import com.aizuda.snailjob.template.datasource.persistence.po.CreateUpdateDt;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.time.LocalDateTime;
/**
* @author: dhb52 (adopted from ruoyi-vue-plus)
* @date: 2024-06-16 23:22
*/
@Slf4j
public class InjectionMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof CreateDt baseEntity) {
LocalDateTime current = ObjectUtil.isNotNull(baseEntity.getCreateDt())
? baseEntity.getCreateDt() : LocalDateTime.now();
baseEntity.setCreateDt(current);
}
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof CreateUpdateDt baseEntity) {
LocalDateTime current = ObjectUtil.isNotNull(baseEntity.getCreateDt())
? baseEntity.getCreateDt() : LocalDateTime.now();
baseEntity.setUpdateDt(current);
}
} catch (Exception e) {
throw new SnailJobDatasourceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof CreateUpdateDt baseEntity) {
LocalDateTime current = LocalDateTime.now();
// 更新时间填充(不管为不为空)
baseEntity.setUpdateDt(current);
}
} catch (Exception e) {
throw new SnailJobDatasourceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
}

View File

@ -0,0 +1,23 @@
package com.aizuda.snailjob.template.datasource.persistence.po;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class CreateDt implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createDt;
}

View File

@ -0,0 +1,18 @@
package com.aizuda.snailjob.template.datasource.persistence.po;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class CreateUpdateDt extends CreateDt {
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateDt;
}