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) 数据库分离,比如 读写数据库分离