1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wenbo0-mybatis-plus-wrapper

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Введение

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>

1. Инструменты построения QueryWrapper

1.1 Простой запрос с условием (все and объединяются)

На полях, которые необходимо запросить в классе сущности или 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, пустая строка будет использоваться в качестве условия запроса.

1.2 Сложный запрос с условиями

Добавьте аннотацию @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')

2. Обратное заполнение словаря

Первый шаг: обработка конфигурации плагина

@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 )

Вы можете оставить комментарий после Вход в систему

Введение

Упростите реализацию аннотаций QueryWrapper. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/wenbo0-mybatis-plus-wrapper.git
git@api.gitlife.ru:oschina-mirror/wenbo0-mybatis-plus-wrapper.git
oschina-mirror
wenbo0-mybatis-plus-wrapper
wenbo0-mybatis-plus-wrapper
master