`
frank1998819
  • 浏览: 758154 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

mybatis嵌套循环map(高级用法)(转)

 
阅读更多

 

 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_41899174/article/details/89500882

前言:

 

       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>

 

————————————————

版权声明:本文为CSDN博主「诗人与黑客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_41899174/article/details/89500882

分享到:
评论

相关推荐

    测试mybatis里foreach用法

    在MyBatis中,`&lt;foreach&gt;`标签是一个非常重要的元素,它主要用于动态SQL语句的构建,尤其是在处理集合数据类型如List、Array、Map时。`&lt;foreach&gt;`标签的使用可以极大地提高代码的可读性和可维护性,避免了传统的字符...

    Map和Bean灵活转换工具类

    此外,如果Java Bean的属性存在嵌套或者循环引用的情况,转换时需要特别处理,避免无限递归。 总结来说,`MapUtils`和`BeanUtils`是Java开发中处理数据转换的重要工具,它们极大地简化了Map与Bean之间的转换操作,...

    MyBatis学习实例

    在实际项目中,MyBatis常与Spring框架结合使用,通过Spring的DataSourceTransactionManager和MyBatis的SqlSessionFactoryBean,可以实现事务管理和数据源的管理。 通过深入学习这个"MyBatis学习实例",你将能熟练...

    mybatis3文档

    总的来说,"mybatis3文档"是学习和掌握MyBatis3不可或缺的资源,它涵盖了从基础配置到高级特性的全方位内容,旨在帮助开发者充分发挥MyBatis3的潜力,实现高效、灵活的数据库操作。通过仔细阅读和实践,开发者可以...

    mybatis代码示例

    6. **参数映射(Parameter Mapping)**:MyBatis支持简单的参数映射,如传入单个参数,也支持复杂参数映射,如使用`@Param`注解或使用Map作为参数。 7. **动态SQL**:MyBatis的动态SQL功能强大,可以在XML映射文件...

    Java mybatis - 实践学习案例.zip

    通过"Java MyBatis - 实践学习案例.zip"中的示例,你可以逐步了解并掌握如何创建Mapper接口和XML映射文件,如何在Service层调用Mapper方法,以及如何配置和使用MyBatis的全局配置文件。这些实例将帮助你理解MyBatis...

    mybatis3中文开发文档介绍

    MyBatis 支持强大的动态SQL,可以在XML映射文件或注解中使用条件语句、foreach循环等,根据业务需求动态构建SQL,避免了大量的硬编码。 4. **参数映射**: MyBatis 提供了多种方式处理参数,如简单类型、Map、...

    36道面试常问的MyBatis面试题!.zip

    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java Web开发中,MyBatis常被用来替代传统的JDBC,以简化数据库操作,提高开发效率。以下是对36道MyBatis面试题的详细解答,旨在帮助你...

    mybatis学习笔记

    ### MyBatis学习笔记知识点概览 #### 1. MyBatis入门 ##### 1.1 单独使用JDBC编程问题总结 ...以上是基于提供的文件内容总结出的关键知识点,涉及MyBatis的基本概念、核心功能、使用技巧及与其他框架的整合等方面。

    自己整理的mp笔记自己整理的mp笔记

    使用`&lt;foreach&gt;`标签,可以在SQL语句中方便地进行嵌套循环,例如在IN查询中遍历集合。 9. **自定义插件**: MyBatis允许用户自定义拦截器插件,可以全局拦截SQL执行,实现统计、日志等功能。 10. **事务管理**:...

    1000道 互联网Java工程师面试题 485页.pdf

    - 或者使用MyBatis提供的`foreach`标签进行循环插入。 13. **获取主键值**: - 可以通过`useGeneratedKeys`和`keyProperty`属性配置来自动生成主键值。 14. **多参数传递**: - 可以使用`@Param`注解对参数进行...

    Java基础面试题169提以及答案.docx

    4. **跳出多重嵌套循环**: - 跳出多重循环可以使用带标签的`break`语句,定义一个外部循环的标签,然后在内层循环中使用`break label;`。另一种常见做法是通过改变外部循环的条件使其提前终止。 5. **`switch`...

    java1000题基础百战程序员

    - 分支嵌套与循环嵌套 - **数组** - 数组的概念与用途 - 数组的声明与初始化 - 数组的操作:遍历、排序等 - **面向对象** - 面向对象的基本概念:封装、继承、多态 - 类与对象 - 构造方法与析构方法 - 继承...

    2019史上最全Java面试大全.docx

    - 循环结构(for、while、do-while)用于重复执行一段代码,面试时可能会遇到编写嵌套循环或优化循环效率的问题。 3. **函数与方法** - 方法是实现功能的代码块,可以接受参数并返回结果。面试中,理解方法签名、...

    技术笔记(第一部分整理)

    Java是一种广泛使用的高级编程语言,以其平台独立性著称,能够在任何支持Java的平台上运行而无需重新编译。Java语言的设计原则是“一次编写,到处运行”(Write Once, Run Anywhere, WORA),这得益于Java虚拟机...

    ibatis学习资料

    本学习资料旨在帮助你对 Ibatis 进行初步的入门学习,了解其基本概念、配置及使用方法。 1. **Ibatis 概述** - Ibatis 是由 Clinton Begin 创建的一个轻量级的 Java ORM(对象关系映射)框架。 - 它不同于 ...

    java笔试面试题集合,全!新!

    4. 流程控制:if语句、switch语句、循环(for、while、do-while)的使用及其嵌套。 5. 数组:理解数组的声明、初始化、遍历,以及多维数组的应用。 二、面向对象 1. 类与对象:理解类的定义、对象的创建及销毁。 2....

    JAVA面试题总汇:j2ee面试知识.pdf

    - **代码层面:** 优化算法、减少循环嵌套、字符串操作优化。 - **系统层面:** JVM调优、数据库调优、分布式系统性能调优技巧。 - **网络层面:** 减少HTTP请求次数、利用CDN、压缩数据传输。 #### 10. 测试和调试...

    a-mapper:一个极其灵活且高度可配置的库,用于将对象图和其他数据结构相互映射和差异化

    5. **递归映射**:能够处理嵌套对象和递归结构的映射,无需担心循环引用问题。 6. **差异化**:提供对象间的差异比较,可以用于数据分析、版本控制或数据同步。 7. **性能优化**:设计时考虑了性能因素,确保在大...

    Java进阶路线

    MySQL 是最常用的开源关系型数据库之一,了解它的使用方法和优化技巧对于开发者来说非常重要: - **SQL语言**:SQL 查询语句的编写。 - **SQL调优**:查询优化和索引管理。 - **鉴权**:用户身份验证。 - **数据...

Global site tag (gtag.js) - Google Analytics