mybatis 源码解析【一】之 MapperMethod

mybatis 源码解析【一】之 MapperMethod

在MapperMethod类里有2个内部静态类SqlCommand和MethodSignature 何谓内部静态类 我的理解就是 这2个类就是专门服务MapperMethod的相当于帮助类。
首先SqlCommand 是干嘛用的? SqlCommand其实是获取并解析MappedStatement 获取它的id和sqlCommandType (UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH;)
SqlCommandType 是一个枚举类 是区分这个MappedStatement 是什么类型的语句 这里暂时不解释MappedStatement 是什么 姑且先把他当做xml配置的那个sql语句或者注解配置的sql语句的映射。(事实上也就是它)。
解析这个干嘛用?当然是为了方便判断语句的类型和在map里寻找这条语句。

看他解析出MappedStatement 这段代码 :

 String statementId = mapperInterface.getName() + "." + methodName;
  if (configuration.hasStatement(statementId)) {
     return configuration.getMappedStatement(statementId);
   } else if (mapperInterface.equals(declaringClass)) {
     return null;
   }
这段代码就很清晰的 即使我其他类都没看过 我都能猜出来 他是通过什么方式存储MappedStatement 这很明显就是一个map Map 通过全类名加方法名作为id 具体的xml里的配置项猜得没错的话都是在这个MappedStatement里存储的 例如ParameterMap ParameterType KeyGenerator Cache 将xml的每个小配置项都用具体类封装 然后统一放到 MappedStatement里 这样咱们配置的xml配置项都在这个MappedStatement里 很方便去操作。当然mybatis不像面向过程编程 他里面的类与类的关系还是比较复杂的 。 继续回到SqlCommand 通过解析之后获取到name 和 SqlCommandType
    private final String name;
    private final SqlCommandType type;

到此SqlCommand 类的作用就是获取MappedStatement里的id和 SqlCommandType 。

接下来说说MethodSignature 翻译过来就是方法签名。我的理解是:解析咱们定义的dao里的接口 因为接口的全类名对应的是xml里的namespace 方法名对应的是具体的 有时候在xml里没定义返回类型 为啥mybatis会知道咱们要返回什么呢 。这个类的作用就是解析定义的接口里的返回类型,mybatis通过反射将接口的返回值解析出来方便mybatis查询数据库后封装返回结果。
//是否返回多个
 private final boolean returnsMany;
 //是否返回map
 private final boolean returnsMap;
 //是否是无返回类型
 private final boolean returnsVoid;
 //是否返回指针
 private final boolean returnsCursor;
 //是否返回Optional (Optional是java8为了stream所设计的 用他可以解决一些null值的判断)
 private final boolean returnsOptional;
 //返回具体类型
 private final Class<?> returnType;
 //mapkey
 private final String mapKey;
 //返回的index
 private final Integer resultHandlerIndex;
 //行界限索引 用于分页
 private final Integer rowBoundsIndex;
 //参数解析器 封装了传参 比如 我们查名字叫张三 年龄16的人 那么xml里的配置就是2个param 0 张三 1 16 
 private final ParamNameResolver paramNameResolver;

到这里总结下 他的MapperMethod 具体用来干嘛的了

第一获取并解析MappedStatement
第二解析接口的返回值和传入参数 。

顺便说一句平时写代码的时候 要面向对象编程 不要为了方便使用面向过程编程 虽然代码看起来清晰 但是维护起来 你改了什么地方错了 你都得重新过一遍 如果用的面向对象 我们知道新增的类里有问题 直接能定位到错误。方便我们解决问题。

你可能感兴趣的:(源码解析,mybatis,mybatis源码解析)