Небольшая книга MybatisPlus, часть 9. Автоматическое заполнение общих значений полей по умолчанию

Spring Boot

Этот документ для первых девяти серии MyBatis Plus до 8 посетите следующий адрес:

1. Обработка полей заполнения

Случай требования: при вставке данных автоматически заполните createTime и updateTime как текущее время вставки данных и измените updateTime как время изменения данных при обновлении данных. Ручное назначение не требуется.

  • На уровне таблицы базы данных вам нужно добавить два поля типа даты create_tme и update_time

填充字段处理-数据库新建字段

  • Используйте аннотацию @TableField, чтобы отметить, какие поля в классе сущностей необходимо заполнить:
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

FieldFill — это перечисление, указывающее, при каких обстоятельствах оно будет заполняться автоматически.Существуют следующие необязательные значения:

  • ПО УМОЛЧАНИЮ: не обрабатывается по умолчанию
  • INSERT: автозаполнение полей при вставке
  • ОБНОВЛЕНИЕ: поля автозаполнения при обновлении
  • INSERT_UPDATE: поля автоматически заполняются при вставках и обновлениях.

2. Пользовательские значения заполнения по умолчанию

Напишем общедоступный класс обработчика заполнения полей, который наследует класс MetaObjectHandler, и переопределяет методы insertFill и updateFill, в этих двух методах мы получаем поля, которые необходимо заполнить, и заполненные по умолчанию значения.

  • Обработчик заполнения MyMetaObjectHandler должен объявить инъекцию @Component или @Bean в Spring Boot
  • Второй параметр методов strictInsertFill и strictUpdateFill — это имя свойства в классе сущностей, а не имя соответствующего поля базы данных.
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

Если это версия после 3.3.0, например 3.3.1.8, вы также можете использовать следующий более простой метод записи (3.3.0 не используйте этот метод, есть ошибки)

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "createTime", new Date());
        this.fillStrategy(metaObject, "updateTime", new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "updateTime", new Date());
    }
}

В некоторых старых версиях API для установки значений полей выглядит следующим образом, что устарело после 3.3.0.

this.setFieldValByName("createTime",new Date(),metaObject);
 this.setFieldValByName("updateTime",new Date(),metaObject);

3. Запустите тест

  • Вставляем кусок данных, обратите внимание, мы не присваивали значения createTime и updateTime
@Test
public void testInsert() {
  User user = new User();
  user.setName("字母哥");
  user.setAge(18);

  userMapper.insert(user);
}

Но результат операции таков: автоматически назначаются createTime и updateTimecreateTime和updateTime被自动赋值

  • Обновите часть данных на основе Id, обратите внимание, что мы не присваивали значение updateTime
@Test
public void testUpdate() {
  User user = new User();
  user.setId(1287387821681790977L);
  user.setName("字母哥&curry");
  user.setAge(18);

  userMapper.updateById(user);
}

Но результат операции: updateTime автоматически назначается при выполнении операции модификации записи данных.updateTime在执行数据记录修改操作时被自动赋值

Добро пожаловать, чтобы обратить внимание на мой блог, в нем много прекрасных коллекций

  • Эта статья воспроизводится с указанием источника (должна быть ссылка, а не только текст):Блог Адетокунбо.

Если вы считаете это полезным, пожалуйста, поставьте лайк и поделитесь! Ваша поддержка - моя неиссякаемая творческая мотивация!. Кроме того, автор недавно выпустил следующий прекрасный контент, с нетерпением жду вашего внимания.