当我们向数据库中插入一条记录或更新一条记录时,往往需要记录一些额外的信息,例如创建时间、更新时间、创建人和更新人等,在MyBatisPlus中可以通过@TableField注解来完成这些字段的自动填充,具体步骤如下:
- 在实体类中定义需要自动填充的字段,并在字段上添加@TableField注解,指定填充类型和填充策略,如下所示:
public class User {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; // 创建时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime; // 更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy; // 更新人
@TableField(fill = FieldFill.INSERT)
private Long createBy; // 创建人
// 省略其他属性和方法
}
其中,fill属性指定了填充类型,有三种类型可选:FieldFill.INSERT、FieldFill.UPDATE和FieldFill.INSERT_UPDATE,分别表示仅在插入时填充、仅在更新时填充和在插入和更新时均填充。填充策略可以在实体类中通过实现MetaObjectHandler接口进行定义。
- 在我们的Mapper接口中继承BaseMapper,并在注解中指定我们的实体类,如下所示:
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
- 在我们的配置文件中进行配置,如下所示:
<!-- 配置自动填充 -->
<bean id="mybatisPlusAutoFillHandler" class="com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler">
<property name="metaObjectHandler" ref="mybatisPlusMetaObjectHandler"/>
</bean>
<bean id="mybatisPlusMetaObjectHandler" class="com.baomidou.mybatisplus.extension.handlers.MetaObjectHandler">
<property name="insertFill" value="com.example.MyMetaObjectHandler"/>
<property name="updateFill" value="com.example.MyMetaObjectHandler"/>
</bean>
这里我们通过自定义MyMetaObjectHandler类实现了MetaObjectHandler接口,并在配置文件中指定了insertFill和updateFill属性的值为我们自定义的MyMetaObjectHandler类。
- 最后,在我们自定义的MyMetaObjectHandler类中实现需要自动填充的字段的逻辑,如下所示:
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
LocalDateTime now = LocalDateTime.now();
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);
User user = UserUtils.getCurrentUser();
if (user != null) {
this.strictInsertFill(metaObject, "createBy", Long.class, user.getId());
this.strictInsertFill(metaObject, "updateBy", Long.class, user.getId());
}
}
@Override
public void updateFill(MetaObject metaObject) {
LocalDateTime now = LocalDateTime.now();
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now);
User user = UserUtils.getCurrentUser();
if (user != null) {
this.strictUpdateFill(metaObject, "updateBy", Long.class, user.getId());
}
}
}
此处我们通过重写MetaObjectHandler接口中的insertFill和updateFill方法来实现自动填充的逻辑,比如创建时间和更新时间可以通过LocalDateTime.now()获取当前时间,创建人和更新人可以通过UserUtils.getCurrentUser()方法获取当前登录用户。
示例:
假设我们有以下两个实体类:
@Table(name = "tb_order")
@Getter
@Setter
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private LocalDateTime createTime;
private LocalDateTime updateTime;
private String goods;
@TableLogic
private Integer deleted;
}
@Table(name = "tb_order_detail")
@Getter
@Setter
public class OrderDetail {
@TableId(type = IdType.AUTO)
private Long id;
private Long orderId;
private String goods;
private Integer amount;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
}
对于Order类,我们可以在该实体类中的createTime、updateTime字段上使用@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.UPDATE)注解来实现插入和更新时的自动填充。
对于OrderDetail类,我们可以在该实体类中的createTime、updateTime字段上使用@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.UPDATE)注解来实现插入和更新时的自动填充。
注意,对于使用@TableField(fill = FieldFill.INSERT_UPDATE)注解的字段,需要在insert和update方法中都写入该字段,否则会出现填充不完整的情况。
以上就是在MyBatisPlus中使用@TableField完成字段自动填充的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在MyBatisPlus中使用@TableField完成字段自动填充的操作 - Python技术站