使用Mybatis时,最常看见的语句之一:
XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);
复制代码
通过getMapper()
方法得到了一个XXXMapper
的对象。
要知道XXXMapper
本身是一个接口,而我们代码是没有写实现类的。所以该对象是由Mybatis通过:反射和动态代理,这两项技术创建了一个代理对象,现在我们来分析一下这个工程。
SqlSession
是一个接口,有一个实现类DefaultSqlSession
,实现了getMapper
方法:
@Override
public <T> T getMapper(Class<T> type) {
return configuration.getMapper(type, this);
}
复制代码
我们会发现它调用了configuration.getMapper
方法,回想一下这个configuration
怎么来的。
回顾:
build
方式创建SqlSessionFactory
时,SqlSessionFactory
也是一个接口,它的默认实现类是DefaultSqlSessionFactory
。
sqlSessionFactory = new SqlSessionFactoryBuilder().build(xml);
复制代码
configuration
通过parser.parse()
返回