Bing
将Mapper接口和Mapper.xml文件中的SQL语句相关联,启动时即可检测到错误
其UML图如图所示
mapperRegistry
对象是Mapper接口及其代理对象工厂的注册中心
MapperProxyFactory
用来创建代理对象
流程详解
- Mybatis初始化时会将所有配置信息映射到Configuration对象中
Configuration
对象的mapperRegistry
字段记录当前使用的mapperRegistry
对象- 读取xml文件和mapper接口中的注解信息,调用
mapperRegistry.addMapper()
填充knownMappers
集合,key为mapper接口的class对象,value为MapperProxyFactory
对象 - 需要执行SQL语句时,
mapperRegistry.getMapper()
会取出对应MapperProxyFactory
对象来创建代理对象MapperProxy
(JDK动态代理) MapperProxy
的invoke()
方法会拿到封装了mapper接口中对应方法信息和SQL语句的MapperMethod
对象,并调用MapperMethod.execute()
执行SQL语句
MapperMethod
- SqlCommand
name字段记录SQL语句名称(接口.方法名),type字段记录SQL语句类型 - ParamNameResolver
name字段(sortedMap类型)记录参数列表中位置索引与参数名对应关系,key为参数列表索引,value为对于参数的名字;如果没有@Parm注解则使用索引作为名字
若参数中有RowBounds或ResultHandler类型的参数,这两种类型参数或跳过不记录到name集合中(map不添加数据),但索引是会增长的,而默认的名字(使用索引作为名字)是通过map.size()来拿到名字的,所以会出现索引和名字对不上号的情况
ParamNameResolver.gerNamedParams()
将用户传入的args参数数组转换成参数名(key)-参数值(value)的形式,其实现是:
从name字段(sortedMap类型)取出索引-名称的entity
,使用entity.value
(参数名)作为key,args[entity.key]
即为参数值作为value
- MethodSignature
封装了Mapper接口中定义的方法的相关信息
//返回值是否是collection或数组类型
private final boolean returnsMany;
//返回值是否是map类型
private final boolean returnsMap;
//返回值是否是空
private final boolean returnsVoid;
//返回值类型
private final Class<?> returnType;
//返回值是map的话key的列名
private final String mapKey;
//参数列表中resultHandler类型的位置(第几个参数为resultHandler类型)
private final Integer resultHandlerIndex;
//第几个参数为rowBounds类型
private final Integer rowBoundsIndex;
//方法对应的ParamNameResolver对象
private final ParamNameResolver paramNameResolver;
MapperMethod.executor()
会根据SQL类型调用SqlSession不同的方法完成db操作
rowCountResult()
处理insert等语句返回的int值,转换为mapper接口中的返回值