Введение
MyBatis-Plus — это пакет расширенных инструментов, который при использовании MyBatis-Plus для написания запросов может генерировать код, подобный следующему:
LambdaQueryWrapper<Student> queryWrapper = Wrappers.lambdaQuery(Student.class)
.like(StringUtils.isNotBlank(student.getName()), Student::getName, student.getName())
.eq(student.getSex() != null, Student::getSex, student.getSex())
.ge(student.getAge() != null, Student::getAge, student.getAge());
В то же время MyBatis Plus имеет собственный @TableField (condition=SqlCondition.XX), который относительно сложен. В версии 3.4.3 константы поддерживают только eq, noteq, like, likeleft и likeright. Для других типов условий необходимо напрямую писать условия SQL в поле condition.
Поэтому, когда полей много, ситуация становится очень сложной. Цель этого пакета инструментов — упростить построение сложных условий QueryWrapper и сделать многокритериальный запрос более удобным.
Использование
Добавьте зависимость в файл pom.xml:
<dependency>
<groupId>com.gitee.wenbo0</groupId>
<artifactId>mybatis-plus-wrapper</artifactId>
<version>1.0.15</version>
</dependency>
На полях, которые необходимо запросить в классе сущности или DTO, добавьте аннотацию @Wrapper:
@Getter
@Setter
@Accessors(chain = true)
public class Student {
private String id;
@Wrapper(WrapperType.LIKE)
private String name;
@Wrapper
private Integer sex;
@Wrapper(WrapperType.GE)
private Integer age;
}
При построении QueryWrapper используйте WrapperUtil:
QueryWrapper<Student> queryWrapper = WrapperUtil.buildQueryWrapper(student);
WrapperUtil создаст QueryWrapper, эквивалентный тому, что был создан в примере кода во введении.
@Wrapper аннотация
У аннотации есть четыре свойства:
/**
* Тип условия
*/
WrapperType value() default WrapperType.EQ;
/**
* Имя поля базы данных. По умолчанию используется имя поля pojo, преобразованное из нижнего регистра в верхний регистр.
*/
String columnName() default "";
/**
* Игнорировать ли пустые строки
*/
boolean ignoreBlank() default true;
/**
* Игнорировать ли нулевые значения
*/
boolean ignoreNull() default true;
/**
* Название группы условий
*/
String group() default "";
Значение value может быть выбрано из EQ, NE, LIKE, NOT_LIKE, LIKE_LEFT, LIKE_RIGHT, LT, GT, LE, GE, IN, NOT_IN. Вызов одноимённого метода Mybatis-Plus по умолчанию равен EQ.
Обратите внимание: в настоящее время IN и NOT_IN поддерживают только массивы и строки, а строки поддерживают только разделение запятыми. Если для ignoreNull установлено значение false, null будет использоваться в качестве условия запроса. Если для ignoreBlank установлено значение false и тип поля — String, пустая строка будет использоваться в качестве условия запроса.
Добавьте аннотацию @WrapperGroups в класс сущности или DTO для настройки групп условий:
@Group имеет атрибут group, который является именем группы условий, атрибут conditionType, который представляет собой тип соединения условий в группе, и атрибут splicingType, который представляет собой тип соединения внешних условий. Проще говоря, условия в одной группе будут заключены в круглые скобки, conditionType — это and в (a=1 и b=2), а splicingType — это or в (a=1 and b=2) или (c=1 и d=2).
Добавьте @Wrapper в поля, необходимые для запроса, настройте атрибут group:
@Getter
@Setter
@Accessors(chain = true)
@WrapperGroups(groups = {
@Group(group = "group1", conditionType = ConditionType.OR, splicingType = ConditionType.AND),
@Group(group = "group2", conditionType = ConditionType.AND, splicingType = ConditionType.AND)
})
public class Student {
private String id;
@Wrapper(value = WrapperType.LIKE, group="group1")
private String name;
@Wrapper(group="group1")
private Integer sex;
@Wrapper(WrapperType.GE, group="group2")
private Integer age;
}
Используйте WrapperUtil для построения QueryWrapper:
QueryWrapper<Student> queryWrapper = WrapperUtil.buildQueryWrapper(student);
Конфигурация во втором шаге эквивалентна:
queryWrapper.and(i -> i.like("name","xxx").or().eq("sex","xxx")).and(i -> i.ge("age","xxx"));
Сгенерированный SQL эквивалентен:
select xx from xx where (name like '%xxx%' or sex = 'xxx') and (age >= 'xxx')
Первый шаг: обработка конфигурации плагина
@Bean
public DictTextResultSetHandlerPlugin dictTextResultSetHandlerPlugin(){
return new DictTextResultSetHandlerPlugin();
}
// Если вам нужно кэшировать таблицы, вы можете использовать следующий конструктор. Кэширование по умолчанию составляет 5 минут.
@Bean
public DictTextResultSetHandlerPlugin dictTextResultSetHandlerPlugin(){
return new DictTextResultSetHandlerPlugin("sys_dict", "sys_user");
}
// Или первый параметр - это время кэширования (мс), второй параметр - таблица кэша
@Bean
public DictTextResultSetHandlerPlugin dictTextResultSetHandlerPlugin(){
return new DictTextResultSetHandlerPlugin(1000 * 60, "sys_dict", "sys_user");
}
Второй шаг: добавьте аннотацию к полю, которое необходимо заполнить в сущности или VO
@Getter
@Setter
@Accessors(chain = true)
public class Student {
private String id;
private String name;
@DictText(keyColumn = "id", textColumn = "dict_text", tableName = "sys_dict", target = "sexName")
private Integer sex;
@TableField(exist = false)
private String sexName;
}
Используя аннотацию @DictText, свяжите таблицу и поля, которые необходимо заполнить, с соответствующими свойствами. После завершения запроса данные будут заполнены в соответствующее поле, чтобы избежать частого запроса связанных таблиц.
Следует отметить, что обратное заполнение словаря лучше всего использовать в интерфейсах с разбивкой на страницы или с небольшим количеством данных. Таблица словаря должна иметь индекс, иначе производительность будет сильно снижена. Не рекомендуется создавать слишком много таблиц кэша, а также таблицы с большим объёмом данных, если только у вас не очень большой объём памяти✌️
textColumn и target поддерживают запись нескольких полей через запятую. Например:
@DictText(keyColumn = "id", textColumn = "dict_text,dict_type", tableName = "sys_dict", target = "sexName,sexType")
@DictText аннотация
/**
* Имя поля условия в связанной таблице для запроса.
*/
String keyColumn() default "id";
/**
* Имя поля вывода в связанной таблице.
*/
String textColumn() default "name";
/**
* Имя поля объекта, которое будет перезаписано.
*/
String target() default "";
/**
* Название связанной таблицы.
*/
String tableName() default "";
/**
* Другое имя поля условия в связанной таблице, необходимое для запроса.
*/
String otherColumn() default "dict_id";
/**
* Значение другого поля условия в связанной таблице, необходимое для запроса.
*/
String otherValue() default "";
/**
* Если установлено значение true, то имена словаря будут разделены запятой.
*/
boolean commaSeparate() default false;
otherValue поддерживает использование ${} для получения значения поля текущего объекта.
Эти свойства в основном используются для объединения SQL. Использование SQL для объяснения этих полей должно быть более понятным.
select ${textColumn} from ${tableName} where ${keyColumn} = ${значение поля аннотации}
Если некоторые таблицы словаря имеют поля dict_id или group_id для группировки по словарю, можно использовать otherColumn и otherValue для запроса.
select ${textColumn} from ${tableName} where ${keyColumn} = ${значение поля аннотации} and ${otherColumn} = ${otherValue}
Когда commaSeparate имеет значение true, это означает, что значение аннотации представляет собой строку, разделённую запятыми, например 1,2. В этом случае результат перезаписи также будет строкой, разделённой запятыми, такой как «мужчина, женщина».
select group_concat(${textColumn}) from ${tableName} where ${keyColumn} in (${значение поля аннотации})
Этот метод также может объединять otherColumn = otherValue.
Конечно, этот метод может привести к тому, что 1,1 вернёт только «мужчина», но этого должно быть достаточно на данный момент.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )