Чтобы подготовиться к золотой три серебряной четыре, ключевой принцип Mybatis имеет важное значение

Архитектура
Чтобы подготовиться к золотой три серебряной четыре, ключевой принцип Mybatis имеет важное значение

Подумайте об этом совместном использовании с вопросами

Во второй половине 2020 года компания организовала обмен основными принципами Mybatis.Освоение базового исходного кода может не только улучшить устранение проблем, но и извлечь уроки из его превосходного дизайна. Как раз к сезону интервью «Золото-три-серебро-четыре» вот следующие вопросы для справки.

  • Отношения между Mybatis и JDBC
  • Файлы .xml определяют, как анализируются операторы SQL.
  • Хранение и реализация интерфейса Mapper в Mybatis
  • Процесс выполнения Mybatis SQL
  • Как реализовать пейджинг в Mybatis

Этот общий контент основан на исходном коде Mybatis-3-3.4.x.

Постоянный слой

Что такое JDBC

JDBC (JavaDataBase Connectivity) — это соединение с базой данных Java.Манипулировать базой данных с помощью языка Java

Первоначально мы управляли базой данных через консоль или клиент, а JDBC использовал язык Java для отправки операторов SQL.

Принцип JDBC

Первоначально SUN хотела предоставить наборAPI для всех баз данных, но на практике оказывается, что это в принципе невыполнимая задача

потому что разные производителиРазница в базе данных слишком велика, поэтому SUN обсудила с поставщиками баз данных следующее:SUN предоставляет набор стандартных API для доступа к базам данных., и предоставить соответствующий стандарт протокола подключения к базе данных, а затем каждый производитель предоставляет набор интерфейсов API для доступа к своей собственной базе данных в соответствии со спецификацией.

Наконец: канонический API, предоставляемый корпорацией SUN, называетсяJDBC, интерфейс API базы данных, предоставляемый каждым производителем, называетсяводить машину

JDBC 架构图

Что такое Мибатис

Mybatis — отличный фреймворк ORM (уровень сохраняемости), написанный на языке Java.

Ранее известный как iBatis, проект Apache с открытым исходным кодом, он был перенесен в код Google в 2010 году и официально изменил свое название на Mybatis.

Уровень сохраняемости ORM относится к:Храните бизнес-данные на диске, а также имеет возможность длительного хранения.Пока диск не поврежден, если система выключена, данные все еще можно прочитать, перезапустив систему.

Отношения между Mybatis и JDBC

Прежде чем не будет инфраструктуры уровня сохраняемости, если вы хотите работать с базой данных в коде, вы должны работать через JDBC, Далее пример проиллюстрирует взаимосвязь между ними.

Операционная база данных JDBC

JDBC

Я считаю, что все использовали Mybatis в реальных проектах.Вы можете подумать, сделали ли мы следующее в нашей работе:

  • Вы загрузили драйвер базы данных?
  • Вы получили соединение с базой данных от драйвера?
  • Вы когда-нибудь создавали оператор, который выполняет SQL?
  • Вы сами преобразовываете результаты возврата базы данных в объекты Java?
  • Вы закрыли три объекта в блоке finally?

Увидев вышеупомянутую пытку души, вы можете ответить на первый вопрос, заданный на этот раз:

Mybatis инкапсулирует повторяющиеся операции в JDBC, расширяя и оптимизируя некоторые функции.

Описание ключевого слова Mybatis

📖 Если вы не касались контента, связанного с исходным кодом Mybatis, до прочтения статьи, рекомендуется несколько раз прочитать следующие термины, прежде чем читать дальше

SqlSession

ответственный за исполнениевыбрать, вставить, обновить, удалитьи другие команды, а также отвечает за получение картографов и управление транзакциями; его нижний уровень инкапсулирует взаимодействие с JDBC, который можно назвать одним из основных интерфейсов mybatis.

SqlSessionFactory

ответственный за созданиеSqlSessionОднажды созданная фабрика должна существовать до тех пор, пока работает приложение.Дополнительное создание не требуется

SqlSessionFactoryBuilder

Основная ответственность за созданиеSqlSessionFactoryкласс конструктора, который использует шаблон проектирования Builder; отвечает только за созданиеSqlSessionFactory

Configuration

Самый важный класс конфигурации Mybatis, ни один из них, не хранит большое количество конфигураций объектов, вы можете посмотреть исходный код, чтобы почувствовать это

MappedStatement

MappedStatement — это структура данных, в которой хранятся операторы SQL, а атрибуты класса преобразуются из тегов SQL в проанализированном XML-файле.

Executor

Объект SqlSession соответствует Executor, а объект Executor действует наCRUD-метода такжетранзакция, кешждать

ParameterHandler

в Мибатисеобработчик параметров, классовые отношения относительно просты

StatementHandler

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

ResultSetHandler

ResultSetHandler — это процессор, который Mybatis отвечает за синтаксический анализ возвращаемых данных JDBC и перенос их в соответствующую структуру данных в Java.

Interceptor

Interceptor — это интерфейс, определяющий общедоступные перехватчики в Mybatis, который определяет связанные методы реализации.

Архитектурный дизайн Mybatis

Диаграмма архитектуры

Mybatis 分层架构图

Базовый поддерживающий слой

модуль отражения

Можно сказать, что применение отражения в Java довольно обширно, и это также палка о двух концах. Сам фреймворк MybatisМодуль отражения инкапсулирован, который предоставляет больше возможностей, чем нативное отражениеПростой и удобный интерфейс API, и дляМетаданные класса увеличивают кеш и улучшают производительность отражения

преобразование типов

Наиболее важной функцией модуля преобразования типов является преобразование фактических параметров в оператор SQL.Тип Java в тип JDBC, при сопоставлении набора результатовТип JDBC в тип Java

Другая функция заключается в предоставлении механизма псевдонимов, который упрощает определение файлов конфигурации.

модуль журнала

Роль журналов для системы очевидна, особенно для тестирования, просмотра информации в производственной среде и устранения ошибок. Основные фреймворки журналов включают Log4j, Log4j2, S l f4j и т. д. Модуль журнала Mybatis предназначен дляИнтегрируйте эти среды ведения журналов

загрузка ресурсов

Mybatis инкапсулирует загрузчик классов, чтобы определить порядок, в котором используется загрузчик классов, для записи файлов классов и других файлов ресурсов, и вы можете обратиться к ним, если вам интересноClassLoaderWrapper

модуль парсера

Модуль синтаксического анализатора в основном предоставляет две функции: одна — инкапсулировать класс XPath, анализировать файл конфигурации Mybatis-config.xml и отображать файл конфигурации для предоставления функций при инициализации Mybatis, а другая — обрабатывать заполнители динамических операторов SQL. оказывать помощь

...

базовый слой обработки

Разбор конфигурации

При инициализации Mybatis будет загружена информация о конфигурации из файла Mybatis-config.xml, а проанализированная информация о конфигурации будетПреобразование в объект Java и добавление его в объект конфигурации

📖 Например, тег resultMap, определенный в .xml, будет проанализирован как объект ResultMap.

Разбор SQL

Любой, кто вручную писал сложные операторы SQL, поймет, насколько это болезненно. Mybatis предоставляет динамический SQL и добавляет множество тегов цикла суждения, таких как: if, where, foreach, set и т. д., что помогает разработчикам сэкономить много времени на написание SQL.

Роль модуля синтаксического анализа SQL заключается в том, чтобы анализировать динамические теги SQL, предоставляемые Mybatis, в операторы SQL с заполнителями и позже заменять фактические параметры заполнителями.

выполнение SQL

Процесс выполнения SQL включает в себя несколько важных объектов,Исполнитель, обработчик операторов, обработчик параметров, обработчик результатов

Исполнитель несет ответственность за техническое обслуживаниеКэш уровня 1, уровень 2 и откат фиксации транзакции, например, запрос запроса будет выполнен Исполнителем к StatementHandler

StatementHandler выполняется через ParameterHandler.Привязка аргументов для операторов SQL, выполните оператор SQL через java.sql.Statement и получите соответствующийсопоставление набора результатов

Наконец, результирующий набор анализируется ResultSetHandler, и тип JDBC преобразуется в определяемый программой объект.

плагин

Подключаемый модуль — это уровень расширения, предоставляемый Mybatis, который можно использовать для четырех основных объектов, выполняемых SQL.Перехватывать и выполнять пользовательские плагины

Написание плагинов должно быть хорошо знакомо с операционным механизмом Mybatis, чтобы контролировать безопасность и эффективность написанных плагинов.

интерфейсный слой

Слой интерфейса — это просто MybatisИнтерфейс SqlSession, предоставляемый вызывающей стороне, когда вызывающая сторона вызывает метод в интерфейсе, она вызывает соответствующий модуль основного уровня обработки для завершения операции с базой данных.

вопросы и ответы

Файл .xml определяет, как анализируются операторы Sql.

Когда Mybatis создает SqlSessionFactory, XMLConfigBuilder будет анализировать файл конфигурации Mybatis-config.xml.

Парсер, связанный с Mybatis

Модуль синтаксического анализатора Mybatis определяет абстрактный класс BaseBuilder соответствующего синтаксического анализатора, а различные подклассы отвечают за реализацию различных функций синтаксического анализа с использованием шаблона проектирования Builder.

BaseBuilder

XMLConfigBuilder отвечает за анализ файла конфигурации mybatis-config.xml.

XMLMapperBuilder отвечает за синтаксический анализ файла xxxMapper.xml, сгенерированного бизнесом.

...

разбор mybatis-config.xml

XMLConfigBuilder анализирует код ссылки на содержимое mybatis-config.xml:

parseConfiguration

XMLConfifigBuilder#parseConfiguration()Метод анализирует и заполняет теги, определенные в mybatis-config.xml, в объект конфигурации.

Разбор xxxMapper.xml

XMLConfifigBuilder#mapperElement()Проанализируйте настроенный тег сопоставления в файле .xml, найдите конкретный файл .xml и проанализируйте теги выбора, вставки, обновления, удаления, resultMap и другие теги в информацию об объекте в Java.

Конкретным объектом синтаксического анализа xxxMapper.xml является XMLMapperBuilder, а конкретным методом синтаксического анализа является parse().

parse

Здесь вы можете ответить на текущий вопрос

Mybatis создатьSqlSessionFactoryбудет анализироватьmybatis-config.xml, ПотомРазобрать вложенные теги под тегом конфигурации, При синтаксическом анализе тега сопоставления он считывает XML-файл в соответствии с соответствующей конфигурацией, а затем анализирует каждый тег в XML-файле.

Конкретные теги выбора, вставки, обновления, удаления определяются какMappedStatementобъект, остальные теги в файле .xml также разрешаются в объекты Java в соответствии с различными сопоставлениями.

MappedStatement

Здесь мы сосредоточимся на объекте MappedStatement, давайте посмотрим, как атрибуты в классе связаны с SQL.

MappedStatement

в объекте MappedStatementПредоставленные свойства совпадают с операторами SQL, определенными в XML-файле.может соответствоватьКонтролируйте поведение выполнения каждого оператора SQL

Хранение и реализация интерфейса Mapper

В среде SSM, которую мы обычно пишем, определяется файл SQL, соответствующий интерфейсу Mapper, и .xml, а xxxMapper можно напрямую внедрить на уровень службы.

Я не видел таких операций, как JDBC для работы с базой данных.Как Mybatis пропускает эти повторяющиеся и утомительные операции для нас в середине?

Здесь тестовый класс в исходном коде Mybatis используется для проверки.Во-первых, определяется интерфейс Mapper, а SQL напрямую аннотируется, чтобы избежать проблем.

AutoConstructorMapper

Здесь SqlSession используется для получения операционной базы данных Mapper.Метод тестирования выглядит следующим образом.

primitiveSubjects

Создать SqlSession

#1 Откройте новый SqlSession из SqlSessionFactory

Получить экземпляр картографа

# 2 Есть вопрос, определенный AutoConstructorMapper, очевидно, является интерфейсом,Почему он может быть создан как объект?

Вызов метода динамического прокси

#3 Вызвать конкретный метод в классе через созданный объект, подробнее об операции #2 поговорим здесь

SqlSession — это интерфейс, который имеетКласс реализации по умолчанию DefaultSqlSession, класс содержит свойство Configuration

Информация об интерфейсе Mapper и операторах SQL в формате .xml находится в Mybatis.добавлено при инициализациик конфигурацииMapperRegistryв атрибуте

MapperRegistry#addMapper

getMapper в № 2 — получить Mapper из MapperRegistry.

Взгляните на то, что имеют свойства класса MapperRegistry.

MapperRegistry

конфигурациясохранить его глобально уникальнымСсылка на объект конфигурации

knownMappersKey-Class является объектом Mapper, а Value-MapperProxyFactory является производным от объекта Mapper.Фабрика прокси маппера

Взгляните еще раз на информацию о структуре класса MapperProxyFactory.

MapperProxyFactory

Свойство mapperInterface — это ссылка на объект Mapper, ключ methodCache — это метод в Mapper, а значение — MapperMethod, сгенерированный Mapper при анализе соответствующего SQL.

📖 Mybatis использовал его при разработке свойства methodCacheленивый механизм загрузки, соответствующий Метод будет добавлен не при инициализации, а вДобавлено при первом звонке

cachedMapperMethod

Данные времени выполнения MapperMethod выглядят следующим образом, что легче понять.

MapperMethod 运行状态

Помогите понять взаимосвязь класса MapperRegistry на практическом примере Mapper инициализирует состояние объекта при первом вызове, и вы можете видеть, что емкость methodCache равна 0

MapperRegistry 运行状态

Мы уже знаем отношение классов MapperRegistry, давайте вернемся и посмотрим на второй шаг.MapperRegistry#getMapper() шаг обработки

getMapper

Основная обработка находится в методе MapperProxyFactory#newInstance(), продолжайте следить

newInstance

MapperProxy Унаследовал интерфейс InvocationHandler., что, наконец, возвращает newInstance(), этоКласс реализации динамического прокси, возвращаемый динамическим прокси Java Proxy.

Видя это, становится ясно, почему интерфейс на шаге 2 может быть создан, а возвратКласс реализации динамического прокси интерфейса

Процесс выполнения Mybatis Sql

Узнайте больше в соответствии с блок-схемой выполнения Mybatis SQL.

Mybatis-SQL执行流程

Его можно условно разделить на следующие этапы:

📖 В предыдущем содержании, зная, что Mybatis Mapper является реализацией динамического прокси, для просмотра процесса выполнения SQL необходимо следовать классу MapperProxy, который реализует InvocationHandler

Выполнить CRUD

@Select(" SELECT * FROM SUBJECT WHERE ID = #{id}")
PrimitiveSubject getSubject(@Param("id") final int id);

В качестве примера возьмем описанный выше метод: вызывающий объект получает динамический прокси-объект Mapper через SqlSession, и когда метод Mapper выполняется, он передаетInvocationHandler для проксирования

MapperProxy

В MapperMethod# выполнить согласно MapperMethod -> SqlCommand ->SqlCommandTypeопределить способы добавления, удаления, изменения и проверки

📖 SqlCommandType — тип перечисления, соответствующий пяти типам UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH

execute

обработка параметров

Операция запроса соответствует значению перечисления SELECT.В случае если еще оценивается, является ли возвращаемое значение коллекцией, нет возвращаемого значения, одиночный запрос и т. д. Здесь в качестве записи используется одна запись.

Object param = method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(command.getName(), param);

convertArgsToSqlCommandParam_new

参数解析

📖 Это может объяснить проблему, которая беспокоила меня раньше, поэтому есть только один параметр метода@Param("id"), но объект параметра param будет иметь две пары ключ-значение

продолжить просмотрSqlSession#selectOneметод, sqlSession — это интерфейс, он зависит от класса реализацииDefaultSqlSession

selectOne

Поскольку одиночный запрос, множественный запрос и запрос на подкачку — это путь, поэтому в процессе запроса будут добавлены параметры подкачки.

selectList

исполнительная обработка

В исходном коде Mybatis созданный исполнитель по умолчанию имеет значениеCachingExecutor,Используя шаблон декоратора, сохраняя классExecutorссылка на интерфейс,CachingExecutorДобавлена ​​функция кеша на основе удерживаемого исполнителя

CachingExecutor#query

delegate.queryЭто в конкретном исполнителе, по умолчаниюSimpleExecutor,Метод запроса унифицирован в абстрактном родительском классе.BaseExecutorсреднее обслуживание

BaseExecutor#query

BaseExecutor#queryFromDatabaseМетод выполняет заполнитель кеша и выполняет определенный метод, а также добавляет данные возврата запроса в кеш.

queryFromDatabase

BaseExecutor#doQueryМетод реализуется конкретным SimpleExecutor

doQuery

выполнить SQL

Поскольку мы используем заполнители параметров в нашем SQL, мы используемPreparedStatementHandlerОбъект, обработчик, который выполняет предварительно скомпилированный SQL, фактически используемыйPreparedStatementСделать SQL-вызов

PreparedStatementHandler_query

анализ возвратных данных

Преобразование возвращаемого типа JDBC в тип Java, преобразование в соответствии с наборами результатов и картой результатов

handleResultSets

5.4 Как реализовать пейджинг в Mybatis

Существует два способа реализации подкачки SQL через Mybatis: один — добавить LIMIT при написании SQL, а другой — обрабатывать глобально.

Разбиение на страницы SQL

<select id="getSubjectByPage" resultMap="resultAutoMap">
    SELECT * FROM SUBJECT LIMIT #{CURRINDEX} , #{PAGESIZE}
</select>

Пагинация перехватчика

Как упоминалось выше, Mybatis поддерживает механизм расширения плагинов, который может перехватывать методы конкретных объектов и соответствующий уровень ввода.

Нам нужно реализовать при добавлении плагиновInterceptorинтерфейса, а затем запишите подключаемый модуль в файл конфигурации mybatis-config.xml или добавьте соответствующие аннотации.Mybatis можно проанализировать во время инициализации, прежде чем его можно будет добавить в контейнер подключаемого модуля при запуске проекта.

pluginElement

Все перехватчики в проекте хранятся в структуре списка черезConfiguration#addInterceptorспособ добавить

InterceptorChain

Фокус требует вниманияInterceptor#pluginAllВ методе плагина Interceptor — это просто интерфейс, а метод плагина может быть завершен только его классом реализации.

ExamplePlugin

Плагин можно понимать как класс инструмента,Plugin#wrapВозвращает динамический прокси-класс

wrap

Здесь используйте тестовую демонстрацию, чтобы увидеть параметры при запуске метода.

AlwaysMapPlugin

Несмотря на то, что это небрежно написанная демонстрация, на самом деле нет никакой разницы с официально используемым плагином.

插件运行状态

Вывод

По сравнению со Spring, Mybatis достаточно легкий и относится к исходному коду фреймворка начального уровня, но в нем используется множество шаблонов проектирования, и вы можете научиться применять бизнес-код из дизайна. В то же время, после освоения Mybatis, он очень помогает при чтении исходного кода SpringCloud и Dubbo, Я также надеюсь, что друзья, прочитавшие статью, смогут углубить свое понимание Mybatis.

Конечно, это также исходный код фреймворка. Невозможно освоить все это в одной статье. Читатели могут скачать исходный код и запустить еще несколько демонстраций. Тестовые классы в исходном коде Mybatis описаны очень подробно, так что не нужно беспокоиться об отсутствии направления.Если статья была вам полезна, то нажмите на поддержку, желаю вам добра.

Поиск в Wechat [круг интереса к исходному коду], подпишитесь на официальный аккаунт и ответьте 123, чтобы получить учебные материалы, такие как GO, Netty, Seata, SpringCloud Alibaba, спецификации разработки, сборник интервью, структуру данных и так далее!

Справочное содержание: