Mybatis源码学习-MapperMethod
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相关推荐
- Mybatis源码分析: MapperMethod功能讲解
canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...
- Mybatis源码学习-动态代理
Mybatis源码学习-动态代理 binding包下面是mybatis的mapper动态代理 // Mybatis官方手册建议通过mapper对象访问mybatis,因为使用mapper看起来更优雅 ...
- 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结
Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...
- 【Mybatis源码学习】概述
[Mybatis源码学习]概述 1.怎样下载源码 1.1 下载地址 1.2 导入Idea 1.2.1 环境 1.2.2 部署与打包 2.源码架构 2.1 核心流程三大阶段 2.1.1 初始化 2.1. ...
- Mybatis源码学习(三)SqlSession详解
前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...
- MyBatis源码学习笔记(从设计模式看源码)
文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...
- mybatis源码学习1--学习源码的目的
在开始分析mybatis源码之前,需要定一个目标,也就是我们不是为了读源码而去读,一定是带着问题去读,在读的时候去寻找到答案,然后再读码的同时整理总结,学习一些高级的编码方式和技巧. 首先我们知道my ...
- Mybatis源码学习笔记之Mybatis二级缓存
简介 Mybatis一级缓存是会话级的缓存,而二级缓存则是应用级别的缓存,默认关闭,二级缓存使用不慎可能会导致脏读. 开启方式(SpringBoot+Mybatis) application. ...
- mybatis源码学习篇之——执行流程分析
前言 在正式学习mybatis框架源码之前,需要先弄懂几个问题?myabtis框架是什么?为什么需要mybatis框架?使用mybatis框架带来的好处是什么? 回答这几个问题之前,我们先来看一下,之 ...
最新文章
- centos7 php安装
- 详谈调用winpcap驱动写arp多功能工具
- 火狐(FireFox)
- ionic tab显示到顶部去了
- Android开发周报:Android 8.0开始推送、微店插件化实践
- Neo4j AuraDB免费版——Data Importer
- multisim二极管_每日干货——光敏二极管传感器
- Hi3559a移植Opencv3.0
- oracle 去除空值函数,Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
- 迷宫问题(MAZE)
- 概率论与数理统计基础概念整理
- 姚锦云:再论庄子传播思想与接受主体性:回应尹连根教授
- n11mysql表设计_n11(n11数据库管理工具)
- 实验(五)键盘检测实验
- Java文件读操作(两种read方法)
- centos7上安装rar解压软件
- java中abstract怎么使用
- 星敏感器 matlab,星敏感器姿态确定仿真综合实验.docx
- 【进阶实战】用PaddlePaddle检测空气质量
- Mapper method ‘com.xxx.dao.ActivityDao.update attempted to return null from a method with a primiti
热门文章
- 计算机3d打印技术论文,3D打印技术小论文
- python视觉识别库_机器视觉、模式识别库汇总
- 鸿蒙实力等级划分,从综漫开始的万界之旅
- win10清理c盘_系统C盘磁盘空间不够用的解决办法
- haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理
- 《安富莱嵌入式周报》第209期:2021.04.19--2021.04.25
- C++实现演讲比赛流程管理系统
- 51单片机IIC通信协议
- python 将单词分割成字母_Python基于分隔符单词拆分列表
- 64位程序调用32位dll