参考我们阅读源码画的uml图,来实现我们自己的参数封装为Map的过程(造个轮子)

阅读源码文章参考:mybatis参数封装Map过程的源码解析

手写实现mybatis参数封装Map过程

输入是执行带@MyParam的方法

输出是一个Map,其key是@MyParam的value,其value是方法@MyParam对应的参数值

BootStrap

输入是

Class clazz = EmployeeMapper.class;

EmployeeMapper mapper = (EmployeeMapper) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz},

        new MyMapperProxy<>(clazz,

                methodCache));

mapper.getEmpByMyIdAndLastName(1, "tom");

输出就是一个Map,在MyMapperProxy的invoke中获取到并打印出来

 

MyMapperProxy

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    if (Object.class.equals(method.getDeclaringClass())) {

        return method.invoke(this,args);

    }

    if (method.getName().equals("getEmpByMyIdAndLastName")) {

        MyMapperMethod myMapperMethod = cacheMapperMethod(method);

        Map paramsMap = (Map) myMapperMethod.getParamsMap(args);

        System.out.println(paramsMap);

    }

    return null;

}

 

MyMapperMethod

public Object getParamsMap(Object[] args) {

    return methodSignature.convertArgsToParam(args);

}

 

MyParamNameResolver

主要的逻辑代码写在这里,在其构造函数中传入Method,得到names

手写实现mybatis参数封装Map过程

之后通过getNameParams方法,来组装map

手写实现mybatis参数封装Map过程

源码参考:https://gitee.com/constfafa/mybatis_demo.git

相关文章: