使用map类型的参数在mapper.xml中使用案例

使用map类型的参数在mapper.xml中使用案例

简介:在常见的开发中,对于参数的装载一般使用map类型方式,这样可以避免创建很多参数实体类,不管嵌套多层的数据参数都可以通过map拿取,对于嵌套多层的map,我们需要深层的一个集合在mapper.xml中遍历,如何拿到该值?

准备:

使用模拟请求数据:

这里,我需要拿到ids中的值进行遍历查找,但ids在aaa的下一层

后端接口,直接用map类型接收

然后直接看dao层

这里我先使用@Param注解

对应的mapper.xml的内容

解释:
m.aaa.ids:m是该参数名叫map的类型为map的数据的一个别名,这个别名是该@Param注解给的,用于mybatis框架区分dao层传入的多个参数(这里我只有一个)aaa是这个map类型的数据中最外层的key,通过m.aaa就进入了aaa的数据内容,ids是aaa中的,所以m.aaa.ids就进入了ids了,这里的m.aaa其实是类似于m.getProperty("aaa")这种,通过key-value的方式找到你需要的数据体内。

测试结果:

接下来我会一个个方式进行尝试看能否成功拿到ids,只改变dao层的参数和mapper.xml的获取ids方式

由于只有一个参数,我就不用@Param,也能找到,因为只有一个,不会产生歧义

这里我试图通过参数的名字map去找到ids,就是map.aaa.ids

结果:报错

根据报错信息可知:无法找到名叫aaa的数据,就是通过getProperty("aaa")找不到名叫aaa的东东

分析:dao层的map类型的名叫map的参数在mapper.xml中,mybatis是不认的,因为只有一个参数,他会直接打开map中的aaa所在的那一层,我这里aaa这一层的数据只有aaa这一个,下边我会弄多个,先暂时一个分析。

那么这个map.aaa.ids就和aaa.aaa.ids有点像,aaa中是没有名叫aaa的数据的,所以找不到,根据这个思路,这样写:aaa.ids会如何?

测试

成功到了ids层;

好,然后dao层我们试着用两个参数,当有多个参数后,默认有参数从左到右依次为param1,param2...的别名,这是mybatis自带的,


可以看到成功了

分析:这里的param1其实就是和@Param注解取的别名一样都在map类型的数据的数据名称这一层,和上边的一个参数直接就打开了这一层进入到数据体不一样。

那如果有多层,然后外边也有多层如何拿到ids?

测试:

内部有多层


成功,然后使用注解@Param拿ids



成功了,那如果外部传了多层,内部也是多层,如何取到ids?

测试:


成功拿到

**总结:**我认为mapper.xml中的引用.,其实和通过key-value找值实质一样,比如aaa.bbb.ids的意思就是aaa通过getproperty("bbb")进入bbb层数据,然后bbb.getproperty("ids")进入ids层。
这里有点迷惑人的就是dao层如果只有一个参数,mapper.xml中会默认打开dao层的参数,直接进入该参数内,比如上边的例子,直接通过aaa.ids就行,不必再明确是dao层的那个参数名
然后其他的情况基本是一样的,都是通过dao层的参数名(可以是param1这种mybatis默认给的别名,也可以是@Param注解自定义别名),因为只有这样mybatis才知道你要从那个参数名中拿到参数名对应的数据体。

**结语:**有的时候弄这个会出现莫名的问题,这里就抽了时间做一个测试+总结,希望对大家有帮助

相关推荐
Wang's Blog3 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog3 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网3 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff4 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
Shaoshing4 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
dd聊技术4 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76894 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY4 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty
蚰蜒螟4 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
会编程的吕洞宾5 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring