MyBatis 学习记录3 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类的更多相关文章
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- mybatis 学习记录1
起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- Mybatis学习记录(六)----Mybatis的高级映射
1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...
- MyBatis 学习记录6 TypeHandler
主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...
- MyBatis 学习记录2 Mapper对象是如何生成的
主题 以前我一直有一个问题不懂.并且觉得很神奇.就是Mybatis我们开发的时候只需要定义接口,并没有写实现类,为什么我们运行的时候就可以直接使用? 现在我想分享下这部分大致是怎么实现的. 在启动的时 ...
- mybatis学习记录三——SqlMapConfig.xml相关参数详解
5 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) ty ...
随机推荐
- Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn【报错】
自己的项目没有测通 可能是自己项目原因——因为自己项目中级联关系的类涉及太多 自己的项目[这样的配置报错] @OneToMany(fetch=FetchType.LAZY,cascade = { C ...
- BZOJ2753 SCOI2012 滑雪与时间胶囊 【最小生成树】*
BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有 ...
- ios 视图切换翻页效果
本文写的是视图切换,涉及到的内容有 1.实现代码添加Navigation Bar Toolbal: 2.实现在Navigation Bar和Toolbar上用代码添加Bar Button Item: ...
- JavaScript 定时任务多事件冲突问题
var iCount = setInterval(ChangeTime, 3500);//3.5秒请求一次函数 function ChangeTime() { $.ajax({ type: " ...
- js中confirm揭示三个按钮“是”“否”“取消”
js中confirm提示三个按钮“是”“否”“取消” 重载DOM中confirm window.confirm = function(str) { str=str.replace(/\'/g, & ...
- HAL层编写规范
andriod HAL模块也有一个通用的入口地址,这个入口地址就是HAL_MODULE_INFO_SYM变量,通过它,我们可以访问到HAL模块中的所有想要外部访问到的方法. 在Linux系统中,后缀 ...
- cockpit 使用(集成docker && k8s 管理)
1. yum 安装 sudo yum install cockpit 2. 允许启动 sudo systemctl enable --now cockpit.socket 3. 可选的插件 cockp ...
- js动态的属性名如何取该属性的值
var cls={cn1:"nihao",cn2="made",cn3="shuide"};var index=2;//可变获取cn2的值 ...
- win10下安装并启动zookeeper
下载直接到zk的官网(zookeeper.apache.org)即可,点击右边的Releases,在Download下再点Download进入镜像下载页面,在给出的链接列表里选择一个镜像地址,进去后选 ...
- json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 column 33 (char 33)
json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 colu ...