Mybatis 获取Mapper对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
    .build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
User userMapper = sqlSession.getMapper(User.class);

首先,sqlSession调用getMapper(Class<?> type)方法,参数里传入指定的Class类型,返回给我们的就是一个传入该类型的对象,这个对象其实是一个代理对象,

进入到getMapper(type)方法后,再次调用 configuration.getMapper(type,sqllSession),

在Configuration类中,继续调用mapperRegistry.getMapper(type,sqlSession)方法。

mapperRegistry, 在获取SqlSessionFactory时,解析mapper子节点时,将获取的Mapper接口都放在一个knowMappers(其实是一个hashMap)中。

在mapperRegistry.getMapper(type,sqlSession)方法中,先从knowMappers取出该type对应的mapperProxyFactory,

顾名思义,这是一个mapper代理工厂,我们需要的对象应该就是从工厂中生成的。

接着调用mapperProxyFactory.newInstance(sqlSession)方法,果不其然,先new出一个MapperProxy对象,

这个对象看了一下,实现了InvocationHandler接口,jdk的动态代理,而jdk的动态代理就要求被代理的类必须要实现接口,

所以mybatis基于接口的实现方式,就是用了jdk的动态代理,这个对象里还有其他一些信息,比如methodCache(方法缓存)。

继续调用newInstance(mapperProxy)方法,

接下来看着,

也就是jdk动态代理的获取代理对象的方法:

return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);

下面就是jdk动态代理方面的东西了,接下来就是验证、优化、缓存、同步、生成字节码、显式类加载等操作。

mybatis就是通过这个代理对象去执行对应的增删改查方法

在这里插入图片描述


版权声明:本文为weixin_44730681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。