Mybatis 获取Mapper对象

导读:本篇文章讲解 Mybatis 获取Mapper对象,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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就是通过这个代理对象去执行对应的增删改查方法

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69686.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!