springboot集成mybatis拦截器实现自动生成创建时间和更新时间

springboot集成mybatis拦截器实现自动生成创建时间和更新时间

第一步:定义注解 @UpdateTime 和 @CreateTime
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface UpdateTime {
    String value() default "";
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface CreateTime {
    String value() default "";
}
第二步:创建mybatis的拦截器

这里需要注意,mybatis的连接器添加有三种,如果采用xml方式有可能会和springboot针对mybatis的集成配置冲突,因此使用@Component。
当冲突时启动tomcat会提示Property 'configuration' and 'configLocation' can not specified with together 错误

/**
 * 自定义 Mybatis 插件,自动设置 createTime 和 updatTime 的值。
 * 拦截 update 操作(添加和修改)
 */
// 不能使用xml配置文件,因为会和其他mybatis的配置冲突,因此添加 @Component
@Component
@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
public class CustomInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

        // 获取 SQL 命令
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();

        // 获取参数
        Object parameter = invocation.getArgs()[1];

        // 获取私有成员变量
        Field[] declaredFields = parameter.getClass().getDeclaredFields();

        for (Field field : declaredFields) {
            if (field.getAnnotation(CreateTime.class) != null) {
                if (SqlCommandType.INSERT.equals(sqlCommandType)) { // insert 语句插入 createTime
                    field.setAccessible(true);
                    field.set(parameter, new Timestamp(System.currentTimeMillis()));
                }
            }

            if (field.getAnnotation(UpdateTime.class) != null) { // insert 或 update 语句插入 updateTime
                if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {
                    field.setAccessible(true);
                    field.set(parameter, new Timestamp(System.currentTimeMillis()));
                }
            }
        }

        return invocation.proceed();
    }
}
第三步:注解使用
 @UpdateTime
    private Timestamp updateTime;
    @CreateTime
    private Timestamp createTime;

mybatis拦截器使用场景:

1) 自动生成数据,比如 创建时间、更新时间
2) 数据库分离,比如 读写数据库分离

你可能感兴趣的:(springboot集成mybatis拦截器实现自动生成创建时间和更新时间)