智者不为愚者谋,勇者不为怯者死。这篇文章主要讲述MyBatis 学习记录3 MapperMethod类相关的知识,希望能为你提供帮助。
MyBatis MapperMethod类主题之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMethod.execute(sqlSession, args);
所以想再简单学习记录下MapperMethod类
组成
文章图片
从上图可知,MapperMethod只有2个成员域,都是静态内部类,所以
MapperMethod ≈ SqlCommand + MethodSignature
SqlCommand ≈ name + SqlCommandType,其中name是类似于test.mapper.UserMapper.selectByPrimaryKey的字符串相当于是标识这个MapperMethod是哪个自定义方法对应的MapperMethod
SqlCommandType是个枚举
文章图片
从上图中就可以明白就是对应于你在XML文件中写的标签,是select标签还是update标签还是其他.标识这个SQL是那种DML
MethodSignature ≈ java.lang.reflect.Method的封装,会记录你自定义的方法的一些信息,比如返回值是集合还是单个对象还是Void? 方法参数是否有命名参数(@Param)?等等
查询时从之前的学习中我已经知道MapperProxy是Mapper的动态代理实现,他的invoke方法会调用MapperMethod的execute方法.所以我们来看看这个execute方法
文章图片
从图中我们就知道了为啥MapperMethod需要SqlCommond和MethodSignature这2个成员域了.
根据SqlCommond的类型,比如insert,还是update来决定调用sqlSession的insert还是update等方法
根据方法的返回类型,还决定是要掉selectOne还是selectList等.
最终都是用SqlSession的对应方法来查询的,所以不管你在自定义Mapper中写什么方法.最终都会转到SqlSession的对应方法.
中途还有一些参数的包装,比如把你自定义方法的多个参数放到一个map里,或者收集命名参数等等.
小结MapperMethod这个类的作用就是把你自定义的Mapper里的方法和参数翻译成sqlSession里定义的那些selectOne呀selectMany等等方法.这样当调用你自定义的方法的时候MethodProxy就能够执行sqlSession对应的方法了.
【MyBatis 学习记录3 MapperMethod类】
推荐阅读
- 对工程测量大师App的评价
- App installation failed This application does not support this device’s CPU type.
- 函数对象的call()apply() 方法区别
- Android各版本特性
- App性能(TraceView分析法)
- 移动端自动化测试-WTF Appium
- android studio 3.1.4下载安装配置(附旧版本下载地址)
- iPhone/iPad/Android UI尺寸规范
- 商家 APP 如何接入新版支付宝支付,老版本商家如何升级