статус кво
Одной из мощных функций MyBatis является динамический SQL. Если у вас есть опыт работы с JDBC или другими подобными платформами, вы можете оценить сложность объединения операторов SQL на основе различных условий. Например, при объединении не забудьте добавить необходимые пробелы, а также обратите внимание на удаление запятой из имени последнего столбца списка. Воспользуйтесь функцией динамического SQL, чтобы полностью избавиться от этой боли.
Когда дело доходит до Mybatis dynamic Sql, большинство людей мгновенно представляют себе такую картину:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
или вот так
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
существуетMapper XML
с помощью动态 SQL 元素
Для достижения условного сплайсинга операторов SQL.
Я должен сказать, что эта реализация Mybatis уже очень мощная, что значительно повышает эффективность нашего сплайсинга SQL.Но для программистов условные суждения в коде гораздо удобнее, гибче и надежнее, чем в XML.强大的 MyBatis 映射
В то же время сделать написание динамического SQL более лаконичным и контролируемым
—— Итак, настоящий динамический SQL Mybatis ——MyBatis Dynamic SQL
возник.
MyBatis Dynamic SQL
адрес проекта
GitHub.com/ не поставил boost/каждый шаг…
официальная документация
no lift.org/ no lift - желаю вам...
Введение в проект
Initial Release - December 17, 2017 Last Published: 23 November 2019 | Version: 1.1.4
2017-12-17, проект выпустил первую версию,
Последняя версия была выпущена 2019-11-231.1.4
, этот проект является одним из официальных проектов Mybatis.
автор
Джефф Батлер [https://github.com/jeffgbutler],ДаОрганизация Мибатисчлен, даMybatisОсновной вкладчик, а также наш общий инструментMyBatis Generatorавтор.
Mybatis Generator
Как вы можете себе представить,Mybatis Dynamic SQLодеялоMybatis Genratorочень хорошая поддержка вMybatis Dynamic SQLВторой день после выпуска последней версии, 2019-11-24Mybatis Genrator 1.4.0Релиз, в эту версию внесены серьезные изменения, в основном
- New Runtime for Kotlin using MyBatis Dynamic SQL
- New Runtime for Java using MyBatis Dynamic SQL
- MyBatis Dynamic SQL is now the default runtime
- Move to Java 8
- Remove support for iBatis2
В основном, чтобы убрать поддержку iBatis2, при использованииMyBatis Dynamic SQLКак среда выполнения по умолчанию, это, несомненно, очень удобно для пользователей Mybatis.Подробно будет описано в следующей статье.
Введение
Этот проект представляет собой основу для создания динамических операторов SQL. Думайте об этом как о безопасной для типов библиотеке шаблонов SQL с дополнительной поддержкой MyBatis3 и Spring JDBC.
Библиотека будет генерировать полные форматированные операторы DELETE, INSERT, SELECT и UPDATE, которые могут использоваться MyBatis или Spring. Наиболее распространенным вариантом использования является создание оператора и набора соответствующих параметров, которые могут использоваться непосредственно Mybatis. В то же время он также может генерировать операторы и объекты параметров, совместимые с шаблонами Spring JDBC.
Эта библиотека реализуетЯзык для предметной области, аналогичный SQL(предметно-ориентированный язык, DSL) для работы, DSL может создать объект, содержащий полный оператор SQL и все параметры, требуемые оператором. Этот объект может использоваться непосредственно Mybatis в качестве параметра, передаваемого методу Mapper, как мы обычно делаем.
характеристика
Библиотека может генерировать следующие типы операторов SQL (не ограничиваясь ими, последнюю информацию можно просмотретьChange Log):
- Гибкое предложение WHERE, поддерживающее подзапросы
- Оператор DELETE с гибким предложением WHERE
- Различные операторы INSERT:
- Оператор Insert для одной записи и вставит
null
значение («полная» вставка) - Вставить оператор для одной записи и игнорировать входное значение
null
столбцов («выборочная» вставка) - Вставить с оператором SELECT
- Многострочная вставка (аналогично
) - Пакетная вставка (Spring Batch или JDBC Batch)
- Поддерживает возврат первичных ключей с автоинкрементом
- Оператор Insert для одной записи и вставит
- Оператор SELECT с гибким списком, гибким предложением WHERE, поддерживает отдельные, подсчет (различные ...), группировать по, соединения, союзы, «упорядочить по» и т. д.
- Оператор UPDATE с гибким предложением WHERE, как и оператор вставки, имеет два типа обновлений:
- «Полное» обновление
- «Выборочное» обновление
Цель
Основные цели этой библиотеки:
- Типобезопасность — библиотека будет стараться, чтобы типы параметров соответствовали типам столбцов базы данных, когда это возможно.
- Выразительность — утверждения строятся таким образом, чтобы четко передать их значение (некоторое вдохновение от Hamcrest).
- Гибкость — предложения могут быть построены с использованием любой комбинации и, или, и вложенных условий.
- Расширяемость — библиотека будет генерировать операторы, которые работают для MyBatis3, шаблона Spring JDBC или чистого JDBC. Его также можно расширить для создания предложений для других фреймворков. Если нет встроенногоУсловные операторыПолностью соответствует вашим потребностям, вы можете легко настроить (в конце концов, кодирование — это то, в чем вы хороши)
- small — нет транзитивных зависимостей
намекать
Версия Java быстро обновляется, но до сегодняшнего дня, возможно, наибольшее влияние на разработчиков Java оказывает Java8, которая приносит разработчикамTYPE_USE Annotations
, принес это函数编程和Lamda
,新的日期和时间处理库
,Optional
Подождите, некоторые даже говорят — Java 8 предоставляет разработчикам инструменты и возможности [woohoo.info Q.com/articles/TY…】
Например:
- Каркас проверки【checkerframework.org/] Java Type System Enhancement Framework или средство проверки статического типа во время компиляции.
- СеткаExcel【GitHub.com/Лю Хуагуй/…] Используйте функциональное программирование, чтобы упростить чтение и запись в Excel.
Точно так же Java 8 подсказалаMyBatis Dynamic SQLПоявление, как мы увидим позже, функционального программирования вMyBatis Dynamic SQLпривык до крайности.
Итак, если вы хотите использоватьMyBatis Dynamic SQL, пожалуйста, убедитесь, что ваша рабочая среда: Java8+
быстрый в использовании
шаг
использоватьMyBatis Dynamic SQLТребуются следующие шаги:
- Создание объектов таблицы и столбца
- (для Mybatis3) Создание картографов (на основе XML или Java)
- написать SQL и использовать его
В целях обсуждения сначала мы покажем структуру таблицы, используемую для выполнения CRUD:
create table SimpleTable (
id int not null,
first_name varchar(30) not null,
last_name varchar(30) not null,
birth_date date not null,
employed varchar(3) not null,
occupation varchar(30) null,
primary key(id)
);
Определить константы Таблицы и столбцы
org.mybatis.dynamic.sql.SqlTable
Классы используются для определения таблицы. Определение таблицы содержит фактическое представление (даже соответствующую схему и каталог). При желании псевдонимы таблиц можно использовать в операторах SQL. Ваша таблица должна расширять класс SqlTable.org.mybatis.dynamic.sql.SqlColumn
Классы используются для определения столбцов, используемых в библиотеке, SqlColumns должны быть созданы на основе SqlTable. Определение столбца содержит:
- The Java type
- The actual column name (an alias can be applied in a select statement)
- The JDBC type (optional)
- Если обработчик типов по умолчанию не требуется, можно указать полное имя обработчика типов, которое необходимо использовать в Mybatis.
(Примечание: в отличие от PO (постоянный объект, который формирует отношение отображения один к одному со структурой данных уровня сохраняемости (обычно реляционной базы данных)),Здесь объекты Table и Column верны表
а также列
Строгая абстракция , они определены как статические константы, что позволяет повторно использовать их при построении операторов SQL, точно так же, как при написании операторов SQL в командной строке.)
Следующие шаблоны использования рекомендуются для обеспечения максимальной гибкости. Этот режим позволяет вам использовать ваши таблицы и столбцы с «квалифицированными» или «неквалифицированными» соглашениями, точно так же, как при написании операторов SQL в командной строке. Например, следующий столбец можно записать как firstName или simpleTable.firstName.
package examples.simple;
import java.sql.JDBCType;
import java.util.Date;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
public final class SimpleTableDynamicSqlSupport {
public static final SimpleTable simpleTable = new SimpleTable();
public static final SqlColumn<Integer> id = simpleTable.id;
public static final SqlColumn<String> firstName = simpleTable.firstName;
public static final SqlColumn<String> lastName = simpleTable.lastName;
public static final SqlColumn<Date> birthDate = simpleTable.birthDate;
public static final SqlColumn<Boolean> employed = simpleTable.employed;
public static final SqlColumn<String> occupation = simpleTable.occupation;
public static final class SimpleTable extends SqlTable {
public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);
public final SqlColumn<String> firstName = column("first_name", JDBCType.VARCHAR);
public final SqlColumn<String> lastName = column("last_name", JDBCType.VARCHAR);
public final SqlColumn<Date> birthDate = column("birth_date", JDBCType.DATE);
public final SqlColumn<Boolean> employed = column("employed", JDBCType.VARCHAR, "examples.simple.YesNoTypeHandler");
public final SqlColumn<String> occupation = column("occupation", JDBCType.VARCHAR);
public SimpleTable() {
super("SimpleTable");
}
}
}
Создание картографов MyBatis3
Эта библиотека может создавать классы, которые используются в качестве входных данных для картографа MyBatis. Эти классы содержат сгенерированный SQL вместе с соответствующим набором параметров. Оба требуются MyBatis. Эти объекты являются единственными параметрами метода сопоставления MyBatis.
(Уведомление:MyBatis Dynamic SQLОн отлично работает без XML-файла, но это не означает, что XML не поддерживается, в конце концов.MyBatisПервоначально разрабатывался как фреймворк, управляемый XML. Когда вы используете реляционный запрос и вам нужно сложное сопоставление, используйте XML
Например, Mapper может выглядеть так:
package examples.simple;
import java.util.List;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
@Mapper
public interface SimpleTableAnnotatedMapper {
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<SimpleTableRecord> insertStatement);
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="SimpleTableResult", value= {
@Result(column="A_ID", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="first_name", property="firstName", jdbcType=JdbcType.VARCHAR),
@Result(column="last_name", property="lastName", jdbcType=JdbcType.VARCHAR),
@Result(column="birth_date", property="birthDate", jdbcType=JdbcType.DATE),
@Result(column="employed", property="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class),
@Result(column="occupation", property="occupation", jdbcType=JdbcType.VARCHAR)
})
List<SimpleTableRecord> selectMany(SelectStatementProvider selectStatement);
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("SimpleTableResult")
SimpleTableRecord selectOne(SelectStatementProvider selectStatement);
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
}
Выполнение SQL с помощью Mybatis3
В классе DAO или сервисе сгенерированный оператор можно использовать в качестве входных данных для метода сопоставления. Ниже приведено изexamples.simple.SimpleTableAnnotatedMapperTest
Пример:
@Test
public void testSelectByExample() {
try (SqlSession session = sqlSessionFactory.openSession()) {
SimpleTableAnnotatedMapper mapper = session.getMapper(SimpleTableAnnotatedMapper.class);
SelectStatementProvider selectStatement = select(id.as("A_ID"), firstName, lastName, birthDate, employed, occupation)
.from(simpleTable)
.where(id, isEqualTo(1))
.or(occupation, isNull())
.build()
.render(RenderingStrategies.MYBATIS3);
List<SimpleTableRecord> rows = mapper.selectMany(selectStatement);
assertThat(rows.size()).isEqualTo(3);
}
}
Наконец
Хотите узнать больше,Mybatis Dynamic SQLРасширенное использование, принцип работы, ямы на практике и как использовать его более дружелюбноMybatis Generatorможет следоватьПубличный номер: Блог Flowing Flower Ghost, который постоянно обновляется. . .