mybatis面试之mapper接口原理分析

一般的,我们在使用mybatis操作数据时,只需要定义一个mapper xml,和一个与之对应的Mapper 接口,即可,但是并不需要提供mapper接口的实现类,可以这么做的原因是mybaits基于jdk的动态代理技术为我们的mapper 接口生成了动态代理类,操作的时候调用的也是该动态代理类的方法。
在解析全局配置文件过程中,有一个很重要的步骤就是解析mapper标签对应的mapper xml或者是mapper 接口注解类,在解析的过程中会使用接口信息创建MapperProxyFactory类,这是一个用于创建MapperProxy的工厂类,而MapperProxy是用于创建mapper 接口动态代理使用的java.lang.reflect.InvocationHandler的实现类,然后当我们调用sqlSession.getMapper()方法时,内部就会调用MapperProxyFactory的newInstance方法获取对应的mapper实现类,这个过程比较核心,简单贴下源码:

public T newInstance(SqlSession sqlSession) {
  final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
  return newInstance(mapperProxy);
}

protected T newInstance(MapperProxy<T> mapperProxy) {
  return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}

可以看到最终调用的就是Proxy.newProxyInstance方法了。
之后就可以开始使用动态代理类来进行数据库操作了,因此整个过程是这样子:
1:启动过程中解析配置文件,生成接口类->MapperProxyFactory的关系
2:运行阶段,调用sqlSession.getMapper方法通过MapperProxyFactory获取mapper接口的代理类
3:使用代理类操作数据库,详细过程如下

调用MapperProxy的invoke方法->获取MapperMethod对象并调用其execute方法
->根据sql命令类型路由到SqlSession对应的方法->调用执行器的对应方法获取数据
->调用对应的StatementHandler获取数据-->调用对应的ResultSetHandler处理数据->返回数据->结束

图示:
mybatis面试之mapper接口原理分析_第1张图片

你可能感兴趣的:(mybatis面试,java,mybatis,mybatis面试)