zoukankan      html  css  js  c++  java
  • Mybatis的cache

    相关类:org.apache.ibatis.executor.CachingExecutor

    相关代码:

      public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
        BoundSql boundSql = ms.getBoundSql(parameterObject);
        CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
        return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
      }

    从CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);可以看出,当下列四个元素相同时会使用cache:

    MappedStatement(一般为xml中定义)、parameterObject(传递给xml的参数)、rowBounds(分页参数)、boundSql(最终sql,由MappedStatement和parameterObject决定)

    createCacheKey的代码:

      public CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql) {
        if (closed) throw new ExecutorException("Executor was closed.");
        CacheKey cacheKey = new CacheKey();
        cacheKey.update(ms.getId());
        cacheKey.update(rowBounds.getOffset());
        cacheKey.update(rowBounds.getLimit());
        cacheKey.update(boundSql.getSql());
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        if (parameterMappings.size() > 0 && parameterObject != null) {
          TypeHandlerRegistry typeHandlerRegistry = ms.getConfiguration().getTypeHandlerRegistry();
          if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            cacheKey.update(parameterObject);
          } else {
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            for (ParameterMapping parameterMapping : parameterMappings) {
              String propertyName = parameterMapping.getProperty();
              if (metaObject.hasGetter(propertyName)) {
                cacheKey.update(metaObject.getValue(propertyName));
              } else if (boundSql.hasAdditionalParameter(propertyName)) {
                cacheKey.update(boundSql.getAdditionalParameter(propertyName));
              }
            }
          }
        }
        return cacheKey;
      }
  • 相关阅读:
    ES6新特性
    浏览器兼容问题
    跨域
    箭头函数与普通函数的区别
    单页面应用
    vue试题
    Git 常用命令
    【分享代码】一个笨办法获取容器的剩余内存
    【笔记】thanos receiver的router模式
    【分享】让prometheus支持PUSH模式,可以使用remote write协议推送数据
  • 原文地址:https://www.cnblogs.com/chanedi/p/4009059.html
Copyright © 2011-2022 走看看