请问各位高手,如何在Mybatis拦截器中实现额外添加原有的sql的参数设定?

漂流幻境2014 发布于 2016/09/22 13:59
阅读 1K+
收藏 0
请问各位高手,如何在Mybatis拦截器中实现额外添加原有的sql的参数设定? 
加载中
0
HeartArea
HeartArea

直接上代码


public Object intercept(Invocation invocation) throws Throwable {
        if (invocation.getTarget() instanceof StatementHandler) {
            RoutingStatementHandler handler = (RoutingStatementHandler) invocation.getTarget();
	   //通过反射拿到statement对象
            StatementHandler delegate = (StatementHandler) ReflectUtil.getFieldValue(handler, "delegate");
            BoundSql boundSql = delegate.getBoundSql();
            
            String sql = boundSql.getSql();
            String pageSql = formatPageSql(page, sql);//操作sql
	   //再通过反射把新sql设置进去
            ReflectUtil.setFieldValue(boundSql, "sql", pageSql);

            return invocation.proceed();
        }
   }


反射那块我封装了一下,很简单就不贴代码了

0
漂流幻境2014
    这样我也试过,但是新的参数没有绑定上去,不知道怎么回事
0
漂流幻境2014
你的关键代码在ReflectUtil中,能不能让我参考一下,谢谢!!
0
HeartArea
HeartArea

引用来自“漂流幻境2014”的评论

你的关键代码在ReflectUtil中,能不能让我参考一下,谢谢!!

    /**
     * 反射工具类
     */
    private static class ReflectUtil {
        /**
         * 获取指定对象的指定属性
         * 
         * @param obj 指定对象
         * @param fieldName 指定属性名称
         * @return 指定属性
         */
        public static Object getFieldValue(Object obj, String fieldName) {
            Object result = null;
            Field field = ReflectUtil.getField(obj, fieldName);
            if (field != null) {
                field.setAccessible(true);
                try {
                    result = field.get(obj);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }

        /**
         * 获取指定对象里面的指定属性对象
         * 
         * @param obj 目标对象
         * @param fieldName 指定属性名称
         * @return 属性对象
         */
        private static Field getField(Object obj, String fieldName) {
            Field field = null;
            for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
                try {
                    field = clazz.getDeclaredField(fieldName);
                    break;
                } catch (NoSuchFieldException e) {
                    // do nothing
                }
            }
            return field;
        }

        /**
         * 设置指定对象的指定属性值
         * 
         * @param obj 指定对象
         * @param fieldName 指定属性
         * @param fieldValue 指定属性值
         */
        public static void setFieldValue(Object obj, String fieldName, String fieldValue) {
            Field field = ReflectUtil.getField(obj, fieldName);
            if (field != null) {
                try {
                    field.setAccessible(true);
                    field.set(obj, fieldValue);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }



返回顶部
顶部