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查询数据装配成键值对内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java随机生成10位数的字符串ID

    java随机生成10位数的字符串ID

    这篇文章主要为大家详细介绍了java随机生成10位数字符串ID的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java Spring boot实现生成二维码

    Java Spring boot实现生成二维码

    大家好,本篇文章主要讲的是Java Spring boot实现生成二维码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Java如何为 PPT 中的图形添加阴影效果

    Java如何为 PPT 中的图形添加阴影效果

    这篇文章主要介绍了Java如何为 PPT 中的图形添加阴影效果,帮助大家更好的利用java处理图像,感兴趣的朋友可以了解下
    2020-09-09
  • springboot中使用redis由浅入深解析

    springboot中使用redis由浅入深解析

    这篇文章主要由浅入深为大家介绍了springboot中使用redis的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • LeetCode程序员面试题之递归乘法

    LeetCode程序员面试题之递归乘法

    在Java中,递归乘法是一种简单而有效的方法,可以用来计算两个数字的乘积。它的基本思想是:如果第一个数字是0,则乘积为0;如果第一个数字是1,则乘积为第二个数字;其他情况,则通过将第一个数字减1,并将第二个数字与自身相乘,来实现递归乘法。
    2023-02-02
  • Spring中的@ConditionalOnProperty注解使用详解

    Spring中的@ConditionalOnProperty注解使用详解

    这篇文章主要介绍了Spring中的@ConditionalOnProperty注解使用详解,在 spring boot 中有时候需要控制配置类是否生效,可以使用 @ConditionalOnProperty 注解来控制 @Configuration 是否生效,需要的朋友可以参考下
    2024-01-01
  • 解析Java实现设计模式六大原则之里氏替换原则

    解析Java实现设计模式六大原则之里氏替换原则

    里氏替换原则是用来帮助我们在继承关系中进行父子类的设计。它阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。它是继承复用的基础,反映了基类与子类之间的关系,是对开闭原则的补充,对实现抽象化具体步骤的规范
    2021-06-06
  • 基于dubbo中Listener的实现方法

    基于dubbo中Listener的实现方法

    下面小编就为大家带来一篇基于dubbo中Listener的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 详解Springboot如何优雅的进行数据校验

    详解Springboot如何优雅的进行数据校验

    基于 Spring Boot ,如何“优雅”的进行数据校验呢,本文将待大家详细介绍Springboot如何优雅的进行数据校验,文中有详细的代码示例和流程步骤,需要的朋友可以参考下
    2023-06-06
  • 详解Spring bean的注解注入之@Autowired的原理及使用

    详解Spring bean的注解注入之@Autowired的原理及使用

    之前讲过bean注入是什么,也使用了xml的配置文件进行bean注入,这也是Spring的最原始的注入方式(xml注入).本文主要讲解的注解有以下几个:@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以参考下
    2021-06-06

最新评论