Mybatis-ParameterType=Map时的占位符问题
问题重现
需要将以下map的value插入到sql的占位符当中:
map = {"Product2.Product2" : "Garden Li"
}
数据:
id | name |
---|---|
26 | Garden Li |
mapper interface 如下:
Student selectByMap(@Param("paramsMap") Map<String, Object> map);
mapper.xml如下:
<select id="selectByMap" parameterType="java.util.Map" resultMap="BaseResultMap">select*from studentwhere name = #{paramsMap.Product2.Product2}</select>
入参情形
Map<String, Object> map = new HashMap<>();map.put("Product2.Product2", "Garden Li");Student student = studentMapper.selectByMap(map);System.out.println(student);
日志结果
==> Preparing: select * from student where name = ?
==> Parameters: null
<== Total: 0
结论:异常,并未达到预期结果。
排查过程
根据Mybatis底层实现,优先找到参数处理的类,即ParameterHandler接口的默认实现DefaultParameterHandler:
/*** @author Clinton Begin* @author Eduardo Macarron*/
public class DefaultParameterHandler implements ParameterHandler
debug到参数解析类PropertyTokenizer的解析方法:
public PropertyTokenizer(String fullname) {int delim = fullname.indexOf('.');if (delim > -1) {name = fullname.substring(0, delim);children = fullname.substring(delim + 1);} else {name = fullname;children = null;}indexedName = name;delim = name.indexOf('[');if (delim > -1) {index = name.substring(delim + 1, name.length() - 1);name = name.substring(0, delim);}}
判断出Mybatis不能处理带多个【.】的占位符入参
解决方案
配合Mybatis的原理实现,构造嵌套的map进行正常处理:
Map<String, Object> innerMap = new HashMap<>();innerMap.put("Product2", "Garden Li");Map<String, Object> map = new HashMap<>();map.put("Product2", innerMap);Student student = studentMapper.selectByMap(map);System.out.println(student);
日志结果:
==> Preparing: select * from student where name = ?
==> Parameters: Garden Li(String)
<== Columns: id, name
<== Row: 26, Garden Li
<== Total: 1
Mybatis-ParameterType=Map时的占位符问题相关推荐
- Mybatis日志参数快速替换占位符工具
Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html Mybatis执行的sql的打印格式为: 2020-08-04 09:16:44 -D ...
- Mybatis中的#{}占位符
Mybatis中的#{}占位符 在Mybatis中配置SQL时,可以使用#{}格式的占位符来表示SQL语句中的参数,在占位符的大括号中,当抽象方法只有1个基本值(基本数据类型对应的值,和String) ...
- Mybatis的#{}与${}占位符
在使用Mybatis配置SQL语句时,SQL语句中的参数可以使用#{}格式的占位符, 还可以使用${}占位符. 在MySQL处理SQL语句时,会经过词法分析.语义分析,然后再执行编译,最终执行! 在M ...
- Java之日志打印占位符
在java中日志打印基本方式有System.out.print()打印,在工程应用中更多的是使用LogFactory,getLogger()打印,下面对其打印时使用占位符的用法进行简单分析. 1.Sy ...
- python中占位符包括_python中占位符
python如何在一个字符串中使用两个占位符 1. 使用连接符: + 12 world = "World"print "Hello " + world + &q ...
- TensorFlow中张量,变量、常量、占位符概念
1.总结TensorFlow中的张量概念 张量:数据结构:多维数组 零阶张量表示标量(scalar),也就是一个数: 一阶张量为向量(vector),也就是一个数组: N阶张量可以理解为一个n维数组: ...
- MyBatis复习(四):#{}占位符与SQL传参
参数类型 1. MyBatis的parameterType参数类型可以是基本数据类型.String.包装类型.java.util.Map.java.util.LinkHashMapd等 ${}和#{} ...
- MyBatis——占位符,转义字符,多元素查询(模糊查询),动态sql(多条件中多查询,多条件中单查询)
占位符:${},#{} ${}:充当占位符时,无法防止sql注入,纯纯的外面给啥,他就往上放啥 #{}:充当-,可以防止sql注入 实体类: package com.itjh.pojo;public ...
- mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法
转载自 mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法 useActualParamName配置 useActualParamName 允许使用方法签名中的名称作为 ...
最新文章
- 盘点深度学习一年来在文本、语音和视觉等方向的进展,看强化学习如何无往而不利
- 使用Redis分区将数据分割到多个Redis实例
- python des解密_python实现DES加密解密方法实例详解
- python学习框架图-Python学习---Python的框架基础学习
- STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
- CodeProject上的最近几篇关于IronPython技术的文章
- Blazor WebAssembly 应用程序中进行 HTTP 请求
- 高等数学下-赵立军-北京大学出版社-题解-练习8.3
- WordPress 3.0十大看点 CMS功能进一步增强
- 使用智能移动设备访问Ossim制
- 2019.7.17刷题统计
- 神秘的中国超级计算机:比肩高铁的世界级领先
- 4-算法 校门外的树
- 操作系统形成性考核册作业答案
- python logging详解及自动添加上下文信息
- Hadoop组件之Yarn
- 软件自动安装管理器 -提供源码下载
- LWM2M简介-学习记录
- DedeCMS 栏目三级联动树形菜单的代码
- d3_0330_打造小米商城官网 Html+css+JS练手项目实战
热门文章
- 圣安地列斯 重制版 决定版 终极版 飞车特技 无法完成 飞不高 飞高 机场 车站 铁轨
- 002-webBuilder的HelloWorld应用与表格应用
- mkfs.minix.c之minix_super_block.s_ninodes获取解析
- Jacobi Seidel Sor --Python
- Homebrew介绍和使用
- java基础总结(八十七)--Ack机制
- 阶跃函数组合响应matlab,matlab在时域分析中的应用
- android studio安装模拟器
- (超简单2016年发布有效)PDF格式电子书批量删除顽固链接水印
- oracle不能关闭,Oracle shutdown immediate无法关闭数据库解决方法