Mybatis查询保存到map中的一些知识点

map

Map 提供了一个通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
Map底层是哈希表,哈希表的结构主要是hashCode+数组,通过hashCode对数组长度取余获得每个key的位置,由于这种存储方式,造成了map存储的key的无序性。

mybatis查询存入map

List<Map<String, Object>> list = userService.selectBySql("* from user");
<select id="selectBySql" resultType="java.util.Map">
	select ${querySql}
</select>

数据库中的数据如下:
图片1.png
遍历数据如下:
图片2.png

jdbcTemplate查询存入map

List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");

遍历数据如下:
图片3.png

原因

同样是使用map进行存储,一个有序一个无序,我们打印class后可以发现。
Mybatis使用的实现类为class java.util.HashMap。
图片4.png
jdbcTemplate使用的实现类为LinkedCaseInsensitiveMap。
图片5.png
HashMap是无序的,而LinkedCaseInsensitiveMap是有序的。

结论

当我们使用map进行存储时,想要使数据保持有序,我们可以使用有序的map实现类。
如LinkedHashMap、TreeMap、LinkedCaseInsensitiveMap等。

原文地址:TT的博客《Mybatis查询保存到map中的一些知识点》
<think>好的,我现在需要回答用户关于MyBatis如何通过XML配置将查询结果集映射到Map中的问题。首先,我需要回顾一下MyBatis的结果映射机制,特别是涉及Map的部分。用户提到了引用中的内容,特别是引用[2]和引用[3],其中提到可以通过返回Map来避免手动映射字段,这在多表查询时很有用。 首先,我应该确认MyBatis支持哪些方式将结果映射到Map。根据引用[2],有三种使用方式,可能包括直接返回Map、使用@MapKey注解或者在XML中配置。但用户的问题是关于XML配置的,所以需要集中在XML的方法上。 接下来,我需要回忆MyBatis的XML映射文件中如何使用resultType或resultMap来指定Map类型。根据知识,当使用resultType="java.util.Map"时,MyBatis会自动将每一行的列名作为键,列值作为值,形成一个Map。然后,如果查询返回多行,每个Map对应一行,最后所有Map组成一个List。这可能就是其中一种方法。 另外,引用[3]提到@ResultMap是注解版的,但用户问的是XML配置,所以可能不需要涉及注解部分。但需要确保在XML中是否有类似注解中的配置方式,比如使用<resultMap>标签,但类型是Map的情况。 此外,用户可能还需要知道如何处理复杂的键,例如使用@MapKey注解指定某个列作为Map的键,这样返回的就不是List<Map>,而是一个Map,其中键是某个字段的值。但这是在接口方法中使用注解,可能属于另一种方式,但用户的问题是关于XML配置,所以需要确认是否可以在XML中实现这一点,或者是否需要结合注解。 可能的步骤: 1. 在<select>标签中设置resultType为map,这样每行记录转换为一个Map。 2. 如果需要指定特定的Map类型(如LinkedHashMap),可以使用resultType="java.util.LinkedHashMap"。 3. 对于将多行结果转换为一个以某字段为键的Map,可能需要结合@MapKey注解,但这可能属于接口方法配置,而非纯XML配置。 4. 检查是否需要使用<resultMap>来更详细地配置Map的映射,尽管通常resultMap用于映射到JavaBean,但可能也可以用于Map的结构。 需要验证这些步骤的正确性,例如,当使用resultType="map"时,MyBatis默认会使用列名作为键,不区分大小写,但数据库通常返回大写字母,而MyBatis会转换为小写?或者保持原样?可能需要说明如何处理列名别名的情况,例如在SQL中使用AS来指定别名,这样Map中的键就是别名。 此外,引用[2]提到可以返回Map对象,字段不需要手动定义,说明当使用resultType="map"时,MyBatis会自动处理,无需额外配置<resultMap>。这可能适用于简单的查询,但如果涉及到复杂的关联查询,可能需要更详细的配置。 总结回答的结构: 1. 直接使用resultType="map"实现自动映射到List<Map>。 2. 使用@MapKey注解配合XML配置,实现以某列值为键的Map结构。 3. 处理列名别名和大小写问题。 4. 示例代码演示XML中的配置和对应的Java接口方法。 5. 注意事项,如无法使用自动映射时的处理,或者性能方面的考虑。 需要确保示例正确,例如,在XML中编写一个<select>语句,设置resultType为map,并在Java接口中返回List<Map<String, Object>>或者使用@MapKey返回Map<KeyType, Map<String, Object>>。 可能的问题点:是否纯XML配置就能实现返回Map,还是需要结合注解。根据引用[2],提到在MyBatis中返回Map有三种方式,可能包括XML中的resultType设置,以及接口方法中的注解。因此,用户的问题可能涉及如何在XML中配置查询,使得结果映射到Map,这可能指的是每个记录作为一个Map,而整个结果作为List<Map>,或者整个结果作为一个Map,其中键由某个字段决定。 因此,在回答中需要区分这两种情况:返回多行记录作为List<Map>,或者返回单行记录作为Map,或者将多行记录转换为一个以某字段为键的Map结构。用户的问题可能指的是前者,但需要明确。 根据MyBatis文档,当使用List<Map<String, Object>>作为返回类型时,每个Map对应一行。而如果希望整个结果集作为一个Map,其中键是某个列的值,值是对应的行数据,这需要在接口方法上使用@MapKey注解指定键的列。例如: @MapKey("id") Map<Integer, User> getUserMap(); 这种情况下,即使XML中的resultType是User,但返回的是Map。但用户的问题是针对XML配置,所以可能需要说明如何在XML中配置select语句,并配合接口方法的返回类型来达到返回Map的效果。 因此,回答的结构应该包括: 1. 基本方法:使用resultType="map"返回List<Map<String, Object>> 2. 使用@MapKey注解返回Map<KeyType, Map<String, Object>> 3. 处理列名和别名的注意事项 4. 示例代码 同时,需要引用相关的引用资料,如引用[2]提到返回Map的三种方式,其中XML配置是其中之一,可能包括设置resultType为map。引用[3]提到结果集映射到map,但可能更多是注解方式,不过用户的问题是关于XML的,所以重点放在XML配置部分。 最后,生成相关问题,可能涉及性能、优化、其他映射方式等。</think>在MyBatis中通过XML配置将查询结果映射到`Map`,可通过以下方法实现: --- ### 1. **基础映射:自动映射到`List<Map>`** 在`<select>`标签中直接设置`resultType="map"`,MyBatis会将每行记录转换为一个`Map`对象,列名作为键(不区分大小写),列值作为值。多行结果会封装为`List<Map<String, Object>>`。 **XML配置示例**: ```xml <select id="selectUsersAsMap" resultType="map"> SELECT id, name, age FROM user </select> ``` **Java接口定义**: ```java List<Map<String, Object>> selectUsersAsMap(); ``` --- ### 2. **指定Map键:结合`@MapKey`注解** 若需要将多行结果转换为**单个`Map`**(键为某列值,值为行数据),需在接口方法使用`@MapKey`注解指定键字段,XML中仍用`resultType="map"`。 **XML配置**: ```xml <select id="selectUsersAsKeyedMap" resultType="map"> SELECT id, name, age FROM user </select> ``` **Java接口**: ```java @MapKey("id") // 将id列的值作为Map的键 Map<Integer, Map<String, Object>> selectUsersAsKeyedMap(); ``` --- ### 3. **处理列名别名** 若SQL查询使用别名(如`AS`),`Map`中的键会与别名一致。例如: ```xml <select id="selectWithAlias" resultType="map"> SELECT id AS userId, name AS userName FROM user </select> ``` 结果`Map`的键为`userId`、`userName`。 --- ### 4. **复杂场景:手动定义`<resultMap>`** 虽然`resultType="map"`可自动映射,但在多表联查或需要明确列类型时,可通过`<resultMap>`精细化配置: ```xml <resultMap id="userMap" type="java.util.LinkedHashMap"> <result column="id" property="id" javaType="java.lang.Integer"/> <result column="name" property="name" javaType="java.lang.String"/> </resultMap> <select id="selectWithResultMap" resultMap="userMap"> SELECT id, name FROM user </select> ``` --- ### **注意事项** - **性能**:自动映射`Map`适合简单查询,但频繁操作`Map`的键值可能降低代码可读性和维护性[^2]。 - **大小写敏感**:数据库返回的列名默认转为大写,建议在SQL中使用别名统一命名风格[^3]。 - **类型安全**:`Map`无法像JavaBean一样提供编译时类型检查,需谨慎处理值类型转换。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值