zoukankan      html  css  js  c++  java
  • mybatis源码追踪2——将结果集映射为map

    org.apache.ibatis.binding.MapperMethod中execute方法

    ...
    } else if (method.returnsMap()) { result = executeForMap(sqlSession, args); } else {
    ...
      private <K, V> Map<K, V> executeForMap(SqlSession sqlSession, Object[] args) {
        Map<K, V> result;
        Object param = method.convertArgsToSqlCommandParam(args);
        if (method.hasRowBounds()) {
          RowBounds rowBounds = method.extractRowBounds(args);
          result = sqlSession.<K, V>selectMap(command.getName(), param, method.getMapKey(), rowBounds);
        } else {
          result = sqlSession.<K, V>selectMap(command.getName(), param, method.getMapKey());
        }
        return result;
      }

    映射为map时有个可自定义的参数:mapkey

        private String getMapKey(Method method) {
          String mapKey = null;
          if (Map.class.isAssignableFrom(method.getReturnType())) {
            final MapKey mapKeyAnnotation = method.getAnnotation(MapKey.class);
            if (mapKeyAnnotation != null) {
              mapKey = mapKeyAnnotation.value();
            }
          }
          return mapKey;
        }

    通过org.apache.ibatis.annotations.MapKey可以配置该参数,该参数应与sql中select的字段一致且为大写。

    最终的resultHandler:

    public class DefaultMapResultHandler<K, V> implements ResultHandler {
    
      private final Map<K, V> mappedResults;
      private final String mapKey;
      private final ObjectFactory objectFactory;
      private final ObjectWrapperFactory objectWrapperFactory;
    
      @SuppressWarnings("unchecked")
      public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
        this.objectFactory = objectFactory;
        this.objectWrapperFactory = objectWrapperFactory;
        this.mappedResults = objectFactory.create(Map.class);
        this.mapKey = mapKey;
      }
    
      public void handleResult(ResultContext context) {
        // TODO is that assignment always true?
        final V value = (V) context.getResultObject();
        final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory);
        // TODO is that assignment always true?
        final K key = (K) mo.getValue(mapKey);
        mappedResults.put(key, value);
      }
    
      public Map<K, V> getMappedResults() {
        return mappedResults;
      }
    }
  • 相关阅读:
    delphi 调用百度地图api
    Delphi XE5 for android 图片缩放和拖动处理
    利用FMX控件的MakeScreenshot过程实现WAIT效果
    老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
    第01组 Alpha冲刺(5/6)
    2019 SDN上机第4次作业
    2019 SDN阅读作业
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
  • 原文地址:https://www.cnblogs.com/chanedi/p/4054219.html
Copyright © 2011-2022 走看看