MapperMethod是代理方式的实际执行类,JDK动态代理调用的invoke方法,实际是转发到了MapperMethod的execute方法,参考源码如下:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (Object.class.equals(method.getDeclaringClass())) {try {return method.invoke(this, args);} catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t);}}final MapperMethod mapperMethod = cachedMapperMethod(method);return mapperMethod.execute(sqlSession, args);}

通过查看Mapper Method源码,

public Object execute(SqlSession sqlSession, Object[] args) {Object result;if (SqlCommandType.INSERT == command.getType()) {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.insert(command.getName(), param));} else if (SqlCommandType.UPDATE == command.getType()) {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.update(command.getName(), param));} else if (SqlCommandType.DELETE == command.getType()) {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.delete(command.getName(), param));} else if (SqlCommandType.SELECT == command.getType()) {if (method.returnsVoid() && method.hasResultHandler()) {executeWithResultHandler(sqlSession, args);result = null;} else if (method.returnsMany()) {result = executeForMany(sqlSession, args);} else if (method.returnsMap()) {result = executeForMap(sqlSession, args);} else {Object param = method.convertArgsToSqlCommandParam(args);result = sqlSession.selectOne(command.getName(), param);}} else {throw new BindingException("Unknown execution method for: " + command.getName());}if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {throw new BindingException("Mapper method '" + command.getName() + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");}return result;}

该源码执行的过程为,首先判断SQL类型,然后将args数组转换为一个Object对象,该对象实际上是一个SortedMap

public Object convertArgsToSqlCommandParam(Object[] args) {final int paramCount = params.size();if (args == null || paramCount == 0) {return null;} else if (!hasNamedParameters && paramCount == 1) {return args[params.keySet().iterator().next()];} else {final Map<String, Object> param = new ParamMap<Object>();int i = 0;for (Map.Entry<Integer, String> entry : params.entrySet()) {param.put(entry.getValue(), args[entry.getKey()]);// issue #71, add param names as param1, param2...but ensure backward compatibilityfinal String genericParamName = "param" + String.valueOf(i + 1);if (!param.containsKey(genericParamName)) {param.put(genericParamName, args[entry.getKey()]);}i++;}return param;}}

此处将参数数组转为:{userName="admin",id=1,param1="admin",id=1}

Mybatis源码学习-MapperMethod相关推荐

  1. Mybatis源码分析: MapperMethod功能讲解

    canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...

  2. Mybatis源码学习-动态代理

    Mybatis源码学习-动态代理 binding包下面是mybatis的mapper动态代理 // Mybatis官方手册建议通过mapper对象访问mybatis,因为使用mapper看起来更优雅 ...

  3. 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结

    Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...

  4. 【Mybatis源码学习】概述

    [Mybatis源码学习]概述 1.怎样下载源码 1.1 下载地址 1.2 导入Idea 1.2.1 环境 1.2.2 部署与打包 2.源码架构 2.1 核心流程三大阶段 2.1.1 初始化 2.1. ...

  5. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  6. MyBatis源码学习笔记(从设计模式看源码)

    文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...

  7. mybatis源码学习1--学习源码的目的

    在开始分析mybatis源码之前,需要定一个目标,也就是我们不是为了读源码而去读,一定是带着问题去读,在读的时候去寻找到答案,然后再读码的同时整理总结,学习一些高级的编码方式和技巧. 首先我们知道my ...

  8. Mybatis源码学习笔记之Mybatis二级缓存

    简介   Mybatis一级缓存是会话级的缓存,而二级缓存则是应用级别的缓存,默认关闭,二级缓存使用不慎可能会导致脏读. 开启方式(SpringBoot+Mybatis)   application. ...

  9. mybatis源码学习篇之——执行流程分析

    前言 在正式学习mybatis框架源码之前,需要先弄懂几个问题?myabtis框架是什么?为什么需要mybatis框架?使用mybatis框架带来的好处是什么? 回答这几个问题之前,我们先来看一下,之 ...

最新文章

  1. centos7 php安装
  2. 详谈调用winpcap驱动写arp多功能工具
  3. 火狐(FireFox)
  4. ionic tab显示到顶部去了
  5. Android开发周报:Android 8.0开始推送、微店插件化实践
  6. Neo4j AuraDB免费版——Data Importer
  7. multisim二极管_每日干货——光敏二极管传感器
  8. Hi3559a移植Opencv3.0
  9. oracle 去除空值函数,Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
  10. 迷宫问题(MAZE)
  11. 概率论与数理统计基础概念整理
  12. 姚锦云:再论庄子传播思想与接受主体性:回应尹连根教授
  13. n11mysql表设计_n11(n11数据库管理工具)
  14. 实验(五)键盘检测实验
  15. Java文件读操作(两种read方法)
  16. centos7上安装rar解压软件
  17. java中abstract怎么使用
  18. 星敏感器 matlab,星敏感器姿态确定仿真综合实验.docx
  19. 【进阶实战】用PaddlePaddle检测空气质量
  20. Mapper method ‘com.xxx.dao.ActivityDao.update attempted to return null from a method with a primiti

热门文章

  1. 计算机3d打印技术论文,3D打印技术小论文
  2. python视觉识别库_机器视觉、模式识别库汇总
  3. 鸿蒙实力等级划分,从综漫开始的万界之旅
  4. win10清理c盘_系统C盘磁盘空间不够用的解决办法
  5. haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理
  6. 《安富莱嵌入式周报》第209期:2021.04.19--2021.04.25
  7. C++实现演讲比赛流程管理系统
  8. 51单片机IIC通信协议
  9. python 将单词分割成字母_Python基于分隔符单词拆分列表
  10. 64位程序调用32位dll