是通过MapperMethod来处理的,根据接口及方法名解析得到SqlCommand及MethodSignature,其主要是通过MethodSignature来解析请求参数的。

解析mapper接口参数

通过ParamNameResolver来得到参数下标到参数名之间的映射。处理过程

1、过滤掉RowBounds、ResultHandler类型参数

2、参数有使用@Param注解时,使用注解名来表示参数名,没有时

(1)全局配置时使用实际的参数名,则通过ParamNameUtil得到实现的参数名

(2)否则使用参数索引来表示参数名,例如"0", "1",...

public ParamNameResolver(Configuration config, Method method) {this.useActualParamName = config.isUseActualParamName();final Class<?>[] paramTypes = method.getParameterTypes();final Annotation[][] paramAnnotations = method.getParameterAnnotations();final SortedMap<Integer, String> map = new TreeMap<>();int paramCount = paramAnnotations.length;// get names from @Param annotationsfor (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {if (isSpecialParameter(paramTypes[paramIndex])) {// skip special parameterscontinue;}String name = null;for (Annotation annotation : paramAnnotations[paramIndex]) {if (annotation instanceof Param) {hasParamAnnotation = true;name = ((Param) annotation).value();break;}}if (name == null) {// @Param was not specified.if (useActualParamName) {name = getActualParamName(method, paramIndex);}if (name == null) {// use the parameter index as the name ("0", "1", ...)// gcode issue #71name = String.valueOf(map.size());}}map.put(paramIndex, name);}names = Collections.unmodifiableSortedMap(map);}

传参转成sql参数

1、如果参数个数只有一个,并且@Param注解,使用wrapToMapIfCollection转换,后序处理与没有使用mapper时一样。

2、否则将参数名与参数值添加到ParamMap中,同时会将param+参数索引,与参数值添加到ParamMap中

public Object getNamedParams(Object[] args) {final int paramCount = names.size();if (args == null || paramCount == 0) {return null;} else if (!hasParamAnnotation && paramCount == 1) {Object value = args[names.firstKey()];return wrapToMapIfCollection(value, useActualParamName ? names.get(0) : null);} else {final Map<String, Object> param = new ParamMap<>();int i = 0;for (Map.Entry<Integer, String> entry : names.entrySet()) {param.put(entry.getValue(), args[entry.getKey()]);// add generic param names (param1, param2, ...)final String genericParamName = GENERIC_NAME_PREFIX + (i + 1);// ensure not to overwrite parameter named with @Paramif (!names.containsValue(genericParamName)) {param.put(genericParamName, args[entry.getKey()]);}i++;}return param;}}

mybatis使用Mapper时对参数处理的设计与实现相关推荐

  1. mybatis中mapper接口的参数设置几种方法

    方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...

  2. springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三)

    springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三) 例: package com.example.demo.service;import com.exa ...

  3. 4、MyBatis + Log4j日志查看Sql参数、结果集元数据、Mapper代理开发、JDK的动态代理与CGLib代理

    文章目录 MyBatis优化开发 日志 ResultSet如何转换为Java对象 数据库元数据 结果集元数据 Fastjson 基于MyBatis的DAO开发(传统) 推荐mapper代理开发 JDK ...

  4. Mybatis的Mapper方法中传递map参数的写法

    Mybatis的Mapper方法中传递map参数的写法 当我们在进行数据分页查询时,如果想让Mybatis的分页查询返回Map对象的集合,我们需要在查询的方法上使用单个参数或者使用Map对象作为参数进 ...

  5. 解决spring整合mybatis时错误 ‘org.mybatis.spring.mapper.MapperScannerConfigurer#0‘

    警告:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybat ...

  6. Mybatis通用Mapper

    极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschina.net/free/Mapper 优点? 不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表 ...

  7. Mybatis学习--Mapper.xml映射文件

    简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...

  8. MyBatis之Mapper动态代理开发

    MyBatis之Mapper动态代理开发 2017/9/30 1.SqlSession的使用范围 1.SqlSessionFactoryBuilder SqlSessionFactoryBuilder ...

  9. Mybatis中Mapper映射文件详解(默认值)

    Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出, ...

最新文章

  1. YOLO v1到YOLO v4(下)
  2. js 改变change方法_JS 之设计模式
  3. oracle中各种函数,oracle中常用函数大全
  4. 《统计学习方法》P74勘误
  5. 用C#改写Head First Design Patterns--SingleTon(原创)
  6. 【渝粤教育】电大中专电商运营实操 (5)作业 题库
  7. Vue移动端项目模板h5
  8. 为方便储户,某银行拟开发计算机储蓄系统。
  9. LTE-5G学习笔记17--COMP技术讲解
  10. Chrome漏洞分析与利用(三)——Issue-1062091漏洞分析
  11. 用java代码输出我爱你_这是一段Java程序员写给最爱的老婆的代码。
  12. 微信上线支付分对标芝麻信用分,教你如何开通!
  13. 域名过期后能否抢注过期高外链域名?
  14. 专用播放器到底是些什么东西?
  15. 【漏洞复现】ApacheShiro1.2.4反序列化漏洞复现(CVE-2016-4437)
  16. java培训包装简历模板
  17. 移植QT5.9到嵌入式开发板(详细)
  18. 登峰造极,师出造化,Pytorch人工智能AI图像增强框架ControlNet绘画实践,基于Python3.10
  19. CPU、MPU、MCU、SoC、MCM介绍
  20. ICV:车规级激光雷达市场规模超7亿美元,补盲雷达有望2024年量产

热门文章

  1. Substring with Concatenation of All Words
  2. js 求两个日期之间相差天数
  3. javascript 实现模拟滚动条,但不支持鼠标滚轮
  4. Oracle 异常 ORA-01861: literal does not match format string(字符串格式不匹配)
  5. python常用模块大全总结-Python模块汇总(常用第三方库)
  6. monty python life of brian-50大最搞笑喜剧片,无厘头成必杀技!
  7. python笔记基础-python学习笔记(一)python简介和基础
  8. python详细安装教程环境配置-Python的安装教程与环境配置
  9. python与excel结合能做什么-openpyxl怎样按行和按列读取excel
  10. python基础指令-Python基础——与Python的指令交互