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;
      }
    }
  • 相关阅读:
    Tensorflow基础教程4:卷积神经网络(CNN)介绍
    Keras之 cifar10数据集使用keras generator读取、模型训练、预测
    Tensorflow基础教程3:基础示例:多层感知机(MLP)
    Tensorflow基础教程2:Tensorflow模型建立与训练
    Chaquopy中不能导入64位Python训练的机器学习模型
    (转)使用SDWebImage和YYImage下载高分辨率图,导致内存暴增的解决办法
    C/C++ 递归与结束递归
    C/C++ 读取文件16进制格式
    C/C++ 打开外部程序
    C/C++ 遍历托盘图标
  • 原文地址:https://www.cnblogs.com/chanedi/p/4054219.html
Copyright © 2011-2022 走看看