问题重现

需要将以下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时的占位符问题相关推荐

  1. Mybatis日志参数快速替换占位符工具

    Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html Mybatis执行的sql的打印格式为: 2020-08-04 09:16:44 -D ...

  2. Mybatis中的#{}占位符

    Mybatis中的#{}占位符 在Mybatis中配置SQL时,可以使用#{}格式的占位符来表示SQL语句中的参数,在占位符的大括号中,当抽象方法只有1个基本值(基本数据类型对应的值,和String) ...

  3. Mybatis的#{}与${}占位符

    在使用Mybatis配置SQL语句时,SQL语句中的参数可以使用#{}格式的占位符, 还可以使用${}占位符. 在MySQL处理SQL语句时,会经过词法分析.语义分析,然后再执行编译,最终执行! 在M ...

  4. Java之日志打印占位符

    在java中日志打印基本方式有System.out.print()打印,在工程应用中更多的是使用LogFactory,getLogger()打印,下面对其打印时使用占位符的用法进行简单分析. 1.Sy ...

  5. python中占位符包括_python中占位符

    python如何在一个字符串中使用两个占位符 1. 使用连接符: + 12 world = "World"print "Hello " + world + &q ...

  6. TensorFlow中张量,变量、常量、占位符概念

    1.总结TensorFlow中的张量概念 张量:数据结构:多维数组 零阶张量表示标量(scalar),也就是一个数: 一阶张量为向量(vector),也就是一个数组: N阶张量可以理解为一个n维数组: ...

  7. MyBatis复习(四):#{}占位符与SQL传参

    参数类型 1. MyBatis的parameterType参数类型可以是基本数据类型.String.包装类型.java.util.Map.java.util.LinkHashMapd等 ${}和#{} ...

  8. MyBatis——占位符,转义字符,多元素查询(模糊查询),动态sql(多条件中多查询,多条件中单查询)

    占位符:${},#{} ${}:充当占位符时,无法防止sql注入,纯纯的外面给啥,他就往上放啥 #{}:充当-,可以防止sql注入 实体类: package com.itjh.pojo;public ...

  9. mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法

    转载自  mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法 useActualParamName配置 useActualParamName 允许使用方法签名中的名称作为 ...

最新文章

  1. 盘点深度学习一年来在文本、语音和视觉等方向的进展,看强化学习如何无往而不利
  2. 使用Redis分区将数据分割到多个Redis实例
  3. python des解密_python实现DES加密解密方法实例详解
  4. python学习框架图-Python学习---Python的框架基础学习
  5. STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
  6. CodeProject上的最近几篇关于IronPython技术的文章
  7. Blazor WebAssembly 应用程序中进行 HTTP 请求
  8. 高等数学下-赵立军-北京大学出版社-题解-练习8.3
  9. WordPress 3.0十大看点 CMS功能进一步增强
  10. 使用智能移动设备访问Ossim制
  11. 2019.7.17刷题统计
  12. 神秘的中国超级计算机:比肩高铁的世界级领先
  13. 4-算法 校门外的树
  14. 操作系统形成性考核册作业答案
  15. python logging详解及自动添加上下文信息
  16. Hadoop组件之Yarn
  17. 软件自动安装管理器 -提供源码下载
  18. LWM2M简介-学习记录
  19. DedeCMS 栏目三级联动树形菜单的代码
  20. d3_0330_打造小米商城官网 Html+css+JS练手项目实战

热门文章

  1. 圣安地列斯 重制版 决定版 终极版 飞车特技 无法完成 飞不高 飞高 机场 车站 铁轨
  2. 002-webBuilder的HelloWorld应用与表格应用
  3. mkfs.minix.c之minix_super_block.s_ninodes获取解析
  4. Jacobi Seidel Sor --Python
  5. Homebrew介绍和使用
  6. java基础总结(八十七)--Ack机制
  7. 阶跃函数组合响应matlab,matlab在时域分析中的应用
  8. android studio安装模拟器
  9. (超简单2016年发布有效)PDF格式电子书批量删除顽固链接水印
  10. oracle不能关闭,Oracle shutdown immediate无法关闭数据库解决方法