mybatisplus-plus
mybatisplus-plus дополняет некоторые функции mybatisplus.
1. Объединение нескольких полей в качестве первичного ключа для операций вставки, обновления, удаления и запроса.
В mybatisplus поддерживается только один первичный ключ. mpp поддерживает объединение нескольких полей (составной первичный ключ) для операций вставки, обновления, удаления и запросов. mapper должен наследовать MppBaseMapper.
Поля составного первичного ключа в сущности должны быть отмечены аннотацией @MppMultiId.
Если необходимо использовать операции с несколькими первичными ключами в service, включая saveOrUpdateByMultiId и пакетные операции updateBatchByMultiId и saveOrUpdateBatchByMultiId, можно напрямую наследовать интерфейс IMppService.
2. Оптимизация плагина разбивки на страницы для выполнения операций сортировки без разбивки на страницы.
В mybatisplus разбивка на страницы и сортировка связаны между собой. mpp оптимизировал плагин разбивки на страницы, используя плагин MppPaginationInterceptor.
Без разбивки на страницы можно выполнять операции сортировки.
Параметр page size устанавливается равным -1 для получения всех данных, а параметр OrderItem используется для сортировки.
3. Автоматическое заполнение и оптимизация функций, автоматическое сканирование Entity классов для создания ResultMap.
mybatisplus может выполнять только заполнение %s+1 и now. mybatisplus-plus выполняет сложное SQL-заполнение при вставке или обновлении.
Необходимо использовать аннотацию @TableField для полей сущности, чтобы установить fill=FieldFill.INSERT, fill=FieldFill.UPDATE или fill=FieldFill.INSERT_UPDATE, иначе не будет выполнено настраиваемое заполнение.
mybatisplus-plus использует аннотацию @InsertFill для запуска вставки и выполняет SQL-заполнение, указанное в аннотации, для заполнения полей сущности.
mybatisplus-plus также использует аннотацию @UpdateFill для запуска обновления и выполняет SQL-заполнение, указанное в аннотации, для обновления полей сущности.
Также можно автоматически заполнять поля первичного ключа, решая проблему mybatisplus с поддержкой только одного первичного ключа.
Используйте метод ColNameUtil.pn для получения имени столбца метода чтения в классе сущности.
Создание resultMap в XML — это трудоёмкая задача, особенно когда возвращаемый объект является сложным из-за соединения таблиц. Если не следовать map, то придётся создавать отдельный resultmap для каждого случая.
Используя аннотацию @AutoMap для класса сущности, можно проанализировать поля, отмеченные аннотацией @TableField, во время запуска приложения и автоматически создать resultMap с именем scan.mybatis-plus_xxxx. Можно напрямую настроить использование этого resultMap в XML.
Поддерживается наследование, и при сканировании подклассов сущности будут добавлены поля родительского класса для построения resultmap подкласса.
Для объектов, возвращаемых различными соединениями таблиц, можно использовать наследование для их генерации. После сканирования автоматически создаются различные resultmaps, которые затем используются в XML.
При выполнении соединений таблиц входные параметры часто представляют собой не отдельные сущности, а более гибкие объекты Map. Однако имена ключей в карте определяются произвольно, и можно использовать интерфейсы для определения констант. В mybatis исходные методы и переменные в XML требуют полного имени пакета, что неудобно при большом количестве использований.
Можно ли использовать лямбда-выражения в mybatisplus для перевода имён столбцов в сущностях?
mpp предоставляет обёртку для поддержки XML в ognl и позволяет импортировать имена пакетов по умолчанию (для совместимости с jdk11, mpp1.7.0 удалил эту функцию). Также поддерживается использование лямбда для определения имён столбцов.
Например, в XML можно использовать следующее выражение для импорта create_time:
#{create_time}
Способ использования имён пакетов по умолчанию в mpp (1.7.0 эта конфигурация была удалена):
#{${@ColInfo@createTime}}
Лямбда-способ в mpp (в версии 1.7.0 используется @com.MPP@col):
#{${@MPP@col("TestEntity::getCreateTime")}}
4. Добавление jar из центрального репозитория.
Добавьте зависимость в файл pom.xml:
<groupId>com.github.jeffreyning</groupId>
<artifactId>mybatisplus-plus</artifactId>
<version>1.7.5-RELEASE</version>
</dependency>```
**5. Установка @KeySequence в классе сущности для автоматического заполнения сложных вычисляемых значений при вставке.**
Пример:
```@KeySequence("select lpad(max(seqno)+3,10,'0') from test")
@TableName(value = "test")
public class TestEntity {
@TableId(value = "id", type=IdType.INPUT)
private Integer id;
}```
После версии 1.5.1 необходимо использовать аннотацию @EnableAutoFill для включения функции автоматического заполнения.
**6. Установка @InsertFill и @UpdateFill в полях сущности для использования текущего времени при вставке и обновлении.**
Пример:
``` @InsertFill("select now()")
@UpdateFill("select now()")
@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE)
private Date updateTime;```
**7. Использование аннотации @EnableMPP в классе запуска для расширения функций настраиваемого заполнения и автоматического создания resultmap.**
Использование аннотации @EnableKeyGen в классе запуска для активации функции генерации первичного ключа. Обратите внимание, что если вы реализуете IKeyGenerator самостоятельно, это может привести к конфликту с @EnableKeyGen.
Пример:
```@SpringBootApplication
@EnableMPP
@EnableKeyGen
public class PlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(PlusDemoApplication.class, args);
}
}```
**8. Использование аннотации @AutoMap в классе сущности.**
JoinEntity является подклассом TestEntity. Необходимо установить autoResultMap=true в @TableName. Если родительский класс также имеет аннотацию @AutoMap, но autoResultMap не установлен, mybatisplus отвечает за создание resultmap. Однако resultmap, созданный mybatisplus, имеет имя mybatis-plus_xxxx, а не scan.prefix.
Пример:
```@AutoMap
@TableName(autoResultMap=true)
public class JoinEntity extends TestEntity{
@TableField("some2")
private String some2;
public String getSome2() {
return some2;
}
public void setSome2(String some2) {
this.some2 = some2;
}
@Override
public String toString() {
return "JoinEntity{" +
"some2='" + some2 + '\'' +
'}';
}
}```
**9. Настройка пути сканирования entity в файле конфигурации.**
Несколько путей разделяются запятой.
Пример:
```mpp:
entityBasePath: com.github.jeffreyning.mybatisplus.demo.entity```
**10. Настройка пути загрузки классов по умолчанию для выполнения статических методов Java в файле конфигурации (1.7.0 этот параметр был удалён).**
Несколько путей разделяются запятой.
Пример:
```mpp:
utilBasePath: com.github.jeffreyning.mybatisplus.demo.common```
**11. Использование автоматически сгенерированных resultMaps в файлах XML и вызов статических методов через ognl с использованием имён классов без указания полного пути (1.7.0 использование полных путей было удалено, вместо этого используется com.MPP).**
Пример вызова lambda-выражений через аннотацию @com.MPP@col для преобразования имён столбцов сущности:
```<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC``` **Интерфейс напрямую возвращает экземпляр класса**
@Mapper public interface TestMapper extends BaseMapper { public List queryUseRM(); public List queryUse(Map param); }
**Использование ColNameUtil.pn статического метода для получения имени столбца, соответствующего методу чтения в классе сущности**
System.out.println(ColNameUtil.pn(TestEntity::getCreateTime)); System.out.println(ColNameUtil.pn(TestEntity::getId)); System.out.println(ColNameUtil.pn(JoinEntity::getSome2)); System.out.println(ColNameUtil.pn(JoinEntity::getUpdateTime));
**Работа с объединённым первичным ключом: добавление, изменение, удаление и поиск по нескольким полям**
В классе сущности используется аннотация @MppMultiId для обозначения объединённого первичного ключа.
@TableName("test07") public class Test07Entity { @MppMultiId @TableField(value = "k1") private Integer k1;
@MppMultiId
@TableField(value = "k2")
private String k2;
@TableField(value = "col1")
private String col1;
@TableField(value = "col2")
private String col2;
}
Mapper должен наследовать MppBaseMapper.
@Mapper public interface Test07Mapper extends MppBaseMapper { }
Добавление, изменение и удаление данных с использованием объединённого первичного ключа:
public void testMultiId(){ //id Test07Entity idEntity=new Test07Entity(); idEntity.setK1(1); idEntity.setK2("111"); //del test07Mapper.deleteByMultiId(idEntity); //add test07Mapper.insert(idEntity); //query Test07Entity retEntity=test07Mapper.selectByMultiId(idEntity); retEntity.setCol1("xxxx"); //update test07Mapper.updateByMultiId(retEntity); }
Service-слой наследует IMppService и MppServiceImpl.
public interface Test07Service extends IMppService { } public class Test07ServiceImpl extends MppServiceImpl<Test07Mapper, Test07Entity> implements Test07Service { }
Вызов операций с объединённым первичным ключом на service-уровне:
public void testMultiIdService(){ //id Test07Entity idEntity=new Test07Entity(); idEntity.setK1(1); idEntity.setK2("111"); //del
test07Service.deleteByMultiId(idEntity);
//add
test07Service.save(idEntity);
//query
Test07Entity retEntity=test07Service.selectByMultiId(idEntity);
retEntity.setCol1("xxxx");
//update
test07Mapper.updateByMultiId(retEntity);
}
Пакетные операции и saveOrUpdate с использованием объединённого первичного ключа:
@Test public void testSaveOrUpdateByMultiIdService() { //id Test07Entity idEntity = new Test07Entity(); idEntity.setK1(6); idEntity.setK2("666"); //del test07Service.deleteByMultiId(idEntity); //add test07Service.saveOrUpdateByMultiId(idEntity); //update idEntity.setCol1("ccccc"); test07Service.saveOrUpdateByMultiId(idEntity); }
@Test public void testSaveOrUpdateBatchByMultiIdService() { //ids List entityList = new ArrayList(); for (int i = 10; i < 30; i++) { Test07Entity idEntity = new Test07Entity(); idEntity.setK1(i); idEntity.setK2(String.valueOf(i * 10)); entityList.add(idEntity); } //del for (Test07Entity idEntity : entityList) { test07Service.deleteByMultiId(idEntity); } //add batch test07Service.saveOrUpdateBatchByMultiId(entityList); //del for (Test07Entity idEntity : entityList) { idEntity.setCol1(new Date().toString()); } //update batch test07Service.saveOrUpdateBatchByMultiId(entityList); }
Проблема связана с совместимостью mybatis-plus 3.5.5, необходимо использовать версию mpp 1.7.5 для решения этой проблемы.
**Как интегрировать плагин pagehelper?**
MyBatisPlus имеет собственную реализацию разбивки на страницы, если вам необходимо использовать плагин PageHelper, то он конфликтует с оригинальным MyBatisPlus. Решение: используйте следующий код для загрузки PageHelper (версия 5.1.10):
@Bean
ConfigurationCustomizer mybatisConfigurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
configuration.addInterceptor(new com.github.pagehelper.PageInterceptor());
}
};
}
**Версии:**
* mybatisplus-plus 1.7.5 совместим с mybatisplus 3.5.5+.
* mybatisplus-plus 1.7.4 оптимизирует функцию автоматического заполнения полей при преобразовании типов.
* mybatisplus-plus 1.7.3 совместим с mybatisplus 3.5.1+.
* mybatisplus-plus 1.7.2 поддерживает множественные первичные ключи @MppMultiId, которые совместимы с одиночными первичными ключами @TableId и могут быть использованы одновременно для одного поля. Также поддерживает наследование для сущностей с множественными первичными ключами.
* mybatisplus-plus 1.7.1 поддерживает наследование множественных первичных ключей для сущностей.
**Совместимость:**
* mybatisplus-plus 1.5.0 совместим с mybatisplus 3.3.1 (mybatis 3.5.3) до последней версии mybatisplus 3.4.2 (mybatis 3.5.6).
* mybatisplus-plus 1.5.1 совместим с последними версиями mybatisplus до 3.4.3.1.
* (mybatisplus-plus 1.5.1 не совместим с mybatisplus 3.4.3, в mybatisplus 3.4.3 есть ошибка, которая не позволяет его использовать, возникает сообщение об ошибке sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class).
* (mybatisplus-plus 1.5.1 несовместим с mybatisplus 3.4.3.2, возникает ошибка org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)).
* mybatisplus-plus 1.6.0 совместим с mybatisplus от 3.4.3.2 до mybatisplus 3.5.2 (протестировано до mybatisplus 3.5.2 2022118) (несовместимо с mybatisplus 3.5.3).
* mybatisplus-plus 1.7.0 совместим с JDK 11 (удалена функция настройки корневого пути OGNL), версии 1.7.0/1.7.1/1.7.2 имеют тот же диапазон совместимости с mpp 1.6.0.
* mybatisplus-plus 1.7.3 совместим с mybatisplus 3.5.1+ (протестирован до mybatisplus 3.5.3.1 20230129).
* mybatisplus-plus 1.7.5 совместим с mybatisplus 3.5.5+ (протестирован до mybatisplus 3.5.7 20240716).
**Демо-версии**
Добро пожаловать в группу обмена технологиями MyBatis Plus QQ **1028241274**, где вы можете скачать демо-версии различных версий.
Или скачайте демо-версию с диска Baidu, для скачивания требуется пароль. Чтобы получить пароль, подпишитесь на публичный аккаунт «Хобби и программирование», ответьте «плюс» и получите его.
Адрес для скачивания примера проекта mybatisplus-plus 1.7.2:
https://pan.baidu.com/s/1-FXzhNWF6c35Nb6KgUXKwA
Адрес для скачивания примера проекта mybatisplus-plus 1.7.1:
https://pan.baidu.com/s/1wJk1xQfs5skqayaihzY_qg
Адрес для скачивания примера проекта mybatisplus-plus 1.7.0:
https://pan.baidu.com/s/1jI5X0xDDUT4L6gl6QijFHA
Адрес для скачивания примера проекта mybatisplus-plus 1.6.0:
https://pan.baidu.com/s/1ZnLBkl27dr6KVg8D_Pn0Jw
Адрес для скачивания примера проекта mybatisplus-plus 1.5.1:
Ссылка: https://pan.baidu.com/s/1XfRy1jrTyOefp3bqiAmNwg
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )