Подумайте об этом совместном использовании с вопросами
Во второй половине 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 базы данных, предоставляемый каждым производителем, называетсяводить машину
Что такое Мибатис
Mybatis — отличный фреймворк ORM (уровень сохраняемости), написанный на языке Java.
Ранее известный как iBatis, проект Apache с открытым исходным кодом, он был перенесен в код Google в 2010 году и официально изменил свое название на Mybatis.
Уровень сохраняемости ORM относится к:Храните бизнес-данные на диске, а также имеет возможность длительного хранения.Пока диск не поврежден, если система выключена, данные все еще можно прочитать, перезапустив систему.
Отношения между Mybatis и 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
Диаграмма архитектуры
Базовый поддерживающий слой
модуль отражения
Можно сказать, что применение отражения в 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.
XMLConfigBuilder отвечает за анализ файла конфигурации mybatis-config.xml.
XMLMapperBuilder отвечает за синтаксический анализ файла xxxMapper.xml, сгенерированного бизнесом.
...
разбор mybatis-config.xml
XMLConfigBuilder анализирует код ссылки на содержимое mybatis-config.xml:
XMLConfifigBuilder#parseConfiguration()Метод анализирует и заполняет теги, определенные в mybatis-config.xml, в объект конфигурации.
Разбор xxxMapper.xml
XMLConfifigBuilder#mapperElement()Проанализируйте настроенный тег сопоставления в файле .xml, найдите конкретный файл .xml и проанализируйте теги выбора, вставки, обновления, удаления, resultMap и другие теги в информацию об объекте в Java.
Конкретным объектом синтаксического анализа xxxMapper.xml является XMLMapperBuilder, а конкретным методом синтаксического анализа является parse().
Здесь вы можете ответить на текущий вопрос
Mybatis создатьSqlSessionFactoryбудет анализироватьmybatis-config.xml, ПотомРазобрать вложенные теги под тегом конфигурации, При синтаксическом анализе тега сопоставления он считывает XML-файл в соответствии с соответствующей конфигурацией, а затем анализирует каждый тег в XML-файле.
Конкретные теги выбора, вставки, обновления, удаления определяются какMappedStatementобъект, остальные теги в файле .xml также разрешаются в объекты Java в соответствии с различными сопоставлениями.
MappedStatement
Здесь мы сосредоточимся на объекте MappedStatement, давайте посмотрим, как атрибуты в классе связаны с SQL.
в объекте MappedStatementПредоставленные свойства совпадают с операторами SQL, определенными в XML-файле.может соответствоватьКонтролируйте поведение выполнения каждого оператора SQL
Хранение и реализация интерфейса Mapper
В среде SSM, которую мы обычно пишем, определяется файл SQL, соответствующий интерфейсу Mapper, и .xml, а xxxMapper можно напрямую внедрить на уровень службы.
Я не видел таких операций, как JDBC для работы с базой данных.Как Mybatis пропускает эти повторяющиеся и утомительные операции для нас в середине?
Здесь тестовый класс в исходном коде Mybatis используется для проверки.Во-первых, определяется интерфейс Mapper, а SQL напрямую аннотируется, чтобы избежать проблем.
Здесь SqlSession используется для получения операционной базы данных Mapper.Метод тестирования выглядит следующим образом.
Создать SqlSession
#1 Откройте новый SqlSession из SqlSessionFactory
Получить экземпляр картографа
# 2 Есть вопрос, определенный AutoConstructorMapper, очевидно, является интерфейсом,Почему он может быть создан как объект?
Вызов метода динамического прокси
#3 Вызвать конкретный метод в классе через созданный объект, подробнее об операции #2 поговорим здесь
SqlSession — это интерфейс, который имеетКласс реализации по умолчанию DefaultSqlSession, класс содержит свойство Configuration
Информация об интерфейсе Mapper и операторах SQL в формате .xml находится в Mybatis.добавлено при инициализациик конфигурацииMapperRegistryв атрибуте
getMapper в № 2 — получить Mapper из MapperRegistry.
Взгляните на то, что имеют свойства класса MapperRegistry.
конфигурациясохранить его глобально уникальнымСсылка на объект конфигурации
knownMappersKey-Class является объектом Mapper, а Value-MapperProxyFactory является производным от объекта Mapper.Фабрика прокси маппера
Взгляните еще раз на информацию о структуре класса MapperProxyFactory.
Свойство mapperInterface — это ссылка на объект Mapper, ключ methodCache — это метод в Mapper, а значение — MapperMethod, сгенерированный Mapper при анализе соответствующего SQL.
📖 Mybatis использовал его при разработке свойства methodCacheленивый механизм загрузки, соответствующий Метод будет добавлен не при инициализации, а вДобавлено при первом звонке
Данные времени выполнения MapperMethod выглядят следующим образом, что легче понять.
Помогите понять взаимосвязь класса MapperRegistry на практическом примере Mapper инициализирует состояние объекта при первом вызове, и вы можете видеть, что емкость methodCache равна 0
Мы уже знаем отношение классов MapperRegistry, давайте вернемся и посмотрим на второй шаг.MapperRegistry#getMapper() шаг обработки
Основная обработка находится в методе MapperProxyFactory#newInstance(), продолжайте следить
MapperProxy Унаследовал интерфейс InvocationHandler., что, наконец, возвращает newInstance(), этоКласс реализации динамического прокси, возвращаемый динамическим прокси Java Proxy.
Видя это, становится ясно, почему интерфейс на шаге 2 может быть создан, а возвратКласс реализации динамического прокси интерфейса
Процесс выполнения 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 для проксирования
В MapperMethod# выполнить согласно MapperMethod -> SqlCommand ->SqlCommandTypeопределить способы добавления, удаления, изменения и проверки
📖 SqlCommandType — тип перечисления, соответствующий пяти типам UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH
обработка параметров
Операция запроса соответствует значению перечисления SELECT.В случае если еще оценивается, является ли возвращаемое значение коллекцией, нет возвращаемого значения, одиночный запрос и т. д. Здесь в качестве записи используется одна запись.
Object param = method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(command.getName(), param);
📖 Это может объяснить проблему, которая беспокоила меня раньше, поэтому есть только один параметр метода
@Param("id"), но объект параметра param будет иметь две пары ключ-значение
продолжить просмотрSqlSession#selectOneметод, sqlSession — это интерфейс, он зависит от класса реализацииDefaultSqlSession
Поскольку одиночный запрос, множественный запрос и запрос на подкачку — это путь, поэтому в процессе запроса будут добавлены параметры подкачки.
исполнительная обработка
В исходном коде Mybatis созданный исполнитель по умолчанию имеет значениеCachingExecutor,Используя шаблон декоратора, сохраняя классExecutorссылка на интерфейс,CachingExecutorДобавлена функция кеша на основе удерживаемого исполнителя
delegate.queryЭто в конкретном исполнителе, по умолчаниюSimpleExecutor,Метод запроса унифицирован в абстрактном родительском классе.BaseExecutorсреднее обслуживание
BaseExecutor#queryFromDatabaseМетод выполняет заполнитель кеша и выполняет определенный метод, а также добавляет данные возврата запроса в кеш.
BaseExecutor#doQueryМетод реализуется конкретным SimpleExecutor
выполнить SQL
Поскольку мы используем заполнители параметров в нашем SQL, мы используемPreparedStatementHandlerОбъект, обработчик, который выполняет предварительно скомпилированный SQL, фактически используемыйPreparedStatementСделать SQL-вызов
анализ возвратных данных
Преобразование возвращаемого типа JDBC в тип Java, преобразование в соответствии с наборами результатов и картой результатов
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 можно проанализировать во время инициализации, прежде чем его можно будет добавить в контейнер подключаемого модуля при запуске проекта.
Все перехватчики в проекте хранятся в структуре списка черезConfiguration#addInterceptorспособ добавить
Фокус требует вниманияInterceptor#pluginAllВ методе плагина Interceptor — это просто интерфейс, а метод плагина может быть завершен только его классом реализации.
Плагин можно понимать как класс инструмента,Plugin#wrapВозвращает динамический прокси-класс
Здесь используйте тестовую демонстрацию, чтобы увидеть параметры при запуске метода.
Несмотря на то, что это небрежно написанная демонстрация, на самом деле нет никакой разницы с официально используемым плагином.
Вывод
По сравнению со Spring, Mybatis достаточно легкий и относится к исходному коду фреймворка начального уровня, но в нем используется множество шаблонов проектирования, и вы можете научиться применять бизнес-код из дизайна. В то же время, после освоения Mybatis, он очень помогает при чтении исходного кода SpringCloud и Dubbo, Я также надеюсь, что друзья, прочитавшие статью, смогут углубить свое понимание Mybatis.
Конечно, это также исходный код фреймворка. Невозможно освоить все это в одной статье. Читатели могут скачать исходный код и запустить еще несколько демонстраций. Тестовые классы в исходном коде Mybatis описаны очень подробно, так что не нужно беспокоиться об отсутствии направления.Если статья была вам полезна, то нажмите на поддержку, желаю вам добра.
Поиск в Wechat [круг интереса к исходному коду], подпишитесь на официальный аккаунт и ответьте 123, чтобы получить учебные материалы, такие как GO, Netty, Seata, SpringCloud Alibaba, спецификации разработки, сборник интервью, структуру данных и так далее!
Справочное содержание:
- "Инсайдерская информация о технологиях MyBatis"
- Официальный сайт MyBatis
- Адрес загрузки исходного кода
- код для генерации изображений