Mybatis, как читать исходный код, научит вас трюку! ! !

Java

предисловие

  • Предыдущая статья просто описывает шесть ключевых компонентов Mybatis, на шесть фехтовальщиков приходится половина, и шесть из фехтовальщиков Mybatis на основе друзей, то Mybatis предрешен. Шесть фехтовальщиков заинтересовали друзей, вы можете ознакомиться с этой статьей:Раздел анализа исходного кода Mybatis 6 меч
  • Некоторые новички могут бояться читать исходный код и не знать, как читать исходный код.Вместо того, чтобы писать исходный код Mybatis в соответствии с моими собственными идеями в статье, сколько вы можете понять? Лучше научить вас думать, чтобы вы сами научились читать исходный код.

Конфигурация среды

  • Все в этой статье основано наMybatis3.5иSpringBoot-2.3.3.RELEASE.

Когда начать?

  • Я все-таки хочу рассказать об истории Шести мушкетеров.Поскольку это важная составляющая Мибатиса, то, конечно же, надо начать с Шести мушкетеров.Следуя картинке из предыдущей статьи, эта картинка фиксирует последовательность исполнения Шесть мушкетеров, а именно:六剑客执行流程图

  • Нельзя забывать самый важный момент при чтении исходного кода, то есть открыватьDEBUGШаблоны, важные методы отмечены точками останова, а важные операторы отмечены точками останова.Нетрудно сначала понять все, а затем изучить детали.

  • Ниже приведен запрос Myabtis.selectList()Разберем, как читать его подробно.

Общее понимание Шести мушкетеров

  • Начиная с Шести мушкетеров, так как это важный компонент, процесс выполнения исходного кода должен вращаться вокруг Шести мушкетеров.Давайте проанализируем Шесть мушкетеров один за другим и как прерывать точки.

  • Следующее просто научит вас прерывать тему, и я не буду рассказывать, что такое Шесть мушкетеров, пожалуйста, прочитайте предыдущую статью.

SqlSession

  • Поскольку это интерфейс, он не должен прерываться на интерфейсном методе.Существуют два класса реализации, описанные выше, а именноDefaultSqlSession,SqlSessionTemplate. Итак, какой из них SpringBoot вводит во время инициализации? Это зависит от класса автоматической настройки лаунчера Mybatis, который имеет следующий фрагмент кода:
  //如果容器中没有SqlSessionTemplate这个Bean,则注入
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
      return new SqlSessionTemplate(sqlSessionFactory);
    }
  }
  • Как видно из приведенного выше кода, SpringBoot внедряется при запуске.SqlSessionTemplate, то должно бытьSqlSessionTemplateНачалось. Вот некоторые из его методов:SqlSessionTemplate方法

  • Как видно из отметок на вышеупомянутой картинке, первым, кто выносит брунтат构造方法; так как это анализselectList()Процесс запроса, конечно, всеselectList()Метод вот-вот достигнет точки останова; в последней статье также говорилось, что интерфейс Mapper в конечном итоге является экземпляром, сгенерированным динамическим прокси, так что здесьgetMapper()Также попал в точку останова.

  • Для новичков достаточно трех вышеуказанных брейкпоинтов, но если присмотретьсяselectList()Методы, как показано ниже:

  @Override
  public <E> List<E> selectList(String statement) {
    //此处的sqlSessionProxy是什么,也是SqlSession类型的,此处断点运行到这里可以知道,就是DefaultSqlSession实例
    return this.sqlSessionProxy.selectList(statement);
  }
  • sqlSessionProxyЧто есть, неважно, об этом нельзя полагаться на догадки, значит пора идти ломать волну, пошлаselectList()Внутри метода, как показано ниже:
  • Как видно из приведенного выше рисунка, на самом деле этоDefaultSqlSession. О, я вижу, получается, что SqlSessionTemplate его выдалDefaultSqlSessionО, это слишком хитро.
  • DefaultSqlSessionИзлишне говорить, как перебить точку, просто сделайте это сами.

Executor

  • В приведенной выше статье речь идет о роли исполнительного механизма, а также говорится, что внутренний исполнитель основан на том, на чем основан исполнительный механизм. Это не будет описано снова здесь.

  • SpringBoot имеет свойство интегрировать различные фреймворки.Он неотделим от класса автоматической настройки.Некоторые действия по инициализации фреймворка в основном выполняются в классе автоматической конфигурации, поэтому мы ищем, куда вводить в классе конфигурации.ExecutorБин, поэтому я нашел следующий фрагмент кода:

  • Из приведенного выше кода вы можете узнать, что по умолчанию создаетсяCachingExecutor, исполнитель кеша второго уровня, не парься, смотри переписанныйExecutorкакие интерфейсы, сselectList()Связанный метод отмечен точкой останова, как показано ниже:

  • Также узнайте из приведенной выше картинки, какие методы иselectList()связанные, очевидноqueryВ этом смысл запроса, не беспокойтесь об этом, сначала нажмите на точку останова.

  • Взгляните повнимательнее сейчасquery()Как работает метод, о? Что было найдено, а именно:

@Override
  public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
      throws SQLException {
      //先尝试从缓存中获取
    Cache cache = ms.getCache();
    if (cache != null) {
      flushCacheIfRequired(ms);
      if (ms.isUseCache() && resultHandler == null) {
        ensureNoOutParams(ms, boundSql);
        @SuppressWarnings("unchecked")
        List<E> list = (List<E>) tcm.getObject(cache, key);
        if (list == null) {
          list = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
          tcm.putObject(cache, key, list); // issue #578 and #116
        }
        return list;
      }
    }
    //没有缓存,直接调用delegate的query方法
    return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
  }
  • Из приведенного выше кода мы знаем, что кеш есть, и он возвращается напрямую, кеша нет, а вызов осуществляется.delegateсерединаqueryметод, то этоdelegateЧто это за объект? Ссылаясь на метод анализа sqlSession, начинается отладка, вы можете знать, что этоSimpleExecutorнапример, как показано ниже:
  • НазадSimpleExecutorЯ не буду говорить о том, как перебить точку, попробуйте найти ее сами.

StatementHandler

  • Очень знакомый интерфейс, я столкнулся с подобными функциями выполнения операторов и установки параметров, когда изучал JDBC.
  • Этот интерфейс очень прост.Код, написанный большим парнем, может знать, что делает этот метод, когда вы видите имя метода, как показано ниже:
  • Какой самый важный класс реализации? конечноPreparedStatementHandlerТаким образом, вы можете поставить точку останова на соответствующий метод.

ParameterHandler

  • Этот интерфейс очень прост, не выбирайте его, всего есть два метода, один для установки и один для получения, в классе реализацииDefaultParameterHandlerПоставьте точку останова на соответствующий метод в .

TypeHandler

  • Обработчик типов также является простым интерфейсом, всего с «двумя» методами, один для настройки преобразования параметра, один для преобразования результата, ничего не говорите, найдите процессор, соответствующий типу параметра, самостоятельно, и прервите метод в этой точке.

ResultSetHandler

  • Обработчик результатов, отвечающий за обработку результата, всего три метода, один класс реализацииDefaultResultSetHandler, все точки останова расписания.

Суммировать

  • Лучше научить вас читать исходный код, чем учить человека ловить рыбу, а не учить его ловить рыбу Лучше научить вас читать исходный код, а не только читать исходный код Mybatis , но и читать исходный код любого фреймворка, например, исходный код Spring, пока вы найдете важные компоненты, такие как препроцессоры, постпроцессоры, триггеры событий и т. д., все будет решено без труда.
  • Если вы считаете, что автор написал хорошо и что-то понял, вы можете обратить внимание на то, чтобы поделиться волной и следить за более интересными обновлениями контента.