网站的盈利方法,呼伦贝尔北京网站建设,网站开发实用技术2.8.5,创联互动建设网站前言#xff1a;
前面我们从源码层面梳理了 SqlSessionFactory、SqlSession 的创建过程#xff0c;本篇我们继续分析一下 Mapper 的的获取过程。
初识 MyBatis 【MyBatis 核心概念】
MyBatis 源码分析–SqlSessionFactory
MyBatis 源码分析–获取SqlSession
案例代码
前面我们从源码层面梳理了 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);//获取数据ListUser 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(ClassT type) {return this.configuration.getMapper(type, this);
}//org.apache.ibatis.session.Configuration#getMapper
public T T getMapper(ClassT type, SqlSession sqlSession) {return this.mapperRegistry.getMapper(type, sqlSession);
}MapperRegistry#getMapper 源码分析
//org.apache.ibatis.binding.MapperRegistry#getMapper
public T T getMapper(ClassT type, SqlSession sqlSession) {//根据 class 获取 Mapper 代理工厂MapperProxyFactoryT 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 代理MapperProxyT mapperProxy new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);//创建 Mapper 代理对象return this.newInstance(mapperProxy);
}//org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.binding.MapperProxyT)
protected T newInstance(MapperProxyT 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。
欢迎提出建议及对错误的地方指出纠正。