iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis将查询出的两列数据装配成键值对的操作方法
  • 150
分享到

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

MyBatis查询数据装配成键值对MyBatis查询数据键值对 2022-11-13 14:11:47 150人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录描述:操作:1. 实现 ResultHandler 接口2. 对应 DAO 层3. 使用描述: mybatis 直接查询出的格式是 List 套 Map 的结构,当然利用 Str

描述:

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

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

操作:

1. 实现 ResultHandler 接口


@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"));
    }
    
    
    public HashMap getMapResults() {
        return mapResults;
    }

    
    public MapResultHandler(String key, String value) {
        this.key = key;
        this.value = value;
    }

    
    public MapResultHandler() {
    }

}

2. 对应 DAO 层

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

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

 
    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 的实现也应该是有对应实现。


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

--结束END--

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

本文链接: https://www.lsjlt.com/news/172108.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作