前言:

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(高级用法)相关推荐

  1. MyBatis循环Map(高级用法)

    MyBatis循环Map 今天遇到一个比较特殊的业务,需要对传入的Map数据在映射文件中进行遍历,在之前的学习中,我们也知道MyBatis有默认对集合的操作list 和 array ,但是没有默认的 ...

  2. Mybatis 嵌套循环Map

    前言: mybatis有默认的list,array,但是没有默认的map.所以不能直接写collection="map",如果这么写,它会当成是根据map.get("ma ...

  3. Mybatis Example的高级用法

    近几个项目一直使用的mybatis来对数据库做查询,期间用到了很多高效简洁的查询方法,特此记录和分享. 一. mapper接口中的函数及方法 方法名 功能 int countByExample(Use ...

  4. 函数式编程-Stream流/lambda表达式/Optional/函数式接口/方法引用/高级用法

    函数式编程-Stream流 不会Lambda表达式.函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂 1. 概述 ...

  5. java reduce.mdn_reduce高级用法

    reduce作为ES5新增的常规数组方法之一,对比forEach .filter和map,在实际使用上好像有些被忽略,发现身边的人极少用它,导致这个如此强大的方法被逐渐埋没. 如果经常使用reduce ...

  6. python用psf函数_Python 嵌套函数(高级用法)

    Python 嵌套函数(高级用法) 一.嵌套函数(高级用法) 1.嵌套函数 函数的嵌套调用是在"函数调用中再调用其他函数".也就是说:函数嵌套允许在一个函数中调用另外一个函数.如下 ...

  7. python3.7正则表达式语法_python3正则表达式的几个高级用法

    python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...

  8. foreach用法_25个你不得不知道的数组reduce高级用法

    作者:JowayYoung 仓库:Github.CodePen 博客:掘金.思否.知乎.简书.头条.CSDN 公众号:IQ前端 联系我:关注公众号后有我的微信哟 特别声明:原创不易,未经授权不得对此文 ...

  9. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

最新文章

  1. 美智库最新报告:小数据人工智能潜力不可估量
  2. springboot之@ConfigurationProperties加载配置文件
  3. educoder答案python玩转列表_2020大学mooc用Python玩转数据章节测验答案
  4. _Linux系统编程—信号集操作函数
  5. 启动rabbitmq,提示ERROR: node with name rabbit already running on localhost(亲测)
  6. Promise:Promise.all、Promise.race、Promise.any的用法及区别
  7. win64环境下的一些配置
  8. php xmlreader 读xml,PHP中使用xmlreader读取xml数据示例
  9. java 抽象类_java中的抽象类
  10. 你好,了解一下Java 14带来的一系列新功能
  11. Systrace的用法小结
  12. Java多线程学习十二:悲观锁和乐观锁的本质||
  13. 华为机试HJ2:计算某字母出现次数
  14. 二分--求最小值的最大p1m2
  15. IDEA运行main,junit方法报错Class not found
  16. Android获取应用签名
  17. 定级阿里P7,300道Java面试题帮你全副武装
  18. 新媒体运营:如何策划出一场完整高效的活动方案?(二) 黎想
  19. airpod蓝牙耳机音量大解决办法_关于AirPods的常见问题汇总 全面了解苹果AirPods无线耳机...
  20. 知识兔Excel教程:让同事看傻~这几个Excel技巧太牛了

热门文章

  1. 惠普屏幕录制,截屏的快捷键
  2. 无线射频技术是什么技术 RFID技术与无线技术的区别
  3. 【win】Photoshop+蓝湖插件安装小白教程(下)
  4. Unity 蓝湖 关于UI工作流优化的思考
  5. java的继承,子类继承父类的属性和方法,除却构造方法和常量
  6. Liunx - 网络编程
  7. 亚马逊云科技:安全不是问题 是答案
  8. 为什么说爱奇艺是一家技术公司?
  9. 测试百公里加速软件,YYP说透百公里加速:专业测试方法最详细剖析
  10. 计算机行业pc啥意思,pc是什么意思?关于pc材料的介绍