• mybatis


    拦截器介绍

    mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截。
    Executor接口方法主要有update、query、commit、rollback等等。
    主要思路为:

    1. 进入拦截器方法中
    2. 获取拦截器方法参数
    3. 获取解析参数及SQL
    4. 自定义生成自己的SQL语句
    5. 将自定义SQL设置进参数中
    6. 由mybatis处理后续问题

    拦截器代码

    import org.apache.ibatis.cache.CacheKey;
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.Interceptor;
    import org.apache.ibatis.plugin.Intercepts;
    import org.apache.ibatis.plugin.Invocation;
    import org.apache.ibatis.plugin.Plugin;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    import org.springframework.stereotype.Component;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.Properties;
    @Component
    @Intercepts({@org.apache.ibatis.plugin.Signature(type = Executor.class, method = "query",
            args = {
            MappedStatement.class,
                    Object.class,
                    RowBounds.class,
                    ResultHandler.class,
                    CacheKey.class,
                    BoundSql.class})})
    public class MybatisInterceptorConfig implements Interceptor {
    	 /*自定义SQL*/
    	 private String resetSql(String sql) {
    		 
         }
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            resetSql(invocation);
            return invocation.proceed();
        }
        @Override
        public Object plugin(Object o) {
            return Plugin.wrap(o, this);
        }
        @Override
        public void setProperties(Properties properties) {
    		
    	}
        private void resetSql(Invocation invocation) {
            final Object[] args = invocation.getArgs();
            BoundSql boundSql = (BoundSql) args[5];
    		if(StringUtils.isNotEmpty(boundSql.getSql())) {
    			modify(boundSql,"sql",resetSql(boundSql.getSql()));
    		}
        }
        private static void modify(Object object, String fieldName, Object newFieldValue){
            try {
                Field field = object.getClass().getDeclaredField(fieldName);
                Field modifiersField = Field.class.getDeclaredField("modifiers");
                modifiersField.setAccessible(true);
                modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
                if(!field.isAccessible()) {
                    field.setAccessible(true);
                }
                field.set(object, newFieldValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
  • 相关阅读:
    软件需求分析——阅读笔记
    第二次冲刺阶段 tenth day
    第16周周总结
    第二次冲刺阶段 ninth day
    判断各种数据类型的方法总结
    vue中8种组件通信方式
    字符串常用方法总结
    JS中轻松遍历对象属性的几种方式
    fetch请求和ajax请求
    js 文件下载,当前页下载,新标签下载____后端返回 GET/POST 文件流,下载文件
  • 原文地址:https://www.cnblogs.com/cjunn/p/12168421.html
Copyright © 2020-2023  润新知