mybatis嵌套循环map(高级用法)
前言:
mybatis有默认的list,array,但是没有默认的map。所以不能直接写collection="map",如果这么写,它会当成是根据map.get(“map”)来取value值,大部分情况下是一个map中是不会有“map”这个key的,于是就是报错。如果你想用这个“map”标识取参数map,就需要保证传入的Map参数有@Param("map")注解。
mybatis入参map的基本语法:
service,dao的写法:
//service:
public List<BpmDefUser> getByMap(Map<String,List<Long>> map){Map<String,Object> paramsMap= new HashMap<String, Object>();params.put("paramsMap", map);return this.getByMap(paramsMap);
}//dao:
int getByMap(Map<String,Object> map)
或者(推荐):
//service直接调用dao
int getByMap(@param("paramsMap") Map<String,Object> map)
xml的写法:
循环key:
<foreach collection="paramsMap.keys" item="k" separator="and"> ${k} = #{k} </foreach>
循环values
<foreach collection="paramsMap.values" item="v" separator="and"> ${v} = #{v}
</foreach>
循环获取key和值:
<foreach collection="paramsMap.keys" item="k" separator="and"> <if test="null != paramsMap[k]"> ${k} = ${paramsMap[k]} </if>
</foreach>
或者一次循环得到key和value值(推荐):
<foreach collection="paramsMap" index="key" item="value">${key} = ${value}
</foreach>
易错点:表达式抒写错误
通常我们设置值的时候,会以#{}的方式,而不是${},如下:
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[k]} </if>
</foreach>
你会发现,取不了值了,${condition[k]} 能取的出值,但#{condition[k]} 取出来的值却实null,正确的写法应该是:
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[${k}]} </if>
</foreach>
mybatis嵌套循环map的高级用法:
假如参数类型是这么一个类型结构: Map map = new HashMap<String,HashSet<String>>,我想要拼装出来的sql如下:
select * from 表名
where ((id = 1 and name in ('小二','小三','小四') or(id = 2 and name in ('小二','小三','赵六') or(id = 3 and name in ('小三','王五','王八') or……
)
mybatis应该怎么写?
第一种写法:
SELECT * FROM 表名WHERE <foreach collection="paramsMap.keys" item="key" open="(" separator="OR" close=")">(id = #{key} AND name in<foreach collection = "paramsMap[key]" item="name" separator="," open="(" close=")">#{name}</foreach>)</foreach>
第二种写法(推荐):
SELECT * FROM 表名WHERE <foreach collection="paramsMap" index="key" item="value" open="(" separator="OR" close=")">(id = #{key} AND name in<foreach collection = "value" item="name" separator="," open="(" close=")">#{name}</foreach>)</foreach>
更多原创技术文章请关注微信公众平台《Java深度编程》:
mybatis嵌套循环map(高级用法)相关推荐
- MyBatis循环Map(高级用法)
MyBatis循环Map 今天遇到一个比较特殊的业务,需要对传入的Map数据在映射文件中进行遍历,在之前的学习中,我们也知道MyBatis有默认对集合的操作list 和 array ,但是没有默认的 ...
- Mybatis 嵌套循环Map
前言: mybatis有默认的list,array,但是没有默认的map.所以不能直接写collection="map",如果这么写,它会当成是根据map.get("ma ...
- Mybatis Example的高级用法
近几个项目一直使用的mybatis来对数据库做查询,期间用到了很多高效简洁的查询方法,特此记录和分享. 一. mapper接口中的函数及方法 方法名 功能 int countByExample(Use ...
- 函数式编程-Stream流/lambda表达式/Optional/函数式接口/方法引用/高级用法
函数式编程-Stream流 不会Lambda表达式.函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂 1. 概述 ...
- java reduce.mdn_reduce高级用法
reduce作为ES5新增的常规数组方法之一,对比forEach .filter和map,在实际使用上好像有些被忽略,发现身边的人极少用它,导致这个如此强大的方法被逐渐埋没. 如果经常使用reduce ...
- python用psf函数_Python 嵌套函数(高级用法)
Python 嵌套函数(高级用法) 一.嵌套函数(高级用法) 1.嵌套函数 函数的嵌套调用是在"函数调用中再调用其他函数".也就是说:函数嵌套允许在一个函数中调用另外一个函数.如下 ...
- python3.7正则表达式语法_python3正则表达式的几个高级用法
python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...
- foreach用法_25个你不得不知道的数组reduce高级用法
作者:JowayYoung 仓库:Github.CodePen 博客:掘金.思否.知乎.简书.头条.CSDN 公众号:IQ前端 联系我:关注公众号后有我的微信哟 特别声明:原创不易,未经授权不得对此文 ...
- Python高级用法总结
Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...
最新文章
- 美智库最新报告:小数据人工智能潜力不可估量
- springboot之@ConfigurationProperties加载配置文件
- educoder答案python玩转列表_2020大学mooc用Python玩转数据章节测验答案
- _Linux系统编程—信号集操作函数
- 启动rabbitmq,提示ERROR: node with name rabbit already running on localhost(亲测)
- Promise:Promise.all、Promise.race、Promise.any的用法及区别
- win64环境下的一些配置
- php xmlreader 读xml,PHP中使用xmlreader读取xml数据示例
- java 抽象类_java中的抽象类
- 你好,了解一下Java 14带来的一系列新功能
- Systrace的用法小结
- Java多线程学习十二:悲观锁和乐观锁的本质||
- 华为机试HJ2:计算某字母出现次数
- 二分--求最小值的最大p1m2
- IDEA运行main,junit方法报错Class not found
- Android获取应用签名
- 定级阿里P7,300道Java面试题帮你全副武装
- 新媒体运营:如何策划出一场完整高效的活动方案?(二) 黎想
- airpod蓝牙耳机音量大解决办法_关于AirPods的常见问题汇总 全面了解苹果AirPods无线耳机...
- 知识兔Excel教程:让同事看傻~这几个Excel技巧太牛了