Введение в MyBatis
Что такое MyBatis?
MyBatis — это превосходная структура уровня персистентности, структура полу-ORM (объектно-реляционное сопоставление), которая поддерживает пользовательский SQL, хранимые процедуры и расширенное сопоставление. MyBatis избегает почти всего кода JDBC и ручной настройки параметров и выборки наборов результатов. MyBatis может использовать простой XML или аннотации для настройки и сопоставления собственных типов, интерфейсов и Java POJO (обычных старых объектов Java) с записями в базе данных.
ОРМ
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
преимущество
По сравнению с традиционными технологиями доступа к базам данных ORM имеет следующие преимущества:
Основанный на программировании операторов SQL, он достаточно гибок и не окажет никакого влияния на существующую структуру приложения или базы данных.SQL написан в формате XML, который отделяет SQL от программного кода и упрощает унифицированное управление;предоставляет теги XML для поддержки записи динамических данных. Операторы SQL и могут быть повторно использованы
По сравнению с JDBC он уменьшает объем кода более чем на 50%, устраняет много избыточного кода в JDBC и не требует ручного переключения соединений.
Он очень совместим с различными базами данных (поскольку MyBatis использует JDBC для подключения к базе данных, поэтому база данных, поддерживаемая JDBC, поддерживается MyBatis).
Предоставляет метки сопоставления для поддержки сопоставления отношений полей ORM между объектами и базами данных; предоставляет метки объектно-реляционного сопоставления для поддержки обслуживания объектно-реляционных компонентов.
Может хорошо интегрироваться с Spring
недостаток
Рабочая нагрузка по написанию операторов SQL велика, особенно когда имеется много полей и связанных таблиц, к разработчикам предъявляются определенные требования для написания операторов SQL.
Операторы SQL зависят от базы данных, что приводит к плохой переносимости базы данных, и базу данных нельзя заменить по желанию.
Применимые сценарии фреймворка MyBatis
MyBatis фокусируется на самом SQL и является достаточно гибким решением уровня DAO.
MyBatis будет хорошим выбором для проектов с высокими требованиями к производительности или проектов с большим количеством изменений в требованиях, таких как интернет-проекты.
Разница между Hibernate и MyBatis
Та же точка
Все они являются инкапсуляцией JDBC, все они являются основой слоя настойчивости, и все они используются для разработки слоя DAO.
разница
Сопоставление отношений
MyBatis — это полуавтоматическая структура сопоставления, которая настраивает соответствующие отношения между объектами Java и результатами выполнения операторов SQL, а конфигурация многотабличных ассоциаций проста.
Hibernate — это полная структура отображения таблиц, которая настраивает соответствие между объектами Java и таблицами базы данных, а конфигурация многотабличных ассоциаций сложна.
Оптимизация SQL и переносимость
Hibernate инкапсулирует операторы SQL и предоставляет такие функции, как ведение журнала, кэширование и каскадирование (каскадирование более мощное, чем MyBatis). Кроме того, он также предоставляет HQL (язык запросов Hibernate) для работы с базой данных. Он поддерживает хорошую независимость базы данных, но потребляет больше представление. Если проекту необходимо поддерживать несколько баз данных, объем разработки кода невелик, но оптимизация операторов SQL затруднена.
MyBatis должен вручную писать SQL, поддерживает динамический SQL, обработку списков, динамическое создание имен таблиц и поддержку хранимых процедур. Объем разработки относительно большой. Непосредственное использование операторов SQL для работы с базой данных не обеспечивает независимости базы данных, но оптимизация операторов SQL проста.
Простота разработки и стоимость обучения
Hibernate — тяжеловесный фреймворк с высоким порогом обучения и использования, подходит для небольших и средних проектов с относительно стабильными требованиями, таких как системы автоматизации делопроизводства.
MyBatis — это легкий фреймворк с низким порогом обучения и использования, подходящий для масштабных проектов с частыми изменениями спроса, таких как: Интернет-система электронной коммерции
Суммировать
MyBatis — это небольшая, удобная, эффективная, простая, прямая, полуавтоматическая структура слоя сохраняемости.
Hibernate — это мощная, удобная, эффективная, сложная, непрямая, полностью автоматизированная структура слоя сохраняемости.
Аналитические и операционные принципы MyBatis
Каковы этапы программирования MyBatis?
1. Создайте SqlSessionFactory
2. Создайте SqlSession через SqlSessionFactory.
3. Выполнение операций с базой данных через sqlsession
4. Вызовите session.commit(), чтобы зафиксировать транзакцию
5. SESSESS SESSIC.CLOSE (), чтобы закрыть сеанс
Пожалуйста, поговорите о принципе работы MyBatis
Прежде чем изучать программу MyBatis, вам необходимо понять, как работает MyBatis, чтобы понять программу. Принцип работы MyBatis следующий.
1) Прочтите файл конфигурации MyBatis: mybatis-config.xml — это глобальный файл конфигурации MyBatis, который настраивает операционную среду и другую информацию MyBatis, например информацию о подключении к базе данных.
2) Загрузите файл сопоставления. Файл сопоставления — это файл сопоставления SQL, который настраивает операторы SQL для работы с базой данных и должен быть загружен в файл конфигурации MyBatis mybatis-config.xml. Файл mybatis-config.xml может загружать несколько файлов отображения, каждый из которых соответствует таблице в базе данных.
3) Создайте фабрику сеансов: создайте фабрику сеансов SqlSessionFactory с помощью информации о конфигурации, такой как среда MyBatis.
4) Создайте объект сеанса: объект SqlSession создается фабрикой сеансов, которая содержит все методы для выполнения операторов SQL.
5) Executor executor: нижний уровень MyBatis определяет интерфейс Executor для работы с базой данных, который будет динамически генерировать операторы SQL для выполнения в соответствии с параметрами, переданными SqlSession, а также отвечает за обслуживание кэша запросов.
6) Объекты MappedStatement: есть тип интерфейса MappedStatement Executor параметра, выполняющего метод, параметр представляет собой инкапсуляцию информации о сопоставлении, для хранения информации для сопоставления идентификатора оператора SQL и других параметров.
7) Сопоставление входных параметров. Типы входных параметров могут быть типами коллекций, такими как карта и список, а также базовыми типами данных и типами POJO. Процесс сопоставления входных параметров аналогичен процессу JDBC установки параметров в объектах prepareStatement.
8) Отображение результатов вывода. Типом результата вывода могут быть типы коллекций, такие как карта и список, а также базовые типы данных и типы POJO. Процесс сопоставления выходных результатов аналогичен процессу синтаксического анализа JDBC для наборов результатов.
Какова функциональная архитектура MyBatis
Мы разделяем функциональную архитектуру Mybatis на три слоя:
Уровень интерфейса API: интерфейс API предоставляется для внешнего использования, и разработчики управляют базой данных через эти локальные API. Как только уровень интерфейса получит запрос на вызов, он вызовет уровень обработки данных для завершения конкретной обработки данных.
Уровень обработки данных: отвечает за конкретный поиск SQL, анализ SQL, выполнение SQL и обработку сопоставления результатов выполнения и т. д. Его основная цель — завершить операцию базы данных в соответствии с запросом на вызов.
Базовый уровень поддержки: отвечает за самые основные функции поддержки, включая управление соединениями, управление транзакциями, загрузку и настройку кэширования, это общие вещи, которые выделяют их как самые основные компоненты. Самая базовая поддержка обработки данных верхнего уровня.
Какие Исполнители есть у Mybatis?В чем разница между ними?
Mybatis имеет три основных исполнителя Executor: SimpleExecutor, ReuseExecutor, BatchExecutor.
SimpleExecutor: каждый раз, когда выполняется обновление или выбор, открывается объект Statement, который закрывается сразу после использования.
ReuseExecutor: выполнить обновление или выбрать, использовать sql в качестве ключа для поиска объекта Statement, использовать его, если он существует, и создать его, если он не существует.После его использования объект Statement не закрывается, а помещается в Map
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 Association поддерживает только ленивую загрузку соответствующей коллекции объектов и коллекцию связанных объектов, ассоциация относится к одной, коллекция относится к многим запросам. В файле конфигурации MyBatis вы можете настроить, следует ли включить ленивую загрузку LazyloadingEngeDenableD = 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 для присвоения значения.
Когда Mybatis обрабатывает, передается исходное значение, то есть при передаче {} передается исходное значение, то есть при передаче исходного значения необходимо заменить {} значением переменная, которая эквивалентна компиляции оператора в JDBC
После подстановки переменной, # {} соответствующая переменная автоматическая с апострофом ''; переменная после подстановки, соответствующая переменной ${} не является апострофом ''
#{} может эффективно предотвратить внедрение SQL и повысить безопасность системы; ${} не может предотвратить внедрение SQL
Подстановка переменной для #{} находится в СУБД, подстановка переменной для ${} вне СУБД
<在mapper中如何传递多个参数方法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括号里面修饰的名称。这种方法在参数不多的情况还是比较直观的,推荐使用。
如何获取生成的主键
Для баз данных, поддерживающих автоинкремент первичного ключа (MySQL)
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" > insert into user( user_name, user_password, create_time) values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})</insert>
Тип параметра не может быть записан, Mybatis может сделать вывод о типе входящих данных. Если вы хотите получить доступ к первичному ключу, то параметрType должен быть сущностью Java или картой. Таким образом, после вставки данных значение первичного ключа можно получить через объект ava или карту. Получить первичный ключ через getUserId
Базы данных, не поддерживающие автоинкремент первичных ключей (Oracle)
Для таких данных, как Oracle, он не обеспечивает функцию автоматического увеличения первичного ключа, а использует метод последовательности для получения автоматического увеличения первичного ключа.
Вы можете использовать тег
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE"></selectKey>
Какими способами можно написать Mapper?
Первый тип: класс реализации интерфейса. Наследование SQLSESSIONDAOSUPPORT: используйте этот метод для написания интерфейса преобразователя, класса реализации интерфейса преобразователя, файла mapper.xml.
(1) Настройте расположение mapper.xml в sqlMapConfig.xml.
<mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /></mappers>
(2) Определите интерфейс картографа
(3) Реализовать интеграцию классов SqlSessionDaoSupport
Способ данных Mapper Crud this.getsqlsession ().
(4) пружинная конфигурация
<bean id=" " class="mapper 接口的实现"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property></bean>
Какова привязка интерфейса MyBatis?Каковы методы реализации?
Привязка интерфейса — это произвольное определение интерфейса в MyBatis, а затем привязка метода в интерфейсе к оператору SQL.Можно напрямую вызывать метод интерфейса, чтобы иметь более гибкие варианты выбора и настройки, чем исходный метод, предоставляемый SqlSession. .
Существует два способа реализации привязки интерфейса
Привязка через аннотации заключается в добавлении аннотаций, таких как @Select и @Update, к методам интерфейса, которые содержат операторы Sql для привязки;
Связывание выполняется путем записи SQL в xml.В этом случае пространство имен в указанном файле сопоставления xml должно быть полным путем к интерфейсу. Когда оператор Sql относительно прост, используйте привязку аннотации, когда оператор SQL более сложный, используйте привязку xml, как правило, больше привязки xml.
Каковы требования для использования картографического интерфейса MyBatis?
1. Имя метода интерфейса Mapper совпадает с идентификатором каждого sql, определенного в mapper.xml.
2. Тип входного параметра метода интерфейса Mapper совпадает с типом параметра каждого sql, определенного в mapper.xml.
3. Тип выходного параметра метода интерфейса Mapper совпадает с типом результата каждого sql, определенного в mapper.xml.
4. Пространство имен в файле Mapper.xml — это путь к классу интерфейса преобразователя.
Лучшая практика - это обычно файл отображения XML, напишет соответствующий интерфейс для DAO, могу я спросить, какой принцип работы интерфейса является DAO?Способ в интерфейсе DAO, когда параметры разные, могут ли метод перегружен?
Интерфейс Dao — это интерфейс Mapper, о котором часто говорят, полное имя интерфейса — это значение пространства имен в файле сопоставления, имя метода интерфейса — это значение идентификатора MappedStatement в файле сопоставления, а параметры — в интерфейсе. метод передаются в параметр sql. Интерфейс Mapper не имеет класса реализации.При вызове метода интерфейса в качестве значения ключа используется объединенная строка полного имени интерфейса и имени метода, которая может однозначно найти MappedStatement.
Пример: com.mybatis3.mappers.StudentDao.findStudentById,
Единственное пространство имен, которое можно найти, это com.mybatis3.mappers.StudentDao.
Ниже MappedStatement с id = findStudentById.
В Mybatis каждый тег
Метод в интерфейсе Dao не может быть перегружен, потому что это стратегия сохранения и поиска полное имя + имя метода.
Принцип работы интерфейса Dao - динамический прокси JDK. Mybatis будет использовать динамический прокси JDK для создания прокси-объекта прокси для интерфейса Dao во время выполнения. Прокси-объект прокси перехватит метод интерфейса, выполнит sql, представленный MappedStatement , а затем вернуть результат выполнения sql.
Динамический SQL
Что делает Mybatis dynamic sql?Какие динамические sql существуют?Можете вкратце описать принцип реализации динамического sql?
Mybatis dynamic sql позволяет нам писать динамический sql в виде тегов в файле сопоставления Xml, чтобы завершить функции логического суждения и динамического объединения sql.Mybatis предоставляет 9 динамических тегов sql trim|where|set|foreach|if|choose| когда|иначе|связать.
Его принцип выполнения, используя OGNL для расчета значения экспрессии от объекта параметра 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) Кэш уровня 1: локальный кеш HashMap на основе PerpetualCache, его областью хранения является сеанс, когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены, а кеш уровня 1 будет открыт по умолчанию.
2) Механизм кеша второго уровня такой же, как у кеша первого уровня.По умолчанию для хранения используются PerpetualCache и HashMap.Разница в том, что его областью хранения является Mapper (Namespace), а источником хранения можно настроить, например Ehcache. Кэш второго уровня не открывается по умолчанию.Чтобы включить кеш второго уровня, использование класса атрибута кеша второго уровня должно реализовать интерфейс сериализации Serializable (который можно использовать для сохранения состояния объекта), который можно настроить в его файле сопоставления
3) Для механизма обновления данных кэша, когда операция C/U/D выполняется в области (сеанс кэша первого уровня/пространства имен кэша второго уровня), кэши во всех выборках в этой области будут очищены по умолчанию.
Я разобрал кое-какую архитектуру Java и материалы интервью (микросервисы, кластеры, распределенное ПО, промежуточное ПО и т. д.), а друзья, которым это нужно, могут подписаться на паблик [Java Cultivator] и получить его самостоятельно без всяких рутин