您的位置:首页 > 健康 > 美食 > MyBatis 源码分析-- getMapper(获取Mapper)

MyBatis 源码分析-- getMapper(获取Mapper)

2025/4/13 4:45:44 来源:https://blog.csdn.net/weixin_42118323/article/details/139664021  浏览:    关键词:MyBatis 源码分析-- getMapper(获取Mapper)

前言:

前面我们从源码层面梳理了 SqlSessionFactory、SqlSession 的创建过程,本篇我们继续分析一下 Mapper 的的获取过程。

初识 MyBatis 【MyBatis 核心概念】

MyBatis 源码分析–SqlSessionFactory

MyBatis 源码分析–获取SqlSession

案例代码:

public class MyBatisTest {@Testpublic void test() throws IOException {//读取配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建 SqlSessionFactoryBuilder 对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//通过 SqlSessionBuilder 对象 解析 mybatis-config.xml 文件 构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = builder.build(is);//通过SqlSessionFactory构建一个SqlSessionSqlSession session = sqlSessionFactory.openSession();//通过SqlSession 获取 Mapper 实例UserMapper userMapper = session.getMapper(UserMapper.class);//获取数据List<User> users = userMapper.findAll();//打印输出for (User user : users) {System.out.println(user);}//关闭资源session.close();is.close();}
}

本篇我们将主要对 session.getMapper(UserMapper.class); 这句代码进行分析。

DefaultSqlSession#getMapper 源码分析

//org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper
public <T> T getMapper(Class<T> type) {return this.configuration.getMapper(type, this);
}//org.apache.ibatis.session.Configuration#getMapper
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {return this.mapperRegistry.getMapper(type, sqlSession);
}

MapperRegistry#getMapper 源码分析

//org.apache.ibatis.binding.MapperRegistry#getMapper
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {//根据 class 获取 Mapper 代理工厂MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type);if (mapperProxyFactory == null) {throw new BindingException("Type " + type + " is not known to the MapperRegistry.");} else {try {//使用 Mapper 代理工厂创建 Mapper 代理对象返回return mapperProxyFactory.newInstance(sqlSession);} catch (Exception var5) {throw new BindingException("Error getting mapper instance. Cause: " + var5, var5);}}
}//org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.session.SqlSession)
public T newInstance(SqlSession sqlSession) {//Mapper 代理MapperProxy<T> mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);//创建 Mapper 代理对象return this.newInstance(mapperProxy);
}//org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.binding.MapperProxy<T>)
protected T newInstance(MapperProxy<T> mapperProxy) {//使用 JDK 创建一个 Mapper 的代理对象return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
}

从源码可以看出,获取 Mapper 其实就是根据 Mapper 的 Class 类型从 MapperRegistry 中获取一个 MapperProxyFactory,最终调用 MapperProxyFactory.newInstance 方法创建一个代理对象,生成一个代理类来调用 Mapper 的方法,这里的 MapperProxyFactory 其实就是在获取 SqlSessionFactory 中存入 MapperRegistry 的 MapperProxyFactory。

欢迎提出建议及对错误的地方指出纠正。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com