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

OSCHINA-MIRROR/harii-hibatis

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

Mybatis Generator

Mybatis Generator — это инструмент для создания слоя персистентности базы данных, который автоматически генерирует SQL-запросы.

Описание

Mybatis Generator представляет собой набор расширений для MyBatis, включающий пять видов аннотаций для автоматического создания SQL-запросов:

  • ExecuteInsert;
  • ExecuteSelect;
  • ExecuteCount;
  • ExecuteUpdate;
  • ExecuteDelete.

Инструмент позволяет автоматизировать создание запросов на изменение (вставка, обновление и удаление), а также запросов на выборку данных.

Особенности

  1. Автоматическое связывание таблиц. Инструмент автоматически связывает таблицы на основе следующих параметров:
    • Связанные таблицы, объявленные в классе сущности;
    • Параметры метода, имеющие аннотацию @Param и содержащие ссылки на связанные таблицы;
    • Таблицы, на которые есть ссылки из представления результатов запроса.

Инструмент поддерживает три типа соединения таблиц: левое, внутреннее и правое.

  1. Поддержка представлений результатов запросов. Инструмент позволяет использовать представления результатов запросов, аналогичные тем, что используются в Jackson Json. В аннотации @ExecuteSelect можно указать представление результатов запроса, и инструмент будет автоматически связывать таблицы в соответствии с представлением. Если представление содержит связи «один к одному» или «один ко многим», то значения связанных полей будут установлены с помощью дополнительных запросов.

  2. Возможность настройки параметров методов Mapper. Инструмент предоставляет возможность изменять параметры методов Mapper с помощью перехватчиков (interceptor). Также можно добавлять дополнительные условия фильтрации и значения для вставки (или обновления).

  3. Поддержка стандартных условий фильтрации, значений по умолчанию для вставки (обновления) и сортировки. Эти параметры можно настроить с помощью аннотаций ExecuteInsert и подобных.

Реализация

После запуска приложения MybatisGenerator начинает отслеживать события ContextRefreshedEvent. Затем он ищет методы Mapper, помеченные аннотациями ExecuteInsert и подобными, и создаёт динамические SQL-источники (SqlSource) и регистрирует MappedStatement.

Начало работы

Вставка

Метод ExecuteInsert может принимать только один параметр, который может быть экземпляром объекта или массивом. Тип параметра может быть любым JavaBean или Map. При вставке инструмент сопоставляет поля объекта с соответствующими столбцами таблицы.

Пример использования аннотации ExecuteInsert для вставки экземпляра объекта:

@ExecuteInsert
int insert(Entity entity);

Пример использования аннотации ExecuteInsert для вставки массива:

@ExecuteInsert
int insertArray(T[] array);

Пример использования аннотации ExecuteInsert для вставки списка с использованием значений по умолчанию:

@ExecuteInsert(columnValue = {@ColumnValue(field = "updateTime", placeholder = "now()"),
    @ColumnValue(field = "createTime", placeholder = "now())})
int insertList(List<User> users);

Запрос

Использование класса запроса:

@ExecuteSelect
List<T> selectList(Object query);

Запрос количества элементов:

@ExecuteCount
long selectCount(Object query);

Использование карты условий запроса:

@ExecuteSelect
List<User> searchByCondition(@FilterParam Map<String, Object> condition, @Limit int limit);

Запрос одного элемента:

@ExecuteSelect(selectOne = true)
T selectOne(Object query);

Поиск по идентификатору:

@ExecuteSelect(view = "detail")
User getById(@IdParam long id);

@ExecuteSelect(view = "detail")
List<User> getByIds(@IdParam List<Long> ids);

Использование значений по умолчанию:

@ExecuteSelect(filter = {@Filter(field = "type", placeholder = "1", conflict = ConflictAction.discard)})
List<User> selectByType(@FilterParam(field = "type") Integer type);

Запрос с использованием связанных таблиц:

@ExecuteSelect(orderBy = "id desc")
List<User> search(@FilterParam(field = "type") int type,
                  @FilterParam(table = "car", column = "license", type = FilterType.preMatch, join = @Join(table = "car",
                      joinColumns = @JoinColumn(column = "driver_id", referTable = "user", referColumn = "id"))) String license);

Обновление

Обновление по идентификатору:

@ExecuteUpdate(columnValue = @ColumnValue(field = "updateTime", placeholder = "now()"))
int changeName(@IdParam long id, @ValueParam("name") String name);

@ExecuteUpdate(columnValue = @ColumnValue(field = "updateTime", placeholder = "now()"))
int changeNames(@IdParam List<Long> id, @ValueParam("name") String name);

Обновление с использованием условий запроса:

@ExecuteUpdate
int updateByCondition(@FilterParam Object condition, @ValueParam Object val);

Удаление

Удаление по условию запроса:

@ExecuteDelete(filter = @Filter(field = "type", placeholder = "1"))
int deleteByCompanyName(@FilterParam(field = "companyName", type = FilterType.preMatch) String companyName);

Удаление с использованием условия:

@ExecuteDelete
int deleteByCondition(Object condition);

Удаление по идентификаторам:

@ExecuteDelete
int deleteByIds(@IdParam List<IdType> keys);

Использование

Класс сущности

Класс сущности похож на Spring Data JPA. BaseMapper и EmptyMapper определяют тип сущности и тип первичного ключа. Для сущностей с составным первичным ключом достаточно пометить соответствующие поля аннотацией @Id. Поля сущности могут ссылаться на другие таблицы, которые должны быть объявлены в аннотации @Entity.

Сущность может содержать связи «один к одному» и «один ко многим». Они помечаются аннотациями HasOne и HasMany соответственно. Поддерживаются результаты просмотра параметров. HasOne поддерживает сортировку и возвращает одну запись. HasMany поддерживает сортировку и позволяет указать количество возвращаемых записей.

Класс запроса

Можно использовать класс запроса для объявления всех поддерживаемых фильтров. Фильтры могут ссылаться на другие таблицы. Если фильтр ссылается на другую таблицу, которая не объявлена в аннотации @Entity, необходимо использовать аннотацию Query для объявления связи между таблицами. Фильтры могут использовать аннотацию @Filter для указания оператора фильтра (=, >, <, in и т. д.), имени поля сущности или имени столбца таблицы, либо для игнорирования поля. Класс запроса может объявлять разбиение на страницы и сортировку. Разбиение на страницы осуществляется с помощью аннотаций @Limit и @Offset, а сортировка — с помощью @Sort.

Параметры метода Mapper

Параметры метода Mapper могут быть помечены аннотациями @FilterParam, @IdParam, @ValueParam. @FilterParam указывает параметры запроса или объект запроса. @IdParam указывает на параметры идентификатора, когда сущность использует составной первичный ключ, параметры должны быть java bean или Map, если параметры имеют тип List или массив, используется оператор in. @ValueParam указывает значение поля, которое нужно обновить, оно может быть отдельным полем (с указанием field или column) или java bean.

Значения по умолчанию

ExecuteSelect, ExecuteCount, ExecuteUpdate и ExecuteDelete позволяют указывать условия фильтрации по умолчанию, ExecuteInsert и ExecuteUpdate позволяют указывать значения по умолчанию для столбцов таблицы. Перехватчики

ExecuteSelect может задавать сортировку по умолчанию.

Перехватчики могут быть заданы для ExecuteInsert, ExecuteSelect, ExecuteCount, ExecuteUpdate, ExecuteDelete. Перехватчик должен быть статическим методом или методом по умолчанию в текущем интерфейсе Mapper и принимать один параметр типа InterceptorContext.

Также можно задать глобальный перехватчик, который должен быть экземпляром GeneratorInterceptor. Глобальный перехватчик действует только тогда, когда не задан перехватчик для метода, но его можно вызвать через статический метод MybatisGenerator.intercept.

Глобальный перехватчик должен быть установлен с помощью статического метода MybatisGenerator.setDefaultInterceptor(GeneratorInterceptor defaultInterceptor).

Параметры сортировки

  1. Использование поля сущности: query.setSort("createTime desc, id asc").
  2. Использование выражения поля сущности: query.setSort("$[companyName] desc").
  3. Использование табличного выражения: query.setSort("$(car).create_time desc").

Placeholder @Filter, @FilterParam, @ColumnValue, @ValueParam могут использовать placeholder. Placeholder используется для фильтрации условий справа от оператора или вставки или обновления значений. Может иметь следующие формы:

  1. Использовать буквальную константу. Например: 1, (true), '男'. Если буквальная константа является допустимым идентификатором Java или атрибутом, она должна быть заключена в круглые скобки, чтобы предотвратить автоматическое добавление #{}, например, как в случае с (true). Если скобок нет, будет проанализировано #{true}.
  2. Ссылка на текущий параметр или поле параметра. Например: #{$@} + INTERVAL 1 DAY. $@ автоматически заменяется текущим параметром или полем параметра.
  3. Ссылка на поле сущности. Например: $[amount] + 1. $[amount] автоматически заменяется именем таблицы и столбца, соответствующими полю amount сущности. После анализа это похоже на t0.amount + 1.
  4. Ссылка на таблицу. Например: $(product).amount + 1. $(product) автоматически заменяется на имя таблицы. После анализа это похоже на t0.amount + 1.

HasOne и HasMany Поля HasOne и HasMany должны быть типом связанной сущности или коллекцией сущностей (массив или список). Аннотации HasOne и HasMany должны указывать условие фильтрации (filter атрибут). Условие фильтрации должно содержать placeholder, которое может быть другим полем сущности или константой. Если placeholder — это выражение, то при ссылке на поле сущности используйте формат $[fieldName] или $(tableName).columnName или $(tableName.tableAlias).columnName. Имя таблицы и псевдоним таблицы должны соответствовать таблице сущности или связанной таблице, объявленной аннотацией @Entity.

При реализации полиморфного самосоединения таблиц необходимо использовать псевдоним таблицы, обычно оставляя его пустым. Например, если таблица user содержит сотрудников и руководителей, и вы хотите запросить сотрудников руководителя Ван, вам нужно использовать самосоединение.

Повторная обработка полей фильтрации Параметры метода, значения по умолчанию и перехватчики могут генерировать условия фильтрации. Эти условия фильтрации ссылаются на повторяющиеся поля таблицы данных, они обрабатываются в соответствии с типом ConflictAction по следующим правилам:

  1. Если новое добавленное условие фильтрации имеет тип coexist, то условие фильтрации типа discard для того же поля удаляется, а новое условие фильтрации добавляется.
  2. Если новое добавленное условие фильтрации имеет тип override, то условия фильтрации типов discard и override для одного и того же поля удаляются, а новое условие фильтрации добавляется.
  3. Если новое добавленное условие фильтрации имеет тип discard, то оно игнорируется, если существует условие фильтрации для того же поля, иначе оно добавляется.

Порядок обработки параметров метода, значений по умолчанию и перехватчиков

  1. Перехватчики обрабатывают параметры метода и могут изменять их.
  2. Анализируются параметры метода или поля параметров для создания списка условий фильтрации и списка пар значений столбцов данных. Параметры метода или поля параметров должны быть не нулевыми, чтобы быть включёнными в список условий фильтрации, или, если указано ignoreOnZero = true, они должны быть ненулевыми.
  3. Условия фильтрации по умолчанию из аннотации метода объединяются со списком из шага 2.
  4. Дополнительные условия фильтрации и пары значений столбцов из перехватчика объединяются в список из шага 2.

Комментарии ( 0 )

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

Введение

MyBatis, автоматическое создание SQL, универсальный Mapper, универсальный Dao. Развернуть Свернуть
Отмена

Обновления

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

Участники

все

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

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