版权声明:本文为博主原创文章,遵循 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>`标签是一个非常重要的元素,它主要用于动态SQL语句的构建,尤其是在处理集合数据类型如List、Array、Map时。`<foreach>`标签的使用可以极大地提高代码的可读性和可维护性,避免了传统的字符...
此外,如果Java Bean的属性存在嵌套或者循环引用的情况,转换时需要特别处理,避免无限递归。 总结来说,`MapUtils`和`BeanUtils`是Java开发中处理数据转换的重要工具,它们极大地简化了Map与Bean之间的转换操作,...
在实际项目中,MyBatis常与Spring框架结合使用,通过Spring的DataSourceTransactionManager和MyBatis的SqlSessionFactoryBean,可以实现事务管理和数据源的管理。 通过深入学习这个"MyBatis学习实例",你将能熟练...
总的来说,"mybatis3文档"是学习和掌握MyBatis3不可或缺的资源,它涵盖了从基础配置到高级特性的全方位内容,旨在帮助开发者充分发挥MyBatis3的潜力,实现高效、灵活的数据库操作。通过仔细阅读和实践,开发者可以...
6. **参数映射(Parameter Mapping)**:MyBatis支持简单的参数映射,如传入单个参数,也支持复杂参数映射,如使用`@Param`注解或使用Map作为参数。 7. **动态SQL**:MyBatis的动态SQL功能强大,可以在XML映射文件...
通过"Java MyBatis - 实践学习案例.zip"中的示例,你可以逐步了解并掌握如何创建Mapper接口和XML映射文件,如何在Service层调用Mapper方法,以及如何配置和使用MyBatis的全局配置文件。这些实例将帮助你理解MyBatis...
MyBatis 支持强大的动态SQL,可以在XML映射文件或注解中使用条件语句、foreach循环等,根据业务需求动态构建SQL,避免了大量的硬编码。 4. **参数映射**: MyBatis 提供了多种方式处理参数,如简单类型、Map、...
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java Web开发中,MyBatis常被用来替代传统的JDBC,以简化数据库操作,提高开发效率。以下是对36道MyBatis面试题的详细解答,旨在帮助你...
### MyBatis学习笔记知识点概览 #### 1. MyBatis入门 ##### 1.1 单独使用JDBC编程问题总结 ...以上是基于提供的文件内容总结出的关键知识点,涉及MyBatis的基本概念、核心功能、使用技巧及与其他框架的整合等方面。
使用`<foreach>`标签,可以在SQL语句中方便地进行嵌套循环,例如在IN查询中遍历集合。 9. **自定义插件**: MyBatis允许用户自定义拦截器插件,可以全局拦截SQL执行,实现统计、日志等功能。 10. **事务管理**:...
- 或者使用MyBatis提供的`foreach`标签进行循环插入。 13. **获取主键值**: - 可以通过`useGeneratedKeys`和`keyProperty`属性配置来自动生成主键值。 14. **多参数传递**: - 可以使用`@Param`注解对参数进行...
4. **跳出多重嵌套循环**: - 跳出多重循环可以使用带标签的`break`语句,定义一个外部循环的标签,然后在内层循环中使用`break label;`。另一种常见做法是通过改变外部循环的条件使其提前终止。 5. **`switch`...
- 分支嵌套与循环嵌套 - **数组** - 数组的概念与用途 - 数组的声明与初始化 - 数组的操作:遍历、排序等 - **面向对象** - 面向对象的基本概念:封装、继承、多态 - 类与对象 - 构造方法与析构方法 - 继承...
- 循环结构(for、while、do-while)用于重复执行一段代码,面试时可能会遇到编写嵌套循环或优化循环效率的问题。 3. **函数与方法** - 方法是实现功能的代码块,可以接受参数并返回结果。面试中,理解方法签名、...
Java是一种广泛使用的高级编程语言,以其平台独立性著称,能够在任何支持Java的平台上运行而无需重新编译。Java语言的设计原则是“一次编写,到处运行”(Write Once, Run Anywhere, WORA),这得益于Java虚拟机...
本学习资料旨在帮助你对 Ibatis 进行初步的入门学习,了解其基本概念、配置及使用方法。 1. **Ibatis 概述** - Ibatis 是由 Clinton Begin 创建的一个轻量级的 Java ORM(对象关系映射)框架。 - 它不同于 ...
4. 流程控制:if语句、switch语句、循环(for、while、do-while)的使用及其嵌套。 5. 数组:理解数组的声明、初始化、遍历,以及多维数组的应用。 二、面向对象 1. 类与对象:理解类的定义、对象的创建及销毁。 2....
- **代码层面:** 优化算法、减少循环嵌套、字符串操作优化。 - **系统层面:** JVM调优、数据库调优、分布式系统性能调优技巧。 - **网络层面:** 减少HTTP请求次数、利用CDN、压缩数据传输。 #### 10. 测试和调试...
5. **递归映射**:能够处理嵌套对象和递归结构的映射,无需担心循环引用问题。 6. **差异化**:提供对象间的差异比较,可以用于数据分析、版本控制或数据同步。 7. **性能优化**:设计时考虑了性能因素,确保在大...
MySQL 是最常用的开源关系型数据库之一,了解它的使用方法和优化技巧对于开发者来说非常重要: - **SQL语言**:SQL 查询语句的编写。 - **SQL调优**:查询优化和索引管理。 - **鉴权**:用户身份验证。 - **数据...