mybatis拦截器处理一些事情
mybatis的拦截介绍
https://blog.csdn.net/qq_45297578/article/details/132029683
设置一个拦截器来处理公共字段
/**
* mybatis拦截sql执行处理公共字段赋值
*/
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class })})
@Component
public class MyBatisDefaultPropInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0];
// sql语句类型:UNKNOWN, INSERT, UPDATE, DELETE, SELECT,
// FLUSH、update,SqlCommandType是个enum
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
Object parameter = invocation.getArgs()[1];
if(parameter!=null){
Class<?> clazz = parameter.getClass();
if (!clazz.getSuperclass().isInstance(Object.class)) {
Class<?> superclass = clazz.getSuperclass();
updateFeild(superclass.getDeclaredFields(), parameter, sqlCommandType);
} else {
updateFeild(parameter.getClass().getDeclaredFields(), parameter, sqlCommandType);
}
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
private void updateFeild(Field[] declaredFields,Object parameter,SqlCommandType sqlCommandType) throws IllegalAccessException {
for (Field field: declaredFields){
if (SqlCommandType.INSERT.equals(sqlCommandType)){
if (field.getName().equals("createTime")){
field.setAccessible(true);
field.set(parameter,new Date());
}
if (field.getName().equals("updateTime")){
field.setAccessible(true);
field.set(parameter,new Date());
}
}else if (SqlCommandType.UPDATE.equals(sqlCommandType)){
if (field.getName().equals("updateTime")){
field.setAccessible(true);
field.set(parameter,new Date());
}
if (field.getName().equals("updateUserId")){
field.setAccessible(true);
field.set(parameter,getCurrentUserId());
}
}
}
}
}
拦截器注册到数据库配置类中
@Resource
MyBatisDefaultPropInterceptor myBatisDefaultPropInterceptor;
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resourcePatternResolver.getResources("classpath*:sqlmap/**/*SqlMap.xml"));
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
sessionFactory.getObject().getConfiguration().addInterceptor(myBatisDefaultPropInterceptor);
return sessionFactory.getObject();
}
这样就可以在sql入库前给一些字段处理了 这个实现mybatisplus的MetaObjectHandler
mybtisPlus 中实现
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增填充创建时间
*
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class);
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
}
/**
* 更新填充更新时间
*
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
}
}
注册到配置类中
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
return globalConfig;
}