从上篇,我们知道,mybatis获取的Mapper是一个代理对象,接下来我们就看看它是如何通过这个代理对象来执行增删改查操作的。下面是我的测试代码,还是一步步debug,.我们直接从userMapper.selectUserById(1)开始讲起。
userMapper执行selectUserById(1)方法,接下来便进入MapperProxy.invoke()方法里,这是因为userMapper是一个代理对象,在jdk的动态代理中,代理对象调用任意一个方法,都会先执行代理类的invoke()方法,具体细节,这里不再详述。在invoke()方法里,调用cachedMapperMethod(method)方法,返回一个MapperMethod对象。我们来看一下这个方法,先是从methodCache(是一个map)中取出该method对象,由于我们第一次去查询,所以该methodCache缓存没有,为null,然后判断为null,则去new一个MapperMethod(mapperInterface,method,configuration)对象(同时也new出了SqlCommand,MethodSignature这两个对象),放进methodCache中,并返回。然后返回的mapperMethod对象执行execute(sqlSession,args)方法。