【项目实战】MyBatis的基础源码 —— MapperProxy(Mapper接口的代理类)源码介绍

一、MapperProxy是什么?

MapperProxy是MyBatis中的一个重要类,它是Mapper接口的代理类。

二、MapperProxy的主要作用

将Mapper接口的方法调用转换为对SqlSession的调用。

【项目实战】MyBatis的基础源码 —— MapperProxy(Mapper接口的代理类)源码介绍_第1张图片

【项目实战】MyBatis的基础源码 —— MapperProxy(Mapper接口的代理类)源码介绍_第2张图片

三、为什么要读MapperProxy的源码

MapperProxy的源码比较复杂,但是通过阅读源码,我们可以更好地理解MyBatis的工作原理。
【项目实战】MyBatis的基础源码 —— MapperProxy(Mapper接口的代理类)源码介绍_第3张图片

四、MapperProxy的简单示例代码

以下是MapperProxy的简单示例代码:
【项目实战】MyBatis的基础源码 —— MapperProxy(Mapper接口的代理类)源码介绍_第4张图片

public class MapperProxy<T> implements InvocationHandler, Serializable {
    private static final long serialVersionUID = -6424540398559729838L;
    private final SqlSession sqlSession;
    private final Class<T> mapperInterface;
    private final Map<Method, MapperMethod> methodCache;

    public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface, Map<Method, MapperMethod> methodCache) {
        this.sqlSession = sqlSession;
        this.mapperInterface = mapperInterface;
        this.methodCache = methodCache;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	//判断被调用的方法是否是Object类的方法
        if (Object.class.equals(method.getDeclaringClass())) {
        	//如果是,则直接调用该方法
            return method.invoke(this, args);
        }
        //否则,从methodCache中获取MapperMethod对象
        final MapperMethod mapperMethod = cachedMapperMethod(method);
        //并调用它的execute()方法来执行SQL语句
        return mapperMethod.execute(sqlSession, args);
    }

    private MapperMethod cachedMapperMethod(Method method) {
        return methodCache.computeIfAbsent(method, k -> new MapperMethod(mapperInterface, method, sqlSession.getConfiguration()));
    }
}

在上面的示例中,可以看到MapperProxy实现了InvocationHandler接口
MapperProxy的invoke()方法是代理方法的核心

在invoke()方法中,我们首先判断被调用的方法是否是Object类的方法,如果是,则直接调用该方法。否则,我们从methodCache中获取MapperMethod对象,并调用它的execute()方法来执行SQL语句。

你可能感兴趣的:(Z,-,Inbox,mybatis,java)