Mybatis源码解析——Binding模块

Bing

将Mapper接口和Mapper.xml文件中的SQL语句相关联,启动时即可检测到错误
其UML图如图所示

mapperRegistry对象是Mapper接口及其代理对象工厂的注册中心
MapperProxyFactory用来创建代理对象

流程详解

  1. Mybatis初始化时会将所有配置信息映射到Configuration对象中
  2. Configuration对象的mapperRegistry字段记录当前使用的mapperRegistry对象
  3. 读取xml文件和mapper接口中的注解信息,调用mapperRegistry.addMapper()填充knownMappers集合,key为mapper接口的class对象,value为MapperProxyFactory对象
  4. 需要执行SQL语句时,mapperRegistry.getMapper()会取出对应MapperProxyFactory对象来创建代理对象MapperProxy(JDK动态代理)
  5. MapperProxyinvoke()方法会拿到封装了mapper接口中对应方法信息和SQL语句的MapperMethod对象,并调用MapperMethod.execute()执行SQL语句

MapperMethod

  1. SqlCommand
    name字段记录SQL语句名称(接口.方法名),type字段记录SQL语句类型
  2. 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

  1. 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接口中的返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值