MyBatis将查询出的两列数据装配成键值对的操作方法

 更新时间:2022年08月08日 15:07:08   作者:jackhb1999  
这篇文章主要介绍了MyBatis将查询出的两列数据装配成键值对的操作代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

描述:

MyBatis 直接查询出的格式是 List 套 Map 的结构,当然利用 Stream 流进行转换也非常便捷,但如果这样的操作很多的话,不如利用 MyBatis 提供的 ResultHandler 接口进行实现,做成工具类使用。

此外,如果用 MyBatis 提供的 @MapKey ,也只是对应值有冗余,因为 MapKey取一个字段为键,取出的所有字段为值。

操作:

1. 实现 ResultHandler 接口

/**
 * 用于MyBatis查询库表中两列映射为键值对
 */
@Component
public class MapResultHandler implements ResultHandler {

    private final HashMap mapResults = new HashMap<String,String>();

    private String key;

    private String value;

    @Override
    public void handleResult(ResultContext resultContext) {
        HashMap map = (HashMap)resultContext.getResultObject();
        mapResults.put(map.get("key"), map.get("value"));
    }
    
    /**
     * 返回映射
     * @return 结果
     */
    public HashMap getMapResults() {
        return mapResults;
    }

    /**
     * @param key key
     * @param value value
     */
    public MapResultHandler(String key, String value) {
        this.key = key;
        this.value = value;
    }

    /**
     * 空构造
     */
    public MapResultHandler() {
    }

}

2. 对应 DAO 层

对应 mapper 查询接口中,在查询的方法里将 ResultHandler 实现类(MapResultHandler)以参数形式传入。

由于使用实现类拿取装配好的Map,此处的返回类型为 void 。

 /**
     * 提取<图片名,创建时间>的Map,对应创建时间进行处理
     * @param imageLength 上传图片的个数
     * @return
     */
    void selectImageNameAndCreatetime(MapResultHandler mapResultHandler, int imageLength);

对应 xml 文件中,定义返回类型为 map 。

其中注意给我们需要的键值取别名,对应别名与 ResultHandler 实现类(MapResultHandler)中定义的相对应,这样在ResultHandler 实现类(MapResultHandler)中 map.get() 才能取到。

<select id="selectImageNameAndCreatetime" resultType="map">
    select name as 'key',time as 'value' from house_pic_info order by id desc limit #{imageLength}
</select>

3. 使用

先实例化 ResultHandler 实现类(MapResultHandler),作为参数传入。

取 Map 时依然从 ResultHandler 实现类(MapResultHandler)中取。

MapResultHandler handler = new MapResultHandler();
housePicInfoMapper.selectImageNameAndCreatetime(handler, length);
Map imageMap = handler.getMapResults();

思考:对应 ResultHandler 接口只需实现一个 handleResult 方法,在 MyBatis 中 @MapKey 的实现也应该是有对应实现。

/**
 * MyBatis 中 DefaultMapResultHandler 实现
 * @author Clinton Begin
 */
public class DefaultMapResultHandler<K, V> implements ResultHandler<V> {

  private final Map<K, V> mappedResults;
  private final String mapKey;
  private final ObjectFactory objectFactory;
  private final ObjectWrapperFactory objectWrapperFactory;
  private final ReflectorFactory reflectorFactory;

  @SuppressWarnings("unchecked")
  public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;
    this.reflectorFactory = reflectorFactory;
    this.mappedResults = objectFactory.create(Map.class);
    this.mapKey = mapKey;
  }

  @Override
  public void handleResult(ResultContext<? extends V> context) {
    final V value = context.getResultObject();
    final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
    // TODO is that assignment always true?
    final K key = (K) mo.getValue(mapKey);
    mappedResults.put(key, value);
  }

  public Map<K, V> getMappedResults() {
    return mappedResults;
  }
}

到此这篇关于MyBatis将查询出的两列数据装配成键值对的文章就介绍到这了,更多相关MyBatis查询数据装配成键值对内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解spring如何使用注解开发

    详解spring如何使用注解开发

    今天给大家整理了spring如何使用注解开发这篇文章,文中有非常详细的介绍及代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • java基础实现猜数字小游戏

    java基础实现猜数字小游戏

    这篇文章主要为大家详细介绍了java基础实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 一文盘点五种最常用的Java加密算法

    一文盘点五种最常用的Java加密算法

    大家平时的工作中,可能也在很多地方用到了加密、解密,比如:支付功能等,所以本文为大家盘点了Java中五个常用的加密算法,希望对大家有所帮助
    2023-06-06
  • Netty分布式抽象编码器MessageToByteEncoder逻辑分析

    Netty分布式抽象编码器MessageToByteEncoder逻辑分析

    这篇文章主要介绍了Netty分布式抽象编码器MessageToByteEncoder的抽象逻辑分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 如何用ObjectMapper将复杂Map转换为实体类

    如何用ObjectMapper将复杂Map转换为实体类

    这篇文章主要介绍了如何用ObjectMapper将复杂Map转换为实体类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • RestTemplate get请求携带headers自动拼接参数方式

    RestTemplate get请求携带headers自动拼接参数方式

    这篇文章主要介绍了RestTemplate get请求携带headers自动拼接参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • springboot+vue实现七牛云头像的上传

    springboot+vue实现七牛云头像的上传

    本文将介绍如何在Spring Boot项目中利用七牛云进行图片上传并将图片存储在云存储中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • springboot设置加载静态资源的路径(spring.resources.static-locations)

    springboot设置加载静态资源的路径(spring.resources.static-locations)

    这篇文章主要介绍了springboot设置加载静态资源的路径方式(spring.resources.static-locations),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Mybatis-Plus自定义集合类型的类型处理器详解

    Mybatis-Plus自定义集合类型的类型处理器详解

    这篇文章主要介绍了Mybatis-Plus自定义集合类型的类型处理器详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 新手了解java 泛型基础知识

    新手了解java 泛型基础知识

    这篇文章主要给大家介绍了关于Java中泛型使用的简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-07-07

最新评论