首页 > 其他分享 >mybatis配置自动填充时间拦截器

mybatis配置自动填充时间拦截器

时间:2024-08-02 11:05:56浏览次数:17  
标签:lang 拦截器 java 填充 annotation field mybatis import class

1. Annotation:

  ① FillOnInsert

  import java.lang.annotation.ElementType;
  import java.lang.annotation.Retention;
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Target;

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.FIELD})
  public @interface FillOnInsert {
  Class<?> value();
  }

  ② FillOnUpdate

  import java.lang.annotation.ElementType;
  import java.lang.annotation.Retention;
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Target;

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.FIELD})
  public @interface FillOnUpdate {
  Class<?> value();
  }

2. handler(class):

  import com.embracesource.common.core.utils.StringUtils;
  import com.jichu.shebei.annotation.FillOnInsert;
  import com.jichu.shebei.annotation.FillOnUpdate;
  import org.apache.ibatis.executor.Executor;
  import org.apache.ibatis.mapping.MappedStatement;
  import org.apache.ibatis.mapping.SqlCommandType;
  import org.apache.ibatis.plugin.Interceptor;
  import org.apache.ibatis.plugin.Intercepts;
  import org.apache.ibatis.plugin.Invocation;
  import org.apache.ibatis.plugin.Signature;
  import org.springframework.stereotype.Component;

  import java.lang.reflect.Field;
  import java.util.Date;
  import java.util.Properties;

  /**
   * @description: 填充时间字段处理器
   **/
  @Component
  @Intercepts({@Signature(type = Executor.class,
method = "update",
args = {MappedStatement.class, Object.class})})
  public class FillTimeFieldHandler implements Interceptor {

@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement statement = (MappedStatement) invocation.getArgs()[0];
SqlCommandType sqlCommandType = statement.getSqlCommandType();
Object param = invocation.getArgs()[1];
Class<?> aClass = param.getClass();
Class<?> superclass = aClass.getSuperclass();
// 判断是否是BaseEntity,并将填充其时间字段
if (StringUtils.equals(superclass.getName(),"com.embracesource.common.core.web.domain.BaseEntity")) {
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
superclass.getMethod("setCreateTime", Date.class).invoke(param, new Date());
superclass.getMethod("setUpdateTime", Date.class).invoke(param, new Date());
}
if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
superclass.getMethod("setUpdateTime", Date.class).invoke(param, new Date());
}
}
// 根据注解填充
for (Field field : aClass.getDeclaredFields()) {
if (field.isAnnotationPresent(FillOnInsert.class) && SqlCommandType.INSERT.equals(sqlCommandType)) {
field.setAccessible(true);
Class<?> fillValueClass = field.getAnnotationsByType(FillOnInsert.class)[0].value();
field.set(param, fillValueClass.getDeclaredConstructor().newInstance());
}
if (field.isAnnotationPresent(FillOnUpdate.class) && SqlCommandType.UPDATE.equals(sqlCommandType)) {
field.setAccessible(true);
Class<?> fillValueClass = field.getAnnotationsByType(FillOnUpdate.class)[0].value();
field.set(param, fillValueClass.getDeclaredConstructor().newInstance());
}
}
return invocation.proceed();
}

@Override
public Object plugin(Object target) {
return Interceptor.super.plugin(target);
}

@Override
public void setProperties(Properties properties) {
Interceptor.super.setProperties(properties);
}
}

 

标签:lang,拦截器,java,填充,annotation,field,mybatis,import,class
From: https://www.cnblogs.com/sensenh/p/18338334

相关文章

  • hibernate不同实体不同填充创建人
    hibernate不同实体不同填充创建人使用的el-admin框架,框架本身填充的使用@CreatedBy注解加上AuditingEntityListener,@CreatedBy@Column(name="create_by",updatable=false)@ApiModelProperty(value="创建人",hidden=true)privateStringcreateBy;@Component("a......
  • Mybatis进阶提升-(一)Mybatis入门
    前言Mybatis是Java项目开发使用率非常高的一款持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和JavaPOJO(PlainOldJavaObjects,普......
  • 结合拦截器描述mybatis启动流程
    简介mybatis的启动入口一般有两个,在结合spring框架后由spring整合包下的SqlSessionFactoryBean启动如果没有整合spring,则有XMLConfigBuilder启动这两个启动入口都会初始化Configuration对象,该对象是mybatis配置文件的对象形式,我们实现的mybatis拦截器在此时被装载到configurati......
  • 在Mybatis中不对select做任何改变,将物理删除的逻辑迁移到逻辑删除
    假设现在有一个已经完成或者已经到中期的项目,但是忘记做逻辑删除了,更改的办法如下第一步,在项目中添加如下的拦截器importcom.baomidou.mybatisplus.core.toolkit.PluginUtils;importcom.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;importlom......
  • 手写MyBatis 重要基本原理框架
    1.手写MyBatis重要基本原理框架@目录1.手写MyBatis重要基本原理框架1.1第一步:IDEA中创建模块1.2第二步:资源工具类,方便获取指向配置文件的输入流1.3第三步:定义SqlSessionFactoryBuilder类1.4第四步:分析SqlSessionFactory类中有哪些属性1.5第五步:定义JDBCTransaction1.6......
  • mybatis中映射和注解在数据库进行增删改查的方法
    此两种方法都是基于maven项目的基础上运行主要步骤如下:1、在mevan中的pom文件添加依赖文件: 2、在src目录下编写编写配置文件(mybatis-cfg.xml) 3、编写实体类(Student.java) 4、编写映射文件(StudentMapper.xml) 5、编写测试文件 6、调用JUnit5进行调试核心文件含义:......
  • Mybatis批量更新数据库错误
    问题:记录一次使用Mybatis批量更新数据库的错误,错误信息,Errorupdatingdatabase.Cause:org.postgresql.util.PSQLException:错误:字段"update_time"的类型为timestampwithouttimezone,但表达式的类型为text建议:你需要重写或转换表达式位置:391如下图,说我有一......
  • 设置mybatis 是否打印日志
    @Bean(name="dbzyqsV102SqlSessionFactory")//@Qualifier表示查找Spring容器中名字为blogDataSource的对象publicSqlSessionFactorydbzyqsV102SqlSessionFactory(@Qualifier("dbzyqsV102DataSource")DataSourcedatasource)throwsEx......
  • javaweb面向切面aop编程-实现自定义填充
    实现自定义填充注解@AutoFill创建annotation包,编写注解类点击查看代码/***自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceAutoFill{//数据库操作类型:UPDATEINSE......
  • 一款新的超强的ORM框架 mybatis-mp !!!
    官网:https://mybatis-mp.cn1.单表查询SysUsersysUser=QueryChain.of(sysUserMapper).eq(SysUser::getId,1).eq(SysUser::getUserName,'admin').get();2.VO映射@Data@ResultEntity(SysUser.class)publicclassSysUserVo{p......