mybatis使用Mapper时对参数处理的设计与实现
是通过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时对参数处理的设计与实现相关推荐
- mybatis中mapper接口的参数设置几种方法
方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...
- springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三)
springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三) 例: package com.example.demo.service;import com.exa ...
- 4、MyBatis + Log4j日志查看Sql参数、结果集元数据、Mapper代理开发、JDK的动态代理与CGLib代理
文章目录 MyBatis优化开发 日志 ResultSet如何转换为Java对象 数据库元数据 结果集元数据 Fastjson 基于MyBatis的DAO开发(传统) 推荐mapper代理开发 JDK ...
- Mybatis的Mapper方法中传递map参数的写法
Mybatis的Mapper方法中传递map参数的写法 当我们在进行数据分页查询时,如果想让Mybatis的分页查询返回Map对象的集合,我们需要在查询的方法上使用单个参数或者使用Map对象作为参数进 ...
- 解决spring整合mybatis时错误 ‘org.mybatis.spring.mapper.MapperScannerConfigurer#0‘
警告:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybat ...
- Mybatis通用Mapper
极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschina.net/free/Mapper 优点? 不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表 ...
- Mybatis学习--Mapper.xml映射文件
简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...
- MyBatis之Mapper动态代理开发
MyBatis之Mapper动态代理开发 2017/9/30 1.SqlSession的使用范围 1.SqlSessionFactoryBuilder SqlSessionFactoryBuilder ...
- Mybatis中Mapper映射文件详解(默认值)
Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出, ...
最新文章
- YOLO v1到YOLO v4(下)
- js 改变change方法_JS 之设计模式
- oracle中各种函数,oracle中常用函数大全
- 《统计学习方法》P74勘误
- 用C#改写Head First Design Patterns--SingleTon(原创)
- 【渝粤教育】电大中专电商运营实操 (5)作业 题库
- Vue移动端项目模板h5
- 为方便储户,某银行拟开发计算机储蓄系统。
- LTE-5G学习笔记17--COMP技术讲解
- Chrome漏洞分析与利用(三)——Issue-1062091漏洞分析
- 用java代码输出我爱你_这是一段Java程序员写给最爱的老婆的代码。
- 微信上线支付分对标芝麻信用分,教你如何开通!
- 域名过期后能否抢注过期高外链域名?
- 专用播放器到底是些什么东西?
- 【漏洞复现】ApacheShiro1.2.4反序列化漏洞复现(CVE-2016-4437)
- java培训包装简历模板
- 移植QT5.9到嵌入式开发板(详细)
- 登峰造极,师出造化,Pytorch人工智能AI图像增强框架ControlNet绘画实践,基于Python3.10
- CPU、MPU、MCU、SoC、MCM介绍
- ICV:车规级激光雷达市场规模超7亿美元,补盲雷达有望2024年量产
热门文章
- Substring with Concatenation of All Words
- js 求两个日期之间相差天数
- javascript 实现模拟滚动条,但不支持鼠标滚轮
- Oracle 异常 ORA-01861: literal does not match format string(字符串格式不匹配)
- python常用模块大全总结-Python模块汇总(常用第三方库)
- monty python life of brian-50大最搞笑喜剧片,无厘头成必杀技!
- python笔记基础-python学习笔记(一)python简介和基础
- python详细安装教程环境配置-Python的安装教程与环境配置
- python与excel结合能做什么-openpyxl怎样按行和按列读取excel
- python基础指令-Python基础——与Python的指令交互