Java MyBatis返回两个字段作为Map的key和value

该文章已生成可运行项目,

使用 MyBatis 时,可能会遇到这种情况:只查询两个字段,需要返回一个 Map,其中第一个字段作为 key,第二个字段作为 value。

这种查询在某些场景非常好用,比如查询字典,查询出的 key 和 value 就是字典的 value 和 label,利用 HashMap 的 get 方法时间复杂度为 O(1) 的特点,可以实现字典的快速映射。

此时的写法是有讲究的:

  • 直接返回 Map:当数据量超过 1 时,会报错。因为此时将 Map 作为一个对象,一个对象不能存储多个内容。
  • 加上 <font style="color:rgb(77, 77, 77);">@MapKey</font>注解:需要指定返回的哪个字段作为 key。虽然能生成 Map,但其中的 value 是一个对象,不是直接值,与预期不符。

要达到预期的返回值,需要使用 MyBatis 提供的 ResultHandler 结果处理器。

  1. 自定义一个 Map 结果处理器 <font style="color:#080808;background-color:#ffffff;">MapResultHandler</font>
public class MapResultHandler<K,V> implements ResultHandler<Map<K,V>> {
    
    private final Map<K,V> mappedResults = new HashMap<>();

    @Override
    public void handleResult(ResultContext context) {
        Map map = (Map) context.getResultObject();
        mappedResults.put((K)map.get("key"), (V)map.get("value"));
    }

    public Map<K,V> getMappedResults() {
        return mappedResults;
    }
}
  1. 编写 Mapper.java
void selectMap(MapResultHandler<String, String> mapResultHandler);
如果要传参,在前面指定即可,比如:
void selectMap(@Param("type") String type, MapResultHandler<String, String> mapResultHandler);
  1. 编写 Mapper.xml
<resultMap id="mapResult" type="java.util.HashMap">
    <result property="key" column="value"/>
    <result property="value" column="label"/>
</resultMap>

<select id="selectMap" resultMap="mapResult">
    SELECT
        t1.`value`,
        t1.`label`
    FROM
        sys_dict t1
    WHERE
        t1.`type` = #{type}
        AND t1.`del_flag` = '0'
</select>
  1. 调用
MapResultHandler<String, String> resultHandler = new MapResultHandler<>();
baseMapper.selectMapByLanguage(Global.getLanguage(), resultHandler);
Map<String, String> map = resultHandler.getMappedResults();

这样得到的 Map 就是将两个字段作为 Map 的 key 和 value 了。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天航星

感谢你的鼓励和认可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值