上篇文章中,是直接用SqlSession.selectList()去执行一条SQL的,但是作为 一个ORM框架,我们往往是调用接口去执行,如下所示:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
SqlSession sqlSession = factory.openSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
userMapper.selectAllUser();//直接调用接口执行
sqlSession.close();
但是UserMapper只是一个接口,并没有相应的实现类。我们都知道接口要有实现类才能实例化进而调用,但是那么Myabtis是如何实现调用没有实现类的方法,还能完成相应的SQL处理逻辑。
其实原理很简单:这个是用了JDK的动态代理技术,首先为UserMapper生成一个代理对象,由代理对象去调用SqlSession方法。也就是说在调用链SqlSession作为参数一直传递下去,并交给代理对象,真正的执行操作还是由SqlSession去执行的。
下面我们来分析下这其中的过程,先看下sqlSession.getMapper()方法:
@Override
public <T> T getMapper(Class<T> type) {
//从配置中获取,注意这两个参数,一个是接口UserMapper.class,另一个是SqlSession自身,特别是SqlSession这个参数,后文一系列的调用链都有这个参数的
return configuration.<T>getMapper(type, this);
}
再看下configuration.getMapper()
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
//其实是调用了MapperRegistry的方法
return mapperRegistry.getMapper(type, s