предисловие
- Предыдущая статья просто описывает шесть ключевых компонентов 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
Началось. Вот некоторые из его методов: -
Как видно из отметок на вышеупомянутой картинке, первым, кто выносит брунтат
构造方法
; так как это анализ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, пока вы найдете важные компоненты, такие как препроцессоры, постпроцессоры, триггеры событий и т. д., все будет решено без труда.
- Если вы считаете, что автор написал хорошо и что-то понял, вы можете обратить внимание на то, чтобы поделиться волной и следить за более интересными обновлениями контента.