Краткое изложение интервью по Java, включая ключевые знания Java и общие платформы с открытым исходным кодом, приветствуется к прочтению. В статье возможны ошибки, т.к. личные знания ограничены, прошу указать! Статья постоянно обновляется...
ID заглавие адрес 1 Design Patterns Interview Questions (резюме наиболее полных вопросов для интервью) nuggets.capable/post/684490… 2 Вопросы для собеседования по базовым знаниям Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 3 Вопросы для собеседования по коллекции Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 4 Вопросы для интервью JavaIO, BIO, NIO, AIO, Netty (резюме наиболее полных вопросов для интервью) nuggets.capable/post/684490… 5 Вопросы для собеседования по параллельному программированию на Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 6 Вопросы для собеседования об исключении Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 7 Вопросы для интервью с виртуальной машиной Java (JVM) (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 8 Весенние вопросы для интервью (резюме наиболее полных вопросов для интервью) nuggets.capable/post/684490… 9 Вопросы интервью Spring MVC (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 10 Вопросы интервью Spring Boot (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 11 Вопросы интервью Spring Cloud (краткое изложение наиболее полных вопросов интервью) nuggets.capable/post/684490… 12 Вопросы интервью Redis (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 13 Вопросы для интервью MyBatis (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 14 Вопросы для собеседования по MySQL (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 15 TCP, UDP, Socket, HTTP вопросы интервью (резюме наиболее полных вопросов интервью) nuggets.capable/post/684490… 16 Вопросы для интервью с Nginx (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 17 ElasticSearch Вопросы на собеседовании 18 кафка вопросы интервью 19 Вопросы для интервью RabbitMQ (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 20 Вопросы для интервью Dubbo (краткое изложение наиболее полных вопросов для интервью) nuggets.capable/post/684490… 21 Вопросы интервью ZooKeeper (резюме наиболее полных вопросов интервью) nuggets.capable/post/684490… 22 Вопросы для интервью Netty (краткое изложение наиболее полных вопросов для интервью) 23 Вопросы для интервью с Tomcat (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 24 Вопросы для собеседования по Linux (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 25 Вопросы для интервью, связанные с Интернетом (краткое изложение наиболее полных вопросов для интервью) 26 Вопросы для интервью по безопасности в Интернете (краткое изложение наиболее полных вопросов для интервью)
Введение в MyBatis
Что такое MyBatis?
-
Mybatis представляет собой фреймворк полу-ORM (Object Relational Mapping), который внутренне инкапсулирует JDBC.При разработке вам нужно обращать внимание только на сам оператор SQL, и вам не нужно тратить энергию на сложные процессы, такие как загрузка драйверов, создание соединений и создание утверждений. Программисты напрямую пишут исходный sql, который может строго контролировать производительность выполнения sql и обладает высокой гибкостью.
-
MyBatis может использовать XML или аннотации для настройки и сопоставления собственной информации, сопоставления POJO с записями в базе данных, исключения почти всего кода JDBC и ручной установки параметров и получения наборов результатов.
Плюсы и минусы Mybatis
преимущество
与传统的数据库访问技术相比,ORM有以下优点:
- Основанный на программировании операторов SQL, он достаточно гибок и не окажет никакого влияния на существующую структуру приложения или базы данных.SQL написан в формате XML, который отделяет SQL от кода программы и упрощает унифицированное управление;предоставляет теги XML для поддержки записи динамических данных. Операторы SQL и могут быть повторно использованы
- По сравнению с JDBC он уменьшает объем кода более чем на 50%, устраняет много избыточного кода в JDBC и не требует ручного переключения соединений.
- Он очень совместим с различными базами данных (поскольку MyBatis использует JDBC для подключения к базе данных, поэтому база данных, поддерживаемая JDBC, поддерживается MyBatis).
- Предоставляет метки сопоставления для поддержки сопоставления отношений полей ORM между объектами и базами данных; предоставляет метки объектно-реляционного сопоставления для поддержки обслуживания объектно-реляционных компонентов.
- Может хорошо интегрироваться с Spring
недостаток
- Рабочая нагрузка по написанию операторов SQL относительно велика, особенно когда имеется много полей и связанных таблиц, к разработчикам предъявляются определенные требования для написания операторов SQL.
- Операторы SQL зависят от базы данных, что приводит к плохой переносимости базы данных, и базу данных нельзя заменить по желанию.
Разница между Hibernate и MyBatis
Та же точка
- Все они являются инкапсуляцией jdbc, все они являются каркасом уровня сохраняемости, и все они используются для разработки уровня dao.
разница
- Сопоставление отношений
- MyBatis — это полуавтоматическая структура сопоставления, которая настраивает соответствующие отношения между объектами Java и результатами выполнения операторов SQL, а конфигурация многотабличных ассоциаций проста.
- Hibernate — это полная структура сопоставления таблиц, которая настраивает соответствие между объектами Java и таблицами базы данных, а конфигурация многотабличных ассоциаций сложна.
Оптимизация SQL и переносимость
- Hibernate инкапсулирует операторы SQL и предоставляет такие функции, как ведение журнала, кэширование и каскадирование (каскадирование более мощное, чем MyBatis). Кроме того, он также предоставляет HQL (язык запросов Hibernate) для работы с базой данных. Он поддерживает хорошую независимость от базы данных, но потребляет больше представление. Если проекту необходимо поддерживать несколько баз данных, объем разработки кода невелик, но оптимизация операторов SQL затруднена.
- MyBatis должен вручную писать SQL, поддерживает динамический SQL, обработку списков, динамическое создание имен таблиц и поддержку хранимых процедур. Объем разработки относительно велик. Прямое использование операторов SQL для работы с базой данных не поддерживает независимость базы данных, но оптимизация операторов SQL проста.
что такое ОРМ
- ORM (объектно-реляционное сопоставление), объектно-реляционное сопоставление — это технология для решения отношений сопоставления между данными реляционной базы данных и простыми объектами Java (POJO). Проще говоря, ORM автоматически сохраняет объекты программы в реляционной базе данных, используя метаданные, описывающие сопоставление между объектами и базами данных.
Почему Mybatis — это полуавтоматический инструмент отображения ORM? Чем он отличается от полностью автоматического?
-
Hibernate — это полностью автоматический инструмент сопоставления ORM.При использовании Hibernate для запроса связанных объектов или объектов связанных коллекций его можно получить непосредственно в соответствии с объектно-реляционной моделью, поэтому он полностью автоматический.
-
Mybatis необходимо вручную писать sql при запросе связанных объектов или связанных объектов коллекции, поэтому он называется полуавтоматическим инструментом сопоставления ORM.
Каковы проблемы с традиционной разработкой JDBC?
- Частое создание и освобождение объектов соединения с базой данных может привести к пустой трате системных ресурсов и повлиять на производительность системы. Эту проблему можно решить, используя пул соединений. Но использование jdbc требует, чтобы вы сами реализовали пул соединений.
- Существуют жесткие коды для определения оператора SQL, настройки параметров и обработки набора результатов. Оператор sql в реальном проекте, скорее всего, изменится.После того, как изменение произойдет, код Java необходимо изменить, а систему необходимо перекомпилировать и повторно опубликовать. Плохое обслуживание.
- Существует жесткое кодирование в использовании подготовленного статемента для передачи параметров в символ занятого бита, потому что условие where оператора SQL не обязательно, оно может быть больше или меньше, и код необходимо изменить, чтобы изменить SQL, и система не прост в обслуживании.
- В обработке результирующего набора есть дублирующиеся коды, с которыми сложно справиться. Было бы удобнее, если бы его можно было сопоставить с объектом Java.
Каковы недостатки программирования JDBC и как MyBatis их решает?
-
1. Частое создание и освобождение ссылок на базы данных приводит к нерациональному использованию системных ресурсов и влияет на производительность системы.Эта проблема может быть решена с помощью пулов соединений с базами данных.
- Решение: Настройте пул каналов передачи данных в файле mybatis-config.xml и используйте пул соединений для управления соединениями с базой данных.
-
2. Оператор Sql написан в коде, что затрудняет поддержку кода.Фактическое применение sql может сильно измениться, и изменение sql должно изменить код java. -
- Решение. Настройте оператор Sql в файле XXXXmapper.xml, чтобы отделить его от кода Java.
-
3. Затруднительно передавать параметры в оператор sql, потому что условие where оператора sql не обязательно, их может быть больше или меньше, а заполнители должны соответствовать параметрам один за другим.
- Решение: Mybatis автоматически сопоставляет объекты java с операторами sql.
-
4. Затруднительно парсить результирующий набор.Изменение sql приводит к изменению кода парсинга, и его нужно пройти перед парсингом.Если запись БД можно инкапсулировать в объект pojo, то это удобнее для парсинга .
- Решение: Mybatis автоматически сопоставляет результаты выполнения sql с объектами java.
Применимые сценарии для MyBatis и Hibernate?
- MyBatis фокусируется на самом SQL и является достаточно гибким решением уровня DAO.
- MyBatis будет хорошим выбором для проектов, предъявляющих высокие требования к производительности или требующих дополнительных изменений, таких как интернет-проекты.
Простота разработки и стоимость обучения
-
Hibernate — тяжеловесный фреймворк с высоким порогом обучения и использования, подходит для небольших и средних проектов с относительно стабильными требованиями, таких как системы автоматизации делопроизводства.
-
MyBatis — это легкий фреймворк с низким порогом обучения и использования, подходящий для масштабных проектов с частыми изменениями спроса, таких как: Интернет-система электронной коммерции
Суммировать
-
MyBatis — это небольшая, удобная, эффективная, простая, прямая, полуавтоматическая структура слоя сохраняемости.
-
Hibernate — это мощная, удобная, эффективная, сложная, непрямая, полностью автоматизированная структура слоя сохраняемости.
Архитектура MyBatis
Каковы этапы программирования MyBatis?
-
1. Создайте фабрику SqlSessionFactory
-
2. Создайте SqlSession через SqlSessionFactory.
-
3. Выполнение операций с базой данных через sqlsession
-
4. Вызовите session.commit(), чтобы зафиксировать транзакцию
-
5. Вызовите session.close(), чтобы закрыть сеанс
Расскажите, пожалуйста, как работает MyBatis
- Прежде чем изучать программу MyBatis, вам необходимо понять, как работает MyBatis, чтобы понять программу. Принцип работы MyBatis следующий.
- Прочтите файл конфигурации MyBatis: mybatis-config.xml — это глобальный файл конфигурации MyBatis, который настраивает операционную среду и другую информацию MyBatis, например информацию о подключении к базе данных.
- Загрузите файл карты. Файл сопоставления — это файл сопоставления SQL, который настраивает операторы SQL для работы с базой данных и должен быть загружен в файл конфигурации MyBatis mybatis-config.xml. Файл mybatis-config.xml может загружать несколько файлов отображения, каждый из которых соответствует таблице в базе данных.
- Создайте фабрику сеансов: создайте фабрику сеансов SqlSessionFactory с помощью среды MyBatis и другой информации о конфигурации.
- Создайте объект сеанса: объект SqlSession создается фабрикой сеансов, которая содержит все методы для выполнения операторов SQL.
- Executor: MyBatis определяет внизу интерфейс Executor для работы с базой данных, который будет динамически генерировать оператор SQL для выполнения в соответствии с параметрами, переданными SqlSession, и отвечает за обслуживание кэша запросов.
- Объект MappedStatement: в методе выполнения интерфейса Executor имеется параметр типа MappedStatement, который инкапсулирует информацию о сопоставлении и используется для хранения идентификатора, параметров и другой информации оператора SQL, который необходимо сопоставить.
- Сопоставление входных параметров. Типы входных параметров могут быть типами коллекций, такими как карта и список, а также базовыми типами данных и типами POJO. Процесс сопоставления входных параметров аналогичен процессу JDBC установки параметров в объектах prepareStatement.
- Сопоставление выходных результатов. Тип выходных результатов может быть типами коллекций, такими как карта и список, а также базовыми типами данных и типами POJO. Процесс сопоставления выходных результатов аналогичен процессу синтаксического анализа JDBC для наборов результатов.
Какова функциональная архитектура MyBatis
- Мы разделяем функциональную архитектуру Mybatis на три слоя:
- Уровень интерфейса API: интерфейс API предоставляется для внешнего использования, и разработчики управляют базой данных через эти локальные API. Как только уровень интерфейса получит запрос на вызов, он вызовет уровень обработки данных для завершения конкретной обработки данных.
- Уровень обработки данных: отвечает за конкретный поиск SQL, анализ SQL, выполнение SQL и обработку сопоставления результатов выполнения и т. д. Его основная цель — завершить операцию базы данных в соответствии с запросом на вызов.
- Уровень базовой поддержки: отвечает за самую базовую функциональную поддержку, включая управление соединениями, управление транзакциями, загрузку конфигурации и обработку кэша.Все это общие вещи, и они извлекаются как самые основные компоненты. Обеспечьте самую базовую поддержку для верхнего уровня обработки данных.
Какова структура фреймворка MyBatis?
- Эта картина рассматривается сверху вниз. Инициализация MyBatis будет проанализирована и построена из файла конфигурации mybatis-config.xml в класс Configuration, который показан красным прямоугольником на рисунке.
-
Загрузка конфигурации: Конфигурация поступает из двух мест: одно — файл конфигурации, другое — аннотация кода Java, а информация о конфигурации SQL загружается в объект MappedStatement (включая входящую конфигурацию сопоставления параметров, выполняемый оператор SQL, конфигурация сопоставления результатов), хранящаяся в памяти.
-
Анализ SQL: когда уровень интерфейса API получает запрос на вызов, он получает входящий идентификатор SQL и входящий объект (который может быть Map, JavaBean или базовыми типами данных), Mybatis находит соответствующий MappedStatement в соответствии с идентификатором SQL, а затем в соответствии с Объект параметра передается для анализа MappedStatement, и после анализа можно получить окончательный оператор SQL и параметры, которые необходимо выполнить.
-
Выполнение SQL: Получите окончательный SQL и параметры в базу данных для выполнения и получите результат работы с базой данных.
-
Отображение результатов: результат работы с базой данных преобразуется в соответствии с конфигурацией отображения, которую можно преобразовать в HashMap, JavaBean или базовый тип данных, и возвращается окончательный результат.
Что такое СУБД
- СУБД: Система управления базами данных (система управления базами данных) представляет собой крупномасштабное программное обеспечение для манипулирования базами данных и управления ими, используемое для создания, использования и обслуживания баз данных данных, называемых СУБД. Он единообразно управляет базой данных и контролирует ее, чтобы обеспечить безопасность и целостность базы данных. Пользователи получают доступ к данным в базе данных через dbms, и администраторы базы данных также выполняют обслуживание базы данных через dbms. Это позволяет нескольким приложениям и пользователям создавать, изменять и запрашивать базы данных разными способами в одно и то же время или в разное время. СУБД предоставляет язык определения данныхDDL(язык определения данных) и язык манипулирования даннымиDML(язык манипулирования данными), чтобы пользователи могли определять структуру схемы и ограничения разрешений базы данных, а также реализовывать такие операции, как добавление и удаление данных.
Зачем нужна предварительная компиляция
-
определение:
- Предварительная компиляция SQL означает, что драйвер базы данных компилирует оператор SQL перед отправкой оператора SQL и параметров в СУБД, поэтому, когда СУБД выполняет SQL, его не нужно перекомпилировать.
-
Зачем нужна предварительная компиляция
- Объект PreparedStatement используется в JDBC для абстрагирования предварительно скомпилированных операторов и использования предварительно скомпилированных. Фаза предварительной компиляции может оптимизировать выполнение SQL. В большинстве случаев предварительно скомпилированный SQL можно выполнить напрямую, и СУБД не нужно повторно компилировать.Чем сложнее SQL, тем выше сложность компиляции.Предкомпилированная фаза может объединять несколько операций в одну операцию. При этом подготовленный объект оператора можно использовать повторно. Кэшируйте объект PreparedStatement, сгенерированный после предварительной компиляции SQL, и используйте кэшированный объект PreparedState напрямую для того же SQL в следующий раз. Mybatis будет прекомпилировать весь SQL по умолчанию.
- Есть еще одна важная причина для репликации SQL-инъекций
Какие Исполнители есть у Mybatis? В чем разница между ними?
-
Mybatis имеет три основных исполнителя Executor: SimpleExecutor, ReuseExecutor, BatchExecutor.
-
SimpleExecutor: каждый раз, когда выполняется обновление или выбор, открывается объект Statement, который закрывается сразу после использования.
-
ReuseExecutor: выполнить обновление или выбрать, использовать sql в качестве ключа для поиска объекта Statement, использовать его, если он существует, и создать его, если он не существует. Короче говоря, повторно используйте объекты Statement.
-
BatchExecutor: выполнить обновление (без выбора, пакет JDBC не поддерживает выбор), добавить все sql в пакет (addBatch()), дождаться унифицированного выполнения (executeBatch()), он кэширует несколько объектов операторов, каждый оператор после того, как все объекты addBatch(), они ожидают выполнения пакетов executeBatch() один за другим. То же, что пакетная обработка JDBC.
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
Как указать, какой Executor использовать в Mybatis?
-
В конфигурационном файле Mybatis можно указать в настройках тип экзекьютора по умолчанию ExecutorType, а можно вручную передать параметр типа ExecutorType в метод создания SqlSession DefaultSqlSessionFactory, например SqlSession openSession(ExecutorType execType).
-
Настройте исполнителя по умолчанию. SIMPLE — это обычный исполнитель; исполнитель REUSE будет повторно использовать подготовленные операторы; исполнитель BATCH будет повторно использовать операторы и выполнять пакетные обновления.
Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?
-
Mybatis поддерживает только ленивую загрузку объектов, связанных с ассоциацией, и объектов, связанных с коллекцией, Ассоциация относится к запросу «один к одному», а коллекция относится к запросу «один ко многим». В файле конфигурации Mybatis вы можете указать, следует ли включать отложенную загрузку lazyLoadingEnabled=true|false.
-
Его принцип заключается в использовании CGLIB для создания прокси-объекта целевого объекта.При вызове целевого метода введите метод перехватчика, например вызов a.getB().getName(), метод перехватчика invoke() находит, что a. getB() is Если значение равно null, то sql предварительно сохраненного запроса, связанного с объектом B, будет отправлен отдельно, B будет запрошен, а затем будет вызван a.setB(b), поэтому объект b имеет значение, а затем завершите вызов метода a.getB().getName(). Это основной принцип ленивой загрузки.
-
Конечно, не только Mybatis, но и почти все, включая Hibernate, поддерживают тот же принцип ленивой загрузки.
картограф
Разница между #{} и ${}
-
#{} – предварительно скомпилированный заполнитель, ${} – сплайсер, замена строки, предварительно не скомпилированный.
-
Когда Mybatis обрабатывает #{}, входящий параметр #{} передается в виде строки, он заменяет #{} в SQL знаком ? и вызывает метод set из PreparedStatement для присвоения значения.
-
#{} может эффективно предотвратить внедрение SQL и повысить безопасность системы; ${} не может предотвратить внедрение SQL
-
Подстановка переменной для #{} находится в СУБД, подстановка переменной для ${} вне СУБД
Как написать нечеткий запрос, подобный оператору
- 1 '%${question}%' может вызвать SQL-инъекцию, не рекомендуется
- 2 "%"#{question}"%" Примечание. Когда #{…} анализируется в операторе sql, одинарная кавычка ' ' будет автоматически добавлена снаружи переменной, поэтому здесь % необходимо использовать двойные кавычки " ", а не одинарные кавычки ' ', иначе результаты не будут найдены.
- 3 CONCAT('%',#{вопрос},'%') Используйте функцию CONCAT() (рекомендуется)
- 4 Используйте тег привязки (не рекомендуется)
<select id="listUserLikeUsername" resultType="com.jourwon.pojo.User">
  <bind name="pattern" value="'%' + username + '%'" />
  select id,sex,age,username,password from person where username LIKE #{pattern}
</select>
Как передать несколько параметров в маппере
Метод 1: Метод последовательной передачи параметров
public User selectUser(String name, int deptId);
<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{0} and dept_id = #{1}
</select>
-
Числа внутри #{} представляют порядок входящих параметров.
-
Этот метод не рекомендуется, выражение слоя SQL не является интуитивно понятным, и после настройки порядка легко допустить ошибку.
Способ 2: метод передачи параметров аннотации @Param
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
-
Имя в #{} соответствует имени, измененному в скобках аннотации @Param.
-
Этот метод относительно интуитивно понятен, когда параметров немного (рекомендуется).
Метод 3: метод передачи параметров карты
public User selectUser(Map<String, Object> params);
<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
-
Имя в #{} соответствует имени ключа на карте.
-
Этот метод подходит для передачи нескольких параметров, а параметры являются непостоянными и могут передаваться гибко. (Рекомендуемое использование).
Метод 4: метод передачи параметров Java Bean
public User selectUser(User user);
<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
-
Имена в #{} соответствуют свойствам членов в классе User.
-
Этот метод интуитивно понятен и требует создания класса сущностей. Его непросто расширить, и необходимо добавить атрибуты. Тем не менее, код легко читается, а бизнес-логика проста в обращении. Рекомендуется использовать его. (Рекомендуемое использование).
Как Mybatis выполняет массовые операции
- Используйте тег foreach
- Основное использование foreach заключается в построении условий, которые могут выполнять итерацию по коллекции в операторе SQL. Атрибуты тега foreach в основном включают элемент, индекс, коллекцию, открытие, разделитель и закрытие.
- item представляет псевдоним каждого элемента в коллекции при итерации, имя переменной произвольно;
- index задает имя для указания положения каждой итерации в процессе итерации, которое обычно не используется;
- open указывает, с чего начинается оператор, обычно "(";
- разделитель указывает, какой символ используется в качестве разделителя между каждой итерацией, обычно используется ",";
- close означает, чем заканчивать, обычно ")".
- Наиболее критичным и подверженным ошибкам при использовании foreach является атрибут collection, который необходимо указывать, но в разных случаях значение этого атрибута разное, в основном в следующих трех случаях:
- Если передается один параметр и тип параметра — список, значением атрибута коллекции является список.
- Если передается один параметр и тип параметра является массивом массива, значением свойства коллекции является массив
- Если есть несколько входящих параметров, нам нужно инкапсулировать их как карту.Конечно, один параметр также может быть инкапсулирован как карта.На самом деле, если вы передаете параметры, они также будут инкапсулированы в MyBatis.в карту ,
Ключом карты является имя параметра, поэтому в настоящее время значением атрибута коллекции является ключ входящего объекта списка или массива на карте, которую он инкапсулирует.
- Конкретное использование заключается в следующем:
<!-- 批量保存(foreach插入多条数据两种方法)
int addEmpsBatch(@Param("emps") List<Employee> emps); -->
<!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
<insert id="addEmpsBatch">
INSERT INTO emp(ename,gender,email,did)
VALUES
<foreach collection="emps" item="emp" separator=",">
(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>
<!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持
如jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true -->
<insert id="addEmpsBatch">
<foreach collection="emps" item="emp" separator=";">
INSERT INTO emp(ename,gender,email,did)
VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>
-
Использование ExecutorType.BATCH
-
В Mybatis есть три встроенных типа ExecutorType. По умолчанию используется простой. В этом режиме он создает новый подготовленный оператор для выполнения каждого оператора и отправляет sql в одну строку, в то время как пакетный режим повторно использует подготовленные операторы и выполняет все обновления в пакетах., очевидно, пакетная производительность будет лучше, но у пакетного режима тоже есть свои проблемы, например, во время операции Insert, до того, как транзакция будет зафиксирована, нет возможности получить самоувеличивающийся id, который не соответствует бизнес-требованиям в определенных ситуациях.
-
Конкретное использование заключается в следующем:
//批量保存方法测试 @Test public void testBatch() throws IOException{ SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //可以执行批量操作的sqlSession SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH); //批量保存执行前时间 long start = System.currentTimeMillis(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); for (int i = 0; i < 1000; i++) { mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1")); } openSession.commit(); long end = System.currentTimeMillis(); //批量保存执行后的时间 System.out.println("执行时长" + (end - start)); //批量 预编译sql一次==》设置参数==》10000次==》执行1次 677 //非批量 (预编译=设置参数=执行 )==》10000次 1121 } finally { openSession.close(); } }
-
mapper и mapper.xml выглядят следующим образом
public interface EmployeeMapper { //批量保存员工 Long addEmp(Employee employee); }
<mapper namespace="com.jourwon.mapper.EmployeeMapper" <!--批量保存员工 --> <insert id="addEmp"> insert into employee(lastName,email,gender) values(#{lastName},#{email},#{gender}) </insert> </mapper>
-
Как получить сгенерированный первичный ключ
-
Добавьте новую метку: keyProperty=" ID "
<insert id="insert" useGeneratedKeys="true" keyProperty="userId" > insert into user( user_name, user_password, create_time) values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP}) </insert>
Что делать, если имя атрибута в классе сущностей отличается от имени поля в таблице?
-
Тип 1: Путем определения псевдонима имени поля в операторе запроса SQL псевдоним имени поля согласуется с именем атрибута класса объектов.
<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order"> select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; </select>
-
Тип 2: пройти
<resultMap>
Для сопоставления однозначного соответствия между именами полей и именами атрибутов класса сущностей.<select id="getOrder" parameterType="int" resultMap="orderResultMap"> select * from orders where order_id=#{id} </select> <resultMap type="com.jourwon.pojo.Order" id="orderResultMap"> <!–用id属性来映射主键字段–> <id property="id" column="order_id"> <!–用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性–> <result property ="orderno" column ="order_no"/> <result property="price" column="order_price" /> </reslutMap>
Какими способами можно написать Mapper?
-
Первый: класс реализации интерфейса наследует SqlSessionDaoSupport: для использования этого метода необходимо написать интерфейс преобразователя, класс реализации интерфейса преобразователя и файл mapper.xml.
-
Настройте расположение mapper.xml в sqlMapConfig.xml.
<mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /> </mappers>
-
Определить интерфейс картографа
-
Реализовать интеграцию классов SqlSessionDaoSupport.
В методе сопоставления this.getSqlSession() можно использовать для добавления, удаления и модификации данных.
-
пружинная конфигурация
<bean id=" " class="mapper 接口的实现"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean>
-
-
Второе: используйте org.mybatis.spring.mapper.MapperFactoryBean:
-
Настройте расположение файла mapper.xml в файле sqlMapConfig.xml.Если файл mapper.xml и интерфейс mappre имеют одинаковое имя и находятся в одном каталоге, настройка здесь не требуется.
-
Определите интерфейс картографа:
<mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /> </mappers>
-
Пространство имен в mapper.xml — это адрес интерфейса картографа.
-
Имя метода в интерфейсе картографа соответствует идентификатору определенного оператора в mapper.xml.
-
Весна определена
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="mapper 接口地址" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
-
-
Третье: используйте маппер-сканер:
-
В файле mapper.xml написано:
Пространство имен в mapper.xml — это адрес интерфейса преобразователя;
Имя метода в интерфейсе сопоставления соответствует идентификатору определенного оператора в mapper.xml;
Если вы сохраните имя файла mapper.xml и интерфейса преобразователя, вам не нужно настраивать его в sqlMapConfig.xml.
-
Определите интерфейс картографа:
Обратите внимание, что имя файла mapper.xml совпадает с именем интерфейса картографа и находится в том же каталоге.
-
Настройте маппер-сканер:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="mapper 接口包地址 "></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean>
-
Получите объект реализации картографа из контейнера Spring после использования сканера.
-
Какова привязка интерфейса MyBatis? Каковы методы реализации?
-
Привязка интерфейса — это произвольное определение интерфейса в MyBatis, а затем привязка метода в интерфейсе к оператору SQL.Можно напрямую вызывать метод интерфейса, чтобы иметь более гибкие варианты выбора и настройки, чем исходный метод, предоставляемый SqlSession. .
-
Существует два способа реализации привязки интерфейса
-
Привязка через аннотации заключается в добавлении аннотаций, таких как @Select и @Update, к методам интерфейса, которые содержат операторы Sql для привязки;
-
Связывание выполняется путем записи SQL в xml.В этом случае пространство имен в указанном файле сопоставления xml должно быть полным путем к интерфейсу. Когда оператор Sql относительно прост, используйте привязку аннотации, когда оператор SQL более сложный, используйте привязку xml, как правило, больше привязки xml.
-
Каковы требования для использования картографического интерфейса MyBatis?
- Имя метода интерфейса Mapper совпадает с идентификатором каждого sql, определенного в mapper.xml.
- Тип входного параметра метода интерфейса Mapper совпадает с типом параметра каждого sql, определенного в mapper.xml.
- Тип выходного параметра метода интерфейса Mapper совпадает с типом результата каждого sql, определенного в mapper.xml.
- Пространство имен в файле Mapper.xml — это путь к классу интерфейса сопоставления.
Как работает этот интерфейс Dao? Метод в интерфейсе Дао, когда параметры разные, метод можно перегрузить?
-
Принцип работы интерфейса Dao - динамический прокси JDK. Mybatis будет использовать динамический прокси JDK для создания прокси-объекта прокси для интерфейса Dao во время выполнения. Прокси-объект прокси перехватит метод интерфейса, выполнит sql, представленный MappedStatement , а затем вернуть результат выполнения sql.
-
Метод в интерфейсе Dao не может быть перегружен, потому что это стратегия сохранения и поиска полное имя + имя метода.
В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?
-
Различные файлы сопоставления Xml, если пространство имен настроено, идентификатор может повторяться; если пространство имен не настроено, идентификатор не может повторяться; в конце концов, пространство имен не обязательно, это просто лучшая практика.
-
Причина в том, что namespace+id используется в качестве ключа Map
.Если пространства имен нет, останется id, а дублирование id приведет к тому, что данные будут накладываться друг на друга. С пространством имен естественный идентификатор может повторяться.Если пространство имен отличается, пространство имен + идентификатор, естественно, будут другими.
Кратко опишите отношение сопоставления между файлом сопоставления Xml Mybatis и внутренней структурой данных Mybatis?
- Ответ: Mybatis инкапсулирует всю информацию о конфигурации XML в тяжеловесную конфигурацию объекта All-In-One. В файле сопоставления XML
<parameterMap>
Тег анализируется как объект ParameterMap, а каждый из его дочерних элементов анализируется как объект ParameterMapping.<resultMap>
Тег анализируется как объект ResultMap, а каждый из его дочерних элементов анализируется как объект ResultMapping. Каждый<select>
,<insert>
,<update>
,<delete>
Теги будут проанализированы как объекты MappedStatement, а sql в тегах будут проанализированы как объекты BoundSql.
Как Mybatis инкапсулирует результат выполнения sql в качестве целевого объекта и возвращает его? Что такое картографические формы?
-
Первый заключается в использовании
<resultMap>
Метка, которая определяет отношение сопоставления между именами столбцов и именами атрибутов объекта одно за другим. -
Во-вторых, использовать функцию псевдонима столбца sql для записи псевдонима столбца в качестве имени атрибута объекта, такого как T_NAME AS NAME, имя атрибута объекта обычно является именем в нижнем регистре, но имя столбца не чувствительно к регистру, Mybatis будет игнорировать регистр имени столбца, интеллектуально найти соответствующее имя атрибута объекта, вы даже можете написать T_NAME AS NaMe, Mybatis может нормально работать.
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
В файле сопоставления Xml, помимо общих тегов select|insert|updae|delete, какие еще есть теги?
- Есть много других тегов,
<resultMap>
,<parameterMap>
,<sql>
,<include>
,<selectKey>
, плюс 9 тегов динамического sql, trim|where|set|foreach|if|choose|when|иначе|bind и т. д., где<sql>
Для тега фрагмента sql передайте<include>
Тег вводит фрагмент sql,<selectKey>
Создайте метки политики для первичных ключей, которые не поддерживают автоинкремент.
В файле сопоставления Mybatis, если тег A ссылается на содержимое тега B посредством включения, может ли тег B быть определен после тега A или должен быть определен перед тегом A?
-
Хотя Mybatis анализирует файл сопоставления Xml по порядку, тег B, на который делается ссылка, все еще может быть определен где угодно, и Mybatis может правильно его идентифицировать.
-
Принцип заключается в том, что mybatis анализирует тег A, обнаруживает, что тег A ссылается на тег B, но тег B не анализируется, не существует, в это время Mybatis отмечает тег A как неразрешенное состояние, затем продолжает разобрать оставшуюся метку, включая метку B
Может ли Mybatis выполнять контактные запросы «один ко многим», «один к одному» и каковы методы реализации?
- Да не только можно один ко многим, один к одному можно еще и многие ко многим, один ко многим
- Метод реализации:
- Отправьте отдельный SQL для запроса связанного объекта, назначьте его основному объекту и верните основной объект.
- Используйте вложенный запрос, аналогичный запросу JOIN, одна часть которого является значением атрибута объекта A, а другая часть является значением атрибута связанного объекта B. Преимущество состоит в том, что пока отправляется одно значение атрибута, основной объект и связанные объект можно проверить.
- подзапрос
Можно ли сопоставить классы перечисления Enum в Mybatis?
-
Mybatis может отображать классы перечисления, не только классы перечисления, Mybatis может отображать любой объект в столбец таблицы. Метод сопоставления заключается в настройке TypeHandler и реализации интерфейсных методов setParameter() и getResult() TypeHandler.
-
TypeHandler имеет две функции: одна — завершить преобразование из javaType в jdbcType, а другая — завершить преобразование из jdbcType в javaType, что отражено в двух методах setParameter() и getResult(), которые представляют установку вопросительного знака sql. параметры заполнителя и получение столбцов соответственно результат поиска.
Что делает Mybatis dynamic sql? Какие динамические sql существуют? Можете вкратце описать принцип реализации динамического sql?
-
Mybatis dynamic sql позволяет нам писать динамический sql в виде тегов в файле сопоставления Xml, чтобы завершить функции логического суждения и динамического объединения sql.Mybatis предоставляет 9 динамических тегов sql trim|where|set|foreach|if|choose| когда|иначе|связать.
-
Его принцип выполнения заключается в использовании OGNL для вычисления значения выражения из объекта параметра sql и динамического объединения sql в соответствии со значением выражения, чтобы завершить функцию динамического sql.
Как Mybatis выполняет пейджинг? Каков принцип работы плагина подкачки?
-
Mybatis использует объект RowBounds для пейджинга, который представляет собой пейджинг памяти для набора результатов ResultSet, а не физического пейджинга.Вы можете напрямую писать параметры с физическим пейджингом в sql для выполнения функции физического пейджинга, или вы можете использовать подключаемый модуль пейджинга для завершения физический пейджинг.
-
Основной принцип подключаемого модуля подкачки заключается в использовании интерфейса подключаемого модуля, предоставленного Mybatis, для реализации пользовательского подключаемого модуля, перехвата sql, который должен быть выполнен в методе перехвата подключаемого модуля, затем перезаписи sql и добавления соответствующий оператор физического пейджинга и параметры физического пейджинга в соответствии с диалектным диалектом.
-
Например: select * from student, после перехвата sql переписать так: select t.* from (выбрать * from student) t limit 0, 10
Кратко опишите принцип работы плагина Mybatis и как написать плагин.
-
Mybatis может писать плагины только для четырех интерфейсов ParameterHandler, ResultSetHandler, StatementHandler и Executor.Mybatis использует динамический прокси JDK для создания прокси-объектов для интерфейсов, которые необходимо перехватить для реализации функции перехвата метода интерфейса. он войдет в метод перехвата, в частности, в метод invoke() InvocationHandler.Конечно, будут перехвачены только те методы, которые вы укажете для перехвата.
-
Реализуйте интерфейс Interceptor Mybatis и переопределите метод intercept(), а затем напишите аннотации к подключаемому модулю, чтобы указать, какие методы какого интерфейса вы хотите перехватывать. Помните, не забудьте настроить подключаемый модуль, который вы написали в файл конфигурации.
Кэш Mybatis уровня 1 и уровня 2
-
Кэш уровня 1: локальный кеш HashMap на основе PerpetualCache, его областью хранения является сеанс, когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены, а кеш уровня 1 будет открыт по умолчанию.
-
Механизм кеша второго уровня такой же, как у кеша первого уровня, по умолчанию для хранения используются PerpetualCache и HashMap, разница в том, что его областью хранения является Mapper (Namespace), а источником хранения может быть настраиваемые, такие как Ehcache. Кэш второго уровня не открывается по умолчанию.Чтобы включить кеш второго уровня, использование класса атрибута кеша второго уровня должно реализовать интерфейс сериализации Serializable (который можно использовать для сохранения состояния объекта), который можно настроить в его файле сопоставления.
<cache/>
-
Для механизма обновления данных кэша, когда операция C/U/D выполняется в области (сеанс кэша первого уровня/пространства имен кэша второго уровня), кэши во всех выборках в этой области будут очищены по умолчанию.