mybatis源码第四课

mybatis插件扩展

mybatis只能在这四个点扩展
在这里插入图片描述

1.Executor

在这里插入图片描述

2.StatementHandler
在这里插入图片描述

3.ParameterHandler
4.ResultSetHandler

示例代理StatementHandler对象的prepare方法

public class PageInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        return null;
    }

    @Override
    public Object plugin(Object target) {
        if (target instanceof StatementHandler){
            return Proxy.newProxyInstance(
                    PageInterceptor.class.getClassLoader(),
                    new Class[]{StatementHandler.class},
                    new PageHandler((StatementHandler) target));
        }
        return target;
    }

    @Override
    public void setProperties(Properties properties) {

    }


    private class PageHandler implements InvocationHandler{

        StatementHandler statementHandler;

        public PageHandler(StatementHandler statementHandler) {
            this.statementHandler = statementHandler;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (method.getName().equalsIgnoreCase("prepare")){
                setParametersProxy();
            }
            return method.invoke(statementHandler,args);
        }

        private void setParametersProxy() throws NoSuchFieldException, IllegalAccessException {
            appendPageSql(((Page)statementHandler.getBoundSql()
                    .getParameterObject()));

            }

        private void appendPageSql(Page page) throws NoSuchFieldException, IllegalAccessException {
            BoundSql boundSql = statementHandler.getBoundSql();
            String format = String.format(" limit %s,%s", page.getNumber(), page.getSize());
            setFieldValue("sql",boundSql,boundSql.getSql()+format);
        }

        private void setFieldValue(String sql, BoundSql boundSql, String s) throws NoSuchFieldException, IllegalAccessException {
            Field sqlField = boundSql.getClass().getDeclaredField(sql);
            sqlField.setAccessible(true);
            sqlField.set(boundSql,s);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值