❝Лично для меня одной из важных основ этой части исходного кода является отражение, но я не буду публиковать здесь исходный код, просто изучу отражение Java.
❞
контурная карта
Что такое постоянство данных?
Постоянство данных — это"ОЗУ"середина"данные"модель преобразована в"место хранения"Модель и общий термин для преобразования модели хранения в модель данных в памяти. Например, хранение файлов и чтение данных — все это операции сохранения данных. Модель данных может быть любой."Модели структур данных или объектов, XML, бинарные потоки"Ждать. Когда мы пишем приложение для работы с базой данных, выполняем операции с данными таблицы"CRUD"Время операции — это операция сохранения данных.
Введение в Mybatis Framework
- "Платформа MyBatis — это среда хранения данных с открытым исходным кодом."
- "Он инкапсулирует операцию доступа к базе данных через JDBC, поддерживает общие SQL-запросы, хранимые процедуры и расширенное отображение и почти исключает все коды JDBC и ручную настройку параметров и получение наборов результатов."
- "Основная идея MyBatis как структуры уровня сохраняемости состоит в том, чтобы исключить из программы большое количество операторов SQL и настроить их в файле конфигурации для реализации гибкой конфигурации SQL."
- "Преимущество этого в том, что SQL отделен от кода программы, и SQL можно модифицировать прямо в конфигурационном файле без изменения кода."
Что такое ОРМ?
ORM (объектное/реляционное отображение)"Реляционное сопоставление объектов", представляет собой технологию сохранения данных. это в"Объектная модель и реляционная база данных напрямую устанавливают соответствующие отношения"и предоставить механизм для"Манипулировать данными таблицы базы данных с помощью объектов JavaBean". MyBatis через простой"XML"или"аннотация"Способ конфигурации и исходного сопоставления для установления отношения сопоставления между классами сущностей и операторами SQL является своего рода"полуавтоматический"(Причина, по которой он полуавтоматический, потому что мы должны сами писать SQL) Реализация ORM.
Преимущества и недостатки фреймворка MyBatis и возможности его применения
преимущество
- По сравнению с JDBC объем кода уменьшен более чем на 50%.
- MyBatis — это простая в освоении структура персистентности, небольшая и простая в освоении.
- MyBatis достаточно гибок и не окажет никакого влияния на существующий дизайн приложения или базы данных.SQL записывается в файле XML, который полностью отделен от программного кода, уменьшает связанность, облегчает унифицированное управление и оптимизацию и может использоваться повторно. .
- Предоставляет теги XML, поддерживает запись динамического SQL и отвечает различным потребностям бизнеса.
- Предоставляет теги сопоставления для поддержки сопоставления отношений полей ORM между объектами и базами данных.
недостаток
- Рабочая нагрузка по написанию операторов SQL велика, и существуют определенные требования к способности разработчиков писать SQL.
- Операторы SQL зависят от базы данных, что приводит к плохой переносимости базы данных, и база данных не может быть случайно заменена.
Применимая сцена
MyBatis фокусируется на самом SQL и является достаточно гибким решением уровня DAO. Для проектов с высокими требованиями к производительности или проектов с большим количеством изменений в требованиях, таких как веб-проекты, MyBatis — лучший выбор.
В чем разница между mybatis и hibernate?
- В отличие от hibernate, Mybatis не совсем является инфраструктурой ORM, потому что MyBatis требует, чтобы программисты сами писали операторы Sql.
- Mybatis напрямую пишет исходный экологический sql, который может строго контролировать производительность выполнения sql и обладает высокой гибкостью.Он очень подходит для разработки программного обеспечения, не требующего высокореляционных моделей данных, поскольку требования к такому программному обеспечению часто меняются, и один раз требования меняются, результаты требуется выводить быстро. Однако предпосылкой гибкости является то, что mybatis не может достичь независимости от базы данных.Если вам нужно внедрить программное обеспечение, которое поддерживает несколько баз данных, вам нужно настроить несколько наборов файлов сопоставления sql, что требует большой работы.
- Hibernate обладает мощными возможностями объектно-реляционного сопоставления и хорошей независимостью от базы данных.Для программного обеспечения, требующего высоких реляционных моделей, если вы используете Hibernate для его разработки, вы можете сэкономить много кода и повысить эффективность.
В чем разница между #{} и ${}?
-
#{}это предварительно скомпилированный процесс,${}является заменой строки. - Mybatis перерабатывает
#{}, sql в#{}Замените его знаком ? и вызовите метод set в PreparedStatement, чтобы присвоить значение; - Mybatis перерабатывает
${}, это положить${}Замените значением переменной. - использовать
#{}Это может эффективно предотвратить внедрение SQL и повысить безопасность системы.
Что делать, если имя атрибута в классе сущностей отличается от имени поля в таблице?
- Тип 1. Определив псевдоним имени поля в операторе sql запроса, сделайте псевдоним имени поля согласованным с именем атрибута класса сущностей.
- Тип 2: пройти
<resultMap>Для сопоставления однозначного соответствия между именами полей и именами атрибутов класса сущностей.
Как написать нечеткий запрос, подобный оператору?
- Тип 1: добавьте SQL Sillcards в коде Java.
- Второй тип: объединение подстановочных знаков в операторах sql приведет к внедрению sql.
Как работает интерфейс Дао? Можно ли перегрузить метод в интерфейсе Dao, если параметры разные?
Дао интерфейс"Интерфейс картографа". интерфейс"полное имя", который находится в файле сопоставления"Значение пространства имен"; интерфейс"имя метода", то есть в файле сопоставления"Значение id оператора Mapper"; Параметры в методе интерфейса — это параметры, передаваемые в sql.
Интерфейс Mapper не имеет класса реализации, при вызове метода интерфейса"Полное имя интерфейса + объединенная строка имени метода в качестве значения ключа","Может однозначно найти MapperStatement". В Mybatis каждый<select>、<insert>、<update>、<delete>теги, будут проанализированы как объект MapperStatement.
Метод в интерфейсе Mapper:"не может быть перегружен"Да, потому что стратегия сохранения и поиска использует полное имя + имя метода."Интерфейс Mapper работает как динамический прокси JDK.", среда выполнения Mybatis будет использовать динамический прокси-сервер JDK для создания прокси-объекта прокси-объекта для интерфейса Mapper, прокси-объект перехватит метод интерфейса, а затем выполнит sql, представленный MapperStatement, и затем вернет результат выполнения sql.
Как Mybatis выполняет пейджинг? Каков принцип работы плагина пейджинга?
Использование Mybatis"RowBounds"Объект выгружается, что представляет собой подкачку памяти, выполняемую для набора результатов ResultSet, а не физическую подкачку. Вы можете напрямую записать параметры с физическим пейджингом в sql, чтобы завершить функцию физического пейджинга, или вы можете использовать подключаемый модуль пейджинга для завершения физического пейджинга. Основной принцип плагина пагинации заключается в использовании"Интерфейс плагина предоставлен Mybatis", чтобы реализовать пользовательский плагин, в"Перехват sql для выполнения в методе перехвата", а затем переписать sql, согласно"dialect"диалект, добавьте соответствующий"Операторы физического пейджинга и физическая пейджинговая связь"параметр.
Как Mybatis инкапсулирует результат выполнения sql в качестве целевого объекта и возвращает его? Что такое картографические формы?
- Первый заключается в использовании
<resultMap>Метка, которая определяет отношение сопоставления между именами столбцов базы данных и именами атрибутов объекта одно за другим. - Во-вторых, использовать функцию псевдонима столбца sql для записи псевдонима столбца в качестве имени атрибута объекта.
После установления связи между именами столбцов и именами атрибутов Mybatis передает"объект, созданный отражением", использовать одновременно"Свойства, отраженные в объекте, присваиваются одно за другим и возвращаются", те атрибуты, отношение сопоставления которых не может быть найдено, не могут быть назначены.
Какая польза от динамического sql Mybatis? Принцип исполнения? Какой там динамический sql?
Mybatis dynamic sql может записывать динамический sql в виде тегов в файл отображения Xml.Принцип выполнения таков:"Полное логическое суждение в соответствии со значением выражения и динамическое соединение sql"функция.
В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?
Для разных файлов сопоставления Xml, если пространство имен настроено, идентификатор может повторяться, если пространство имен не настроено, идентификатор повторяться не может;
Причина в том, что namespace+id используется как ключ Map
Почему Mybatis — это полуавтоматический инструмент отображения ORM? Чем он отличается от полностью автоматического?
Спящий режим принадлежит"Полностью автоматизированный инструмент сопоставления ORM", При использовании Hibernate для запроса связанных объектов или объектов связанных коллекций его можно получить непосредственно в соответствии с моделью отношений объектов, поэтому он полностью автоматизирован. Когда Mybatis запрашивает связанный объект или связанный объект коллекции, ему необходимо"Вручную написать sql для завершения", так назовите это"Полуавтоматический инструмент отображения ORM".
Сколько способов MyBatis реализует один к одному?
Есть совместный запрос и вложенный запрос.Совместный запрос - это совместный запрос нескольких таблиц, который запрашивается только один раз.Его можно выполнить, настроив узел ассоциации в resultMap и настроив класс "один к одному"; Вложенный запрос заключается в том, чтобы сначала найти таблицу, а затем запросить данные в другой таблице в соответствии с идентификатором внешнего ключа результата в этой таблице.Он также настраивается через ассоциацию, но запрос другой таблицы настраивается через атрибут select.
В MyBatis есть несколько способов реализации «один ко многим», как работать?
Существуют запросы на объединение и вложенные запросы. Совместный запрос — это совместный запрос нескольких таблиц, который запрашивается только один раз и может быть выполнен путем настройки класса «один ко многим» в узле коллекции в resultMap; вложенный запрос — это сначала поиск таблицы, а затем в соответствии с идентификатором внешнего ключа результата в этой таблице. Чтобы запросить данные в другой таблице, это также осуществляется через конфигурацию коллекции, но запрос другой таблицы настраивается через узел выбора.
Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?
Mybatis поддерживает только ленивую загрузку объектов, связанных с ассоциацией, и объектов, связанных с коллекцией, Ассоциация относится к запросу «один к одному», а коллекция относится к запросу «один ко многим». В файле конфигурации Mybatis вы можете указать, следует ли включать отложенную загрузку lazyLoadingEnabled=true|false. Принцип заключается в использовании"CGLIB создает прокси-объект для целевого объекта", При вызове целевого метода введите метод перехватчика, например вызов a.getB().getName(), метод перехватчика invoke() обнаружит, что a.getB() имеет нулевое значение, затем он"Отправьте sql предварительно сохраненного запроса, связанного с объектом B, отдельно","запрос Б","Затем вызовите a.setB(b)", поэтому свойство объекта b имеет значение, а затем вызывается метод a.getB().getName().
Кэш Mybatis уровня 1 и уровня 2
- Кэш уровня 1: локальный кеш HashMap на основе PerpetualCache, его областью хранения является сеанс, когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены, а кеш уровня 1 будет открыт по умолчанию.
- Механизм кеша второго уровня такой же, как у кеша первого уровня, по умолчанию для хранения используются PerpetualCache и HashMap, разница в том, что его областью хранения является Mapper (Namespace), а источником хранения может быть настраиваемые, такие как Ehcache. Кэш второго уровня не открывается по умолчанию.Чтобы включить кеш второго уровня, использование класса атрибута кеша второго уровня должно реализовать интерфейс сериализации Serializable (который можно использовать для сохранения состояния объекта), который может быть настроен в его файле сопоставления;
- Для механизма обновления данных кэша, когда операция C/U/D выполняется в области (сеанс кэша первого уровня/пространства имен кэша второго уровня), кэши во всех выборках в этой области будут очищены по умолчанию.
Какова привязка интерфейса 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 — это путь к классу интерфейса сопоставления.
Как mybatis предотвращает внедрение SQL?
"Сначала посмотрите на разницу между следующими двумя операторами sql:"
<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">
select id, username, password, role
from user
where username = #{username,jdbcType=VARCHAR}
and password = #{password,jdbcType=VARCHAR}
</select>
<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">
select id, username, password, role
from user
where username = ${username,jdbcType=VARCHAR}
and password = ${password,jdbcType=VARCHAR}
</select>
"Разница между # и $ в mybatis:"
-
#Обрабатывайте входящие данные как строку и добавляйте двойные кавычки к автоматически входящим данным. Такие как:where username=#{username}, если входящее значение равно 111, то значение при разборе в sql равноwhere username="111", Если входящим значением является id, проанализированный sqlwhere username="id". -
$Входящие данные напрямую отображаются и генерируются в sql. Такие как:where username=${username}, если входящее значение равно 111, то значение при разборе в sql равноwhere username=111; если передано значение:drop table user;, проанализированный sql:select id, username, password, role from user where username=;drop table user; -
#Этот метод может в значительной степени предотвратить внедрение SQL,$Невозможно предотвратить внедрение Sql. -
$Этот метод обычно используется для передачи объектов базы данных, таких как передача имени таблицы. - обычно пригодный для использования
#не используй$, если вам нужно использовать“${xxx}”Такие параметры следует фильтровать вручную, чтобы предотвратить атаки SQL-инъекций. - В MyBatis,
“${xxx}”Параметры в этом формате будут напрямую участвовать в компиляции SQL, так что инъекционных атак не избежать. Но когда дело доходит до динамических имен таблиц и имен столбцов, вы можете использовать только“${xxx}”такой формат параметра. Следовательно, такие параметры необходимо обрабатывать вручную в коде, чтобы предотвратить внедрение.
"SQL-инъекция":
"SQL-инъекция", с которым все знакомы, это распространенный метод атаки."атакующий"Введите какие-то странные фрагменты SQL (такие как «или '1'='1'») в информацию формы или URL-адрес интерфейса, это может привести к вторжению"Недостаточное тестирование параметров"приложение. Поэтому нам нужно проделать некоторую работу в нашем приложении, чтобы предотвратить такие атаки. В некоторых приложениях с высокими требованиями к безопасности (таких как банковское программное обеспечение) он часто используется для"Оператор SQL"заменить все на"хранимая процедура"Таким образом, чтобы предотвратить внедрение SQL. это конечно"очень безопасный способ", но нам этот жёсткий путь может и не понадобиться в нашем обычном развитии.
"Как mybatis предотвращает инъекции sql"
В качестве полуавтоматической инфраструктуры уровня сохраняемости среда MyBatis требует от нас ручного написания своих операторов SQL.Конечно, нам нужно предотвратить внедрение SQL в это время. На самом деле MyBatis SQL — это"вход + выход"" функция, аналогичная структуре функции, относится к двум приведенным выше примерам. Среди них, parameterType представляет тип входного параметра, а resultType представляет тип выходного параметра. В ответ на вышеизложенное, если мы хотим предотвратить внедрение SQL, само собой разумеется, что нужно работать над входными параметрами.# в приведенном выше коде — это часть, в которой входные параметры объединяются в SQL.После передачи параметров распечатайте выполненный оператор SQL и вы увидите, что SQL выглядит следующим образом:
select id, username, password, role from user where username=? and password=?
Независимо от того, какие параметры введены, напечатанный SQL будет таким. Это связано с тем, что MyBatis включает функцию предварительной компиляции.Перед выполнением SQL приведенный выше SQL будет отправлен в базу данных для компиляции; при выполнении скомпилированный SQL можно использовать напрямую, а заполнитель "?" можно заменить. Поскольку SQL-инъекция может работать только в процессе компиляции, этот способ позволяет избежать проблемы с SQL-инъекцией.
[Принцип реализации нижнего уровня] Как MyBatis выполняет предварительную компиляцию SQL? На самом деле в основе фреймворка лежит класс PreparedStatement в JDBC. PreparedStatement является подклассом знакомого нам Statement. Его объект содержит скомпилированные операторы SQL. Этот «подготовленный» подход не только повышает безопасность, но и повышает эффективность при многократном выполнении одного и того же SQL. Причина в том, что SQL уже скомпилирован и не нуждается в повторной компиляции при повторном выполнении.
//安全的,预编译了的
Connection conn = getConn();//获得连接
String sql = "select id, username, password, role from user where id=?"; //执行sql前会预编译号该条语句
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
ResultSet rs=pstmt.executeUpdate();
......
//不安全的,没进行预编译
private String getNameByUserId(String userId) {
Connection conn = getConn();//获得连接
String sql = "select id,username,password,role from user where id=" + id;
//当id参数为"3;drop table user;"时,执行的sql语句如下:
//select id,username,password,role from user where id=3; drop table user;
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs=pstmt.executeUpdate();
......
}
"В заключение":
"#{}": Эквивалентно PreparedStatement в JDBC.
"${}": значение выходной переменной
Проще говоря, #{} предварительно скомпилирован и безопасен; ${} не предварительно скомпилирован, он просто принимает значение переменной, это небезопасно, и есть SQL-инъекция.
❝Это не легко создать, если вы найдете это полезным, дайте маленькую звезду.гитхаб-адрес😁😁😁
❞
В этой статье используетсяmdniceнабор текста