Mybatis中注解@MapKey的使用详解
作者:mrr 发布时间:2023-11-24 21:43:35
mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/。
在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型。
这时候我们就可以使用这个注解了
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MapKey {
String value();
}
很明显,这个注解是作用在方法上面的,具体的用法就是设置外面Map的KEY是什么。这样我们就能够查询出非常复杂的结果,而不用在建立一个新的实体.
PS:下面看下MyBatis使用@MapKey注解接收多个查询记录到Map中,以便方便地用get()方法获取字段的值
需求场景:
批量从数据库查出若干条数据,包括id和name两个字段。希望可以把结果直接用Map接收,然后通过map.get(id)方便地获取name的值。
问题:
如果使用下面的代码,则如果查询结果是多条就会报错,因为MyBatis是把结果以("id":123)、("name":"Jack")的形式保存在Map中的。所以如果返回结果一条包括了id和name的记录就没问题;如果返回多条记录,即有多个("id":123)、("id":124),则MyBatis就傻掉不知如何处理了。
Map<String, Object> m = abcDao.getNamesByIds(idList);
解决的方法是在外面再用一个Map:
Map<Integer, Map<String, Object>> m = abcDao.getNamesByIds(idList);
然后,在这个dao的方法上面加一个注解:
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 根据多个id批量获取名称
<span style="white-space:pre"> </span> * @param list 包含有Map key="id"的list
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>@MapKey("id")
<span style="white-space:pre"> </span>public Map<Integer, Map<String, Object>> getNamesByIds(List<Map<String, Object>> list);
这个注解表示最外层Map的key为查询结果中字段名为“id”的值。
Mapper.xml中的配置如下:
<select id="getNamesByIds" resultType="java.util.Map">
SELECT id, name FROM tb_abc WHERE id IN
<foreach item="item" collection="list" open="(" separator="," close=")">
#{item.id}
</foreach>
</select>
以上所述是小编给大家介绍的Mybatis中注解@MapKey的使用详解,希望对大家有所帮助。


猜你喜欢
- 前言AQS 绝对是JUC的重要基石,也是面试中经常被问到的,所以我们要搞清楚这个AQS到底是什么?骑工作原理是什么?AQS是什么?AQS,A
- 该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能。而.ne
- 写项目时,要求仿微信朋友圈,双击顶栏置顶,于是封装了双击回调接口,方便大家拿来就用/** * Created by Administrato
- 注解是 JDK 5.0 引入的一种注释机制。注解可以作用在类型(类、接口、枚举等)、属性、方法、参数等不同位置,具体的 JDK
- 一、JNDI是什么?JNDI--Java 命名和目录接口(Java Naming and Directory Interface),是一组在
- 目标多级表头、分页、动态数据实现依赖<!-- poi工具类--> &nbs
- 教你一步一步用 java 设计生成二维码在物联网的时代,二维码是个很重要的东西了,现在无论什么东西都要搞个二维码标志,唯恐落伍,就差人没有用
- 使用adb or fastboot命令进入高通的9008(edl)模式已经有人写过了,下面两种是其中之一,我再加一个如题,两种方法1. ad
- 在jdk文档中对RandomAccess接口的定义如下: public interface RandomAccess下面是jdk
- 1. 为什么使用线程池诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小
- 引言使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。当然,验证用户输入在大多
- 调用和回调机制在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种:1.同步调用同步调用是最基本并且最简
- 项目中需要webview重定向,但是由于一个webveiw里面有许多加载操作,因此在调用webview。goback()方法时,往往达不到我
- 目录前言闲扯使用技术所需知识储备实现步骤总结前言现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,
- 本文实例讲述了C#使用默认浏览器打开网页的方法。分享给大家供大家参考。具体实现方法如下:public static bool OpenBro
- 先略看题目:1 请简述async函数的编译方式2 请简述Task状态机的实现和工作机制3 请简述awai
- 如下所示:import java.security.MessageDigest;import java.security.NoSuchAlg
- 1. json数据类型类型描述Number数字型String字符串型Boolean布尔型Array数组Object对象null空值(1)js
- 先准备好一个新闻实体类package com.zb.fragmentbestpractice/** * title:表示新闻的实体类 * c
- 引言 基于生成图片实现了一个手机号转图片的需求。 内容也很简单,直接