浅谈MyBatis循环Map(高级用法)

今天遇到一个比较特殊的业务,需要对传入的Map数据在映射文件中进行遍历,在之前的学习中,我们也知道MyBatis有默认对集合的操作list和array,但是没有默认的map,所有不能直接写collection="map",如果这么处理,它会当成是根据map.get("map")获取传递value只,==大部分情况下是一个map中是不会有“map”这个key的,于是就是报错==。如果你想用map标识来获取参数map,就需要保证传入的Map参数有@Param("map")注解。

1.Mybatis入参Map的使用

1.1 传递Map数据

第一种:自己封装传递Map中的KEY值,模拟数据

//service:
public List<UserDepte> 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)

第二种:个人推荐@Param注解

//service直接调用dao
int getByMap(@param("paramsMap") Map<String,Object> map)

1.2 映射文件XML

(1)循环KEY值写法:

<foreach collection="paramsMap.keys" item="k" separator="and">
  ${k} = #{k}
</foreach>

(2)循环VAVLUE值写法

<foreach collection="paramsMap.values" item="v" separator="and">
  ${v} = #{v}
</foreach>

其实本质就是使用的Map.Entiy对象中的属性,自己回顾一下Java中对Map的遍历方式有几种

1.3 KEY获取VALUE

<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>

==回顾:#和$的区别,应该还记得吧!==

1.4 表达式书写错误

通常我们设置值的时候,会以#{}的方式,而不是${},如下:==错误写法==

<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}]} <!-- 请注意这种写法,我个人还是喜欢一次性获取key和value的写法 -->
  </if>
</foreach>

2.Map高级用法

MyBatis嵌套循环map的高级用法:假如参数类型是这么一个类型结构: Map map = new HashMap<String,List<String>>,我想要拼装出来的sql如下:

select * from 表名
where (
  (id = 1 and name in ('悟空','唐僧','八戒') or
  (id = 2 and name in ('刘备','张飞','关羽') or
  (id = 3 and name in ('小三','王五','王八') or
  ……
)

id对应的是Map中KEY,而in中的数据是Map中的value

Map<String,List<String>> map = new HashMap<>();
List<String> nameList = new ArrayList<>();
nameList.add("悟空");
nameList.add("唐僧");
nameList.add("八戒");
map.put("1",nameList);

nameList = new ArrayList<>();
nameList.add("刘备");
nameList.add("张飞");
nameList.add("关羽");
map.put("2",nameList);

(1)第一种写法:就是通过KEY获取value的形式

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>

(1)第二种写法:个人喜欢的方式

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>

到此这篇关于浅谈MyBatis循环Map(高级用法)的文章就介绍到这了,更多相关MyBatis循环Map内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Boot整合mybatis并自动生成mapper和实体实例解析

    最近一直都在学习Java,发现目前Java招聘中,mybatis出现的频率挺高的,可能是目前Java开发中使用比较多的数据库ORM框架.于是我准备研究下Spring Boot和mybatis的整合. 1.在pom.xml文件中添加下面的配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • MyBatis传入集合 list 数组 map参数的写法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性

  • 浅谈Mybatis通用Mapper使用方法

    对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在对应工程的pom.xml文件中添加 <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency> &

  • Mybatis增删改查mapper文件写法详解

      1. 插入 <mapper namespace="需要实现接口的全类名"> <insert id="需要实现的接口里的方法名" parameterType="方法参数类型,如果是对象要写全类名"> INSERT sql命令(命令里通过#{}获取对象属性) <!--注意属性名区分大小写 --> </insert> <mapper> EG: <mapper namespace=&q

  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法. 关于MyBatis,大部分人都很熟悉.MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Pla

  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    一.添加所需依赖,当前完整的pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&q

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper的内置方法 model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Service层主要做逻辑判断,Dao层是数据访问层,与数据库进行对接.至于Mapper是mybtis框架的映射用到,mapper映射文件在dao层用. 下面是介绍一下Mapper的内置方法: 1.countByExample ===>根据条件查询数量 int countByExample(UserE

  • MyBatis实践之DAO与Mapper

    MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注册驱动.设置参数.创建Connection/Statement.解析结果集等JDBC过程性代码.MyBatis基于XML/注解的方式配置Statement,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class pers

  • 浅谈MyBatis循环Map(高级用法)

    今天遇到一个比较特殊的业务,需要对传入的Map数据在映射文件中进行遍历,在之前的学习中,我们也知道MyBatis有默认对集合的操作list和array,但是没有默认的map,所有不能直接写collection="map",如果这么处理,它会当成是根据map.get("map")获取传递value只,==大部分情况下是一个map中是不会有"map"这个key的,于是就是报错==.如果你想用map标识来获取参数map,就需要保证传入的Map参数有@P

  • 浅谈java中Map的用法

    public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import javautilHashMap; import javautilMap; public class Test { public static void main(String[] args) { Map map = new HashMap();//声明一个Map mapput("s", "哈哈");//向map中放

  • Python入门_浅谈for循环、while循环

    Python中有两种循环,分别为:for循环和while循环. 1. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的基本结构如下: 具体看这个案例: 设计一个函数,在桌面创建10个文本,用数字从1-10依次给它们命名. def text_create(): path = '/Users/duwangdan/Desktop/' for text_name in range(1,11): # 1-10的范围需要用到r

  • 浅谈SpringMVC中的session用法及细节记录

    前言 初学SpringMVC,最近在给公司做的系统做登录方面,需要用到session. 在网上找了不少资料,大致提了2点session保存方式: 1.javaWeb工程通用的HttpSession 2.SpringMVC特有的@SessionAttributes 我个人比较关注@SessionAttributes的用法,毕竟现在是在用SpringMVC嘛.但是我看网上那些文章,基本都是只说明了基础用法,详细的使用和细节却基本没有,我想这是不够的,所以我自己做了一些测试,然后整理了下代码做了个de

  • 浅谈Pandas中map, applymap and apply的区别

    1.apply() 当想让方程作用在一维的向量上时,可以使用apply来完成,如下所示 In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) In [117]: frame Out[117]: b d e Utah -0.029638 1.081563 1.280300 Ohio 0.647747 0.831136 -1.

  • 浅谈Mybatis版本升级踩坑及背后原理分析

    1.背景 某一天的晚上,系统服务正在进行常规需求的上线,因为发布时,提示统一的pom版本需要升级,于是从 1.3.9.6 升级至 1.4.2.1. 当服务开始上线后,开始陆续出现了一些更新系统交互日志方面的报警,属于系统辅助流程,报警下图所示, 具体系统数据已脱敏,内容是Mybatis相关的报警,在进行类型转换的时候,产生了强转错误. 更新开票请求返回日志, id:{#######}, response:{{"code":XXX,"data":{"call

  • 浅谈matplotlib中FigureCanvasXAgg的用法

    背景知识: FigureCanvasXAgg就是一个渲染器,渲染器的工作就是drawing,执行绘图的这个动作.渲染器是使物体显示在屏幕上 主要内容: 将一个figure渲染的canvas变为一个Qt widgets,figure显示的过程是需要管理器(manager),需要FigureCanvasBase来管理.报错信息'FigureCanvasQTAgg' object has no attribute 'manager' 将一个navigation toolbar渲染成Qt widgets

  • 浅谈Mybatis中resultType为hashmap的情况

    现在有一张user表 id ,name,age 我们进行一个简单的查询: <select id="test" resultType="Uer"> select id ,name,age from user </select> 查询完后,怎么去接收这个查询结果呢,通常在这个mapper.xml对应的接口中使用List<User>做为返回值去接收,最后存储的样子就是下面的图 这是一个很简单的单表查询操作,其实这种简单的单表查询操作不需

  • 浅谈myBatis中的插件机制

    插件的配置与使用 在mybatis-config.xml配置文件中配置plugin结点,比如配置一个自定义的日志插件LogInterceptor和一个开源的分页插件PageInterceptor: <plugins> <plugin interceptor="com.crx.plugindemo.LogInterceptor"></plugin> <plugin interceptor="com.github.pagehelper.P

  • 浅谈JackSon的几种用法

    JackSon介绍 本文使用的JackSon版本为2.9.6. JackSon是解析JSON和XML的一个框架,优点是简单易用,性能较高. JackSon处理JSON的方式 JackSon提供了三种JSON的处理方式.分别是数据绑定,树模型,流式API.下面会分别介绍这三种方式. JackSon数据绑定 数据绑定用于JSON转化,可以将JSON与POJO对象进行转化.数据绑定有两种,简单数据绑定和完整数据绑定. 完整数据绑定 package com.xymxyg.json; import com

随机推荐