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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值