[Интервьюер говорит, а я слушаю] — распространенные вопросы MyBatis для интервью

интервью

[Интервьюер говорит, а я слушаю] — распространенные вопросы MyBatis для интервью

Добро пожаловать, чтобы обратить внимание на серию статей и учиться вместе «Повышение способностей, повышение зарплаты может ждать»
«Собеседование знание, работу можно ждать»
"Настоящая боевая муштра, отбраковать 996 статей"
Также приглашаем обратить внимание на общедоступную учетную запись WeChat [Ccww Technology Blog], оригинальная техническая статья будет запущена в первый раз.
Если эта статья оказалась для вас полезной и понравилась, ставьте лайк и подписывайтесь!

Прошлый цикл статей:

В чем разница между #{} и ${}?

  • Когда mybatis обрабатывает #{}, он заменяет #{} в sql знаком ? и вызывает метод set в PreparedStatement для присвоения значения.

  • Когда mybatis обрабатывает ${}, он заменяет ${} значением переменной.

  • Использование #{} может эффективно предотвратить внедрение SQL и повысить безопасность системы. Причина: механизм прекомпиляции.После завершения предварительной компиляции структура SQL была исправлена, даже если пользователь введет недопустимые параметры, структура SQL не пострадает, что позволит избежать потенциальных угроз безопасности.

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

Поскольку ${} вызовет внедрение sql, зачем вам ${} с #{}? В чем смысл его существования?

#{} в основном используется для предварительной компиляции, и сцена предварительной компиляции на самом деле очень ограничена, в то время как ${} используется для замены, и многие сцены будут заменены, и такая сцена не является предварительной компиляцией

Как справиться с прерыванием связи с базой данных

Нижний уровень доступа к базе данных реализуется через tcp, когда соединение прерывается, программа не может знать об этом, что приводит к тому, что программа останавливается здесь на определенный период времени, что в конечном итоге приведет к плохому взаимодействию с пользователем. ненормального прерывания соединения с базой данных, как настроить mybatis?

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

  • max_idle_time : Указывает максимальное время простоя, после которого сокет будет закрыт
  • connect_timeout : указывает время ожидания соединения

Сервер базы данных жив и здоров, но клиент по-прежнему не может подключиться к серверу из-за перегруженности сети, в это время следует установить тайм-аут, а не ждать бездумно.

В процессе разработки мы часто сталкиваемся с явлением дублирования вставок, как решить эту ситуацию?

Процесс вставки обычно делится на два шага: сначала определить, есть ли запись, если записи нет, вставить ее или нет. Если есть параллельные операции, первый шаг выполняется одновременно, а затем все обнаруживают, что записи нет, а затем вставляют данные, вызывая дублирование данных.

Решения для вставки повторяющихся идей:

  • Сначала определите, есть ли данные в базе данных, и если да, то ничего не делайте. Если данных нет, переходите к следующему шагу;
  • Чтобы повторно установить ключ, только одна операция вставки A будет успешной, другие параллельные операции (B и C...) завершатся ошибкой;
  • Когда операция A набора ключа завершается успешно, начинается операция вставки данных.Независимо от того, успешно ли вставлены данные, ключ redis необходимо удалить. [Примечание] Если вставка не удалась, вы можете попробовать несколько раз, чтобы увеличить вероятность успеха;
  • Однако операции B и C, которым не удалось установить ключ, перейти в спящий режим, и операция вставки, выигравшая соревнование, повторяют описанные выше шаги.

Резюме: многопоточность вставляет данные одновременно, кто бы ни получил блокировку и успешно вставил данные, другие потоки ничего не делают. Когда вставка данных не удалась, другие потоки захватывают блокировку для вставки данных.

Как бороться с простоями во время выполнения транзакций

Когда база данных вставляет миллионы данных, операция не завершена, но если сервер перезапустить, будет ли база данных продолжать выполняться? Или просто откатиться?

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

Когда транзакция открыта, операции в транзакции сначала будут записаны в буфер журнала механизма хранения. Прежде чем транзакция будет зафиксирована, эти буферизованные журналы необходимо заранее сбросить на диск для сохранения. Существует два типа:

В процессе выполнения транзакции помимо записи журнала повторов также записывается определенный объем журнала отмен.

  • журнал повторов: в соответствии с порядком выполнения операторов записывать их поочередно по очереди
  • журнал отмены: в основном для отката транзакций. Журнал отмены записывает состояние данных перед каждой операцией.Если транзакцию необходимо откатить во время выполнения, операция отката может быть выполнена в соответствии с журналом отмены.

Соответствует ли соединение в клиенте Java потоку в MySQL для обработки этого соединения?

Соединение в клиенте Java не соответствует потоку в MySQL для обработки этого соединения, но:

Он обрабатывается основным потоком, прослушивающим сокет + фиксированное количество рабочих потоков в пуле потоков.

Нижний уровень высокопроизводительной серверной разработки в основном обрабатывается мультиплексированием ввода-вывода.

Один поток + механизм обработки событий

В MySQL есть основной поток, представляющий собой одиночный поток (немного отличающийся от идеи многопоточности в Java), который постоянно зацикливается, чтобы увидеть, есть ли в сокете события чтения и записи, и есть ли чтения и записи, он будет отправлен из пула потоков. Найдите рабочий поток для обработки событий чтения и записи этого сокета, и рабочий поток вернется в пул потоков после завершения.

Какова связь между интерфейсом Dao в Mybatis и SQL в файле XML?

  • Анализ XML: инициализация SqlSessionFactoryBean будет анализировать все файлы XML в пути mapperLocations.
    • Создайте SqlSource: Mybatis инкапсулирует каждый тег SQL в объект SqlSource, который может быть динамическим SQL или статическим SQL.
    • Создать MappedStatement: каждый тег SQL в файле XML соответствует объекту MappedStatement, а XML анализируется конфигурацией.
  • Прокси-сервер интерфейса Dao: динамический прокси-сервер FactoryBean и JDK в Spring возвращает прокси-объект интерфейса Dao, который можно внедрить.
  • Выполнение: Получите объект MappedStatement через полный тип оператора + имя метода, а затем выполните конкретный SQL через исполнителя и верните

Что делать, если имя атрибута в классе сущностей отличается от имени поля в таблице?

  • Определив псевдоним имени поля в операторе sql запроса, сделайте псевдоним имени поля совместимым с именем атрибута класса сущности.
  • Используйте для сопоставления однозначного соответствия между именами полей и именами атрибутов класса сущностей.

Как написать нечеткий запрос, подобный оператору?

  • Добавить подстановочный знак sql в код Java
string name = "%Ccww%"; 
list<name> names = mapper.selectName(name);
<select id="selectName"> 
	select * from users where name like #{value} 
</select>
  • Объединение подстановочных знаков в операторах sql приведет к внедрению sql
<select id="selectName">
    select * from users where name like "%"#{value}"%"
</select>

Какова привязка интерфейса MyBatis? Каковы методы реализации?

Привязка интерфейса: произвольно определите интерфейс в MyBatis, а затем привяжите метод интерфейса к оператору SQL. Мы можем напрямую вызывать метод интерфейса. По сравнению с методом, предоставляемым SqlSession, у нас может быть более гибкий выбор и настройки.

Существует два способа реализации привязки интерфейса:

  • Привязка через аннотации: добавьте @Select, @Update и другие аннотации к методам интерфейса, которые содержат операторы Sql для привязки;
  • Привязка через xml: чтобы указать пространство имен в файле сопоставления xml, это должен быть полный путь к интерфейсу.

Вопросы, требующие внимания при вызове интерфейса сопоставления MyBatis

  • Имя метода интерфейса Mapper совпадает с идентификатором каждого sql, определенного в mapper.xml;
  • Тип входного параметра метода интерфейса Mapper совпадает с типом параметра каждого sql, определенного в mapper.xml;
  • Тип выходного параметра метода интерфейса Mapper совпадает с типом результата каждого sql, определенного в mapper.xml;
  • Пространство имен в файле Mapper.xml — это путь к классу интерфейса сопоставления.

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

  • Интерфейс Dao — это интерфейс Mapper.

  • Полное имя интерфейса — это значение пространства имен в файле сопоставления;

  • Имя метода интерфейса — это значение id оператора Mapper в файле сопоставления;

  • Параметры в методе интерфейса — это параметры, передаваемые в sql.

Интерфейс Mapper не имеет класса реализации.При вызове метода интерфейса полное имя интерфейса + объединенная строка имени метода используется в качестве значения ключа, которое может однозначно найти MapperStatement. В Mybatis каждый тег

Методы в интерфейсе Mapper не могут быть перегружены, так как они используют полное имя + имя метода Стратегия сохранения и поиска. Принцип работы интерфейса Mapper – динамический прокси-сервер JDK. Mybatis будет использовать динамический прокси-сервер JDK для создания прокси-объекта прокси-объекта для интерфейса Mapper во время выполнения. Прокси-объект перехватит метод интерфейса, выполнит sql, представленный MapperStatement, а затем вернуть результат выполнения sql.

В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?

На основании вышеизложенного видно, что

Statement=namespace+id

Если пространство имен настроено, его можно повторить, но если пространство имен не настроено, тот же идентификатор вызовет перезапись.

Какова роль тайников первого и второго уровня Mybatis?

(1) Кэш уровня 1: локальный кеш HashMap на основе PerpetualCache, областью хранения которого является сеанс, когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены, а кеш уровня 1 будет открыт по умолчанию.

(2) Механизм кеша второго уровня такой же, как у кеша первого уровня, по умолчанию для хранения используются PerpetualCache и HashMap, разница в том, что его областью хранения является Mapper (Namespace), а областью хранения источник можно настроить, например, Ehcache. Кэш второго уровня не открывается по умолчанию.Чтобы включить кеш второго уровня, использование класса атрибута кеша второго уровня должно реализовать интерфейс сериализации Serializable (который можно использовать для сохранения состояния объекта), который может быть настроен в его файле сопоставления;

(3) Для механизма обновления данных кеша, когда операция C/U/D выполняется в определенной области (сеанс кеша первого уровня/пространства имен кеша второго уровня), кеши во всех выборках в этой области будут очищены дефолт.

Как Mybatis выполняет пейджинг? Каков принцип работы плагина пейджинга?

Mybatis использует объект RowBounds для разбиения по страницам, которое выполняется для набора результатов ResultSet.подкачка памяти, вместоПейджинг базы данных.

В реальных сценариях используются следующие две схемы:

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

Оба основаны на подкачке базы данных, разница в том, что первый — инженерруководствоНапишите условия разбивки на страницы, которые являются плагинамиавтоматическийДобавьте условия пагинации.


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

Пример:SELECT * FROM student, после перехвата SQL перепишите его так:select * FROM student LIMI 0,10.

В настоящее время на рынке широко используются следующие плагины пейджинга MyBatis:

Что делает динамический SQL Mybatis? Какие виды динамического SQL существуют? Можете ли вы кратко описать принцип выполнения динамического SQL?

  • Динамический SQL Mybatis позволяет нам писать динамический SQL в виде тегов XML в файле сопоставления XML для выполнения функций логического суждения и динамического объединения SQL.
  • Mybatis предоставляет 9 динамических тегов SQL:
    • <if>
    • <choose>
    • <when>
    • <otherwise>
    • <trim>
    • ,
    • <set>
    • <foreach>
    • <bind>
  • Принцип его выполнения заключается в использованииOGNLВыражение, вычисление значения выражения из объекта параметра SQL и динамическое объединение SQL в соответствии со значением выражения, чтобы завершить функцию динамического SQL.

Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?

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

В файле конфигурации Mybatis вы можете указать, следует ли включать отложенную загрузку:

lazyLoadingEnabled=true|false.

Принцип заключается в том, что CGLIB используется для создания прокси-объекта целевого объекта, а при вызове целевого метода вводится метод-перехватчик.

Например, когда вызывается a.getB().getName(), метод перехватчика invoke() обнаруживает, что a.getB() является нулевым значением, затем он отправляет sql предварительно сохраненного запроса, связанного с B объекта отдельно, запросите B, а затем вызовите a.setB(b), чтобы свойство объекта b объекта a имело значение, а затем завершите вызов метода a.getB().getName(). Это основной принцип ленивой загрузки.

Разумеется, не только Mybatis, но и почти все, включая Hibernate, поддерживают тот же принцип отложенной загрузки.

Какие Исполнители есть у Mybatis? В чем разница между ними?

Mybatis имеет три основных исполнителя Executor,SimpleExecutor, ReuseExecutor, BatchExecutor.

  • **SimpleExecutor:** Каждый раз, когда выполняется обновление или выбор, открывается объект Statement, который закрывается сразу после использования.

  • **ReuseExecutor:** выполнить обновление или выбрать, использовать sql в качестве ключа для поиска объекта Statement, использовать его, если он существует, и создать его, если он не существует.После использования объект Statement не закрывается, а помещается в Map для следующего использования. Короче говоря, повторно используйте объекты Statement.

  • **BatchExecutor:** выполнить обновление (без выбора, пакет JDBC не поддерживает выбор), добавить все sql в пакет (addBatch()), дождаться унифицированного выполнения (executeBatch()), он кэширует несколько объектов операторов, каждый оператор объект находится после завершения addBatch(), ожидая выполнения пакетов executeBatch() один за другим. То же, что пакетная обработка JDBC.

Сфера действия: эти функции Executor строго ограничены рамками жизненного цикла SqlSession.

В конфигурационном файле Mybatis можно указать тип исполнителя ExecutorType по умолчанию или можно вручную передать параметр типа ExecutorType в метод создания SqlSession из DefaultSqlSessionFactory.

Разница между MyBatis и Hibernate

  • hibernate полностью автоматический, а mybatis полуавтоматический
  • Портативность базы данных hibernate намного выше, чем у mybatis.
  • hibernate имеет полную систему логирования, mybatis не хватает некоторых
  • По сравнению со спящим режимом, mybatis должен заботиться о многих деталях.
  • С точки зрения прямой оптимизации sql, mybatis гораздо удобнее, чем hibernate
  • С точки зрения механизма кэширования, hibernate лучше, чем mybatis.

Суммировать:

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

Справочная статья:

Woohoo. Не обновился. Talent /category/in…

блог woo woo woo.cn на.com/resolve/fear/…

Это кодер VIP.IO. Может /моя бита/инт...

Вы в порядке, офицеры? Если вам это нравится, проведите пальцем, чтобы нажать 💗, нажмите, чтобы подписаться! ! Спасибо за Вашу поддержку!

Добро пожаловать в публичный аккаунт【Технический блог Ccww], впервые была запущена оригинальная техническая статья