Генерируемый класс XyzEntity
теперь поддерживает super class
. В super class
можно определять общие атрибуты. Используется аналогично определению интерфейсов.
Добавлены аннотации @GmtCreate
, @GmtModified
; для удобства сортировки полей
В конфигурациях TABLE_NAME
, ENTITY_NAME
константы были изменены на верхний регистр
Исправлена ISSUE I4Q3RH
daoDir
не указан, то не создаются интерфейсы и реализации DAO, а также не создается базовый класс baseDao
при компиляции.count()
вместо count(*)
при использовании DISTINCT
была исправлена.save
(пакетная загрузка Entity)saveOrUpdate
Свойство BaseEntity.table.supplier
было установлено как transient
для удобства сериализации fastjson
; это свойство помечено как @Deprecated
и будет удалено в будущих версиях.
@Bean
public MapperFactory mapperFactory() {
return new MapperFactory()
.tableSupplier((t, v) -> "fluent_mybatis." + t, StudentEntity.class);
}
Устранение 2 проблем:
При генерации запросов с соединением таблиц, если есть вложенные SQL-запросы, условия выборки в этих вложенных запросах не учитывают алиас таблиц.
Обладает ли JoinQuery возможностью объединения UNION и UNION ALL?
Добавление нового модуля функциональности form-service-meta:
Новые возможности версии 1.8.5
/**
* Не выполняет фактический SQL-запрос, а лишь возвращает сконструированное SQL-запросное выражение MyBatis
*
* @param mode 0: режим '?'-заполнителя; 1: режим замены переменных; 2: режим '?'-заполнителя MyBatis
* @param simulators имитация выполнения операций над данными, пример: m -> m.listEntity(query)
* @return список SQL-запросов
*/
default List<String> print(int mode, Consumer<IWrapperMapper>... simulators);
Пример:
@Test
void insertWithPk() {
List<String> sql = mapper.print(m -> m.insertWithPk(new StudentEntity().setId(1L)));
want.list(sql).eqList("" +
"INSERT INTO fluent_mybatis.student " +
"(`id`, `gmt_created`, `gmt_modified`, `is_deleted`, `env`, `tenant`) " +
"VALUES " +
"(?, now(), now(), 0, ?, ?)");
}
// Пример
StudentUpdate update = StudentUpdate.updater()
.set.address().is("address")
.end()
.where.applyIf(student != null,
c -> c.id().eq(student.getId())
.and.age().between(student.getAge() - 10, student.getAge() + 10)
.and.address().like(student.getAddress(), If::notBlank)
)
.end();
Уменьшено количество сгенерированного кода, полностью удалены сгенерированные эквиваленты класса XyzSqlProvider, теперь используется SqlProvider напрямую; Класс Mapper также генерируется только как пустой шаблон XzyMapper, что обеспечивает полиморфизм и возврат соответствующего экземпляра IMapping. Все аннотации реализации Mapper находятся на интерфейсе IEntityMapper.
Определение первичного ключа и возможность записи обратной связи по первичному ключу для методов insert и insertBatch осуществляется при загрузке; Определение ResultMap для метода listEntity также происходит при загрузке. Подробнее см. реализацию классов StatementBuilder и SqlKit.
Примечание: При запуске Fluent MyBatis требуется настроить бин MapperFactory
@Bean
public MapperFactory mapperFactory() {
return new MapperFactory();
}
// Изменение типа базы данных
IRef.changeDbType(DbType.MYSQL);
select.exclude(...)
// Пример 1
new XyzQuery().select.exclude("id", "user_name");
// Пример 2
new XyzQuery().select.exclude(FieldRef.Student.id, FieldRef.Student.userName);
// Пример 3
new XyzQuery().select.exclude(StudentEntity::getId, StudentEntity::getUserName);
- Для поддержки динамического изменения типа базы данных и других новых возможностей, внутренняя реализация сборки SQL была модифицирована. Теперь все сборки SQL используют функциональные выражения, которые собираются целиком только при выполнении.
updateById
, logicDeleteById
и другими операциями обновления по условию ID, поддерживаются также значения по умолчанию, установленные в IDefaultSetter@TableId
в методах deleteById
, findById
и других@TableId
в методах deleteById
, findById
и другихv1.8.0.1
v1.7.3
v1.8.0
v1.7.2