在 Mybatis 中,每一个应用都是基于 SqlSessionFactory 为核心。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得
通过SqlSessionFactoryBean获取SqlSessionFactory,读取配置,通过获取配置的mapperLocations解析mapper对应的xml文件,添加MappedStatement到Configuration的mappedStatements字段的map中,以该xxxmapper的类路径.方法名为key,MappedStatement为value,注册mapper到MapperRegistry的knowMappers属性中,以该xxxmapper的class对象为key,MapperProxyFactory对象为value,
knowMappers只添加接口,其他忽略不做处理。
最后SqlSessionFactoryBuilder 通过 XML 配置文件 或一个 预先配置的 Configuration 实例创建SqlSessionFactory实例.
spring创建实例时调用SqlSession的getMapper方法,调用MapperRegistry的getMapper方法,获取knowMappers中存放的MapperProxyFactory实例,MapperProxyFactory运用jdk动态代理方式创建该mapper接口的代理对象,其中动态代理类为MapperProxy.当每次调用目标接口方法的时候都是调用MapperProxy的invoke方法。
invoke方法中,调用MapperMethod的excute方法,通过判断SqlCommand属性的type值,执行相应的增删改查方法,即调用sqlSession对象的方法,在sqlSession方法中,通过jdk动态代理增强,获取sqlSession,再执行目标方法,先传入statementId(方法Id)获取Configuration的mappedStatements字段的相应value值,即MappedStatement实例,然后传入MappedStatement和参数调用Executor的方法,创建连接执行sql等等