使用Mybatis Plus实现 添加/修改 自动填充对象属性

本文介绍了如何在Java开发中利用MyBatisPlus库自动填充数据库记录的创建时间和更新时间。通过在实体类中添加@TableField注解,并配置MetaObjectHandler,实现了在插入和更新数据时无需手动设置这些时间戳,简化了开发过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

在实际开发中,例如向数据库中添加或者修改一条记录时,需要在数据库中记录自动生成添加或者修改的时间,便于数据的维护。使用MP 可以很简单的实现这个需求。

准备

  • mysql 8
  • mybatis plus 3.5.3

操作

数据库部分


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `uid` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `u_name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `sex` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '性别',
  `is_deleted` int(1) UNSIGNED ZEROFILL NULL DEFAULT NULL COMMENT '逻辑删除',
  `create_time` datetime NULL DEFAULT NULL COMMENT '对象创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '对象修改时间',
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1564799976293289986 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (100, '赵宇奇', 18, 'zhsan@qq.com', 0, 0, '2022-09-05 17:05:22', '2022-09-05 17:08:30');

SET FOREIGN_KEY_CHECKS = 1;

java代码

  1. 实体类 user.java
@Data
@TableName("users")
public class User {
    @TableId(value = "uid")
    private Long id;
    
    @TableField("u_name")
    private String name;
    private Integer age;
    private String email;
    private SexEnum sex;
    private Integer isDeleted;

    //开启字段插入自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //开启字段更新自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

  • @TableField(fill = FieldFill.INSERT):在插入的时候自动填充
  • @TableField(fill = FieldFill.INSERT_UPDATE)在插入或者更新时自动填充
  1. 配置Handler(必要)
/*
添加对象时,实现对象属性自动填充
 */
@Component
public class MyObjectHandler implements MetaObjectHandler {

    //插入填充
    @Override
    public void insertFill(MetaObject metaObject) {
        setFieldValByName("createTime", new Date(), metaObject);
        setFieldValByName("updateTime", new Date(), metaObject);
    }

    //更新填充
    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("updateTime", new Date(), metaObject);
    }
}

到这里就配置OK了。

测试

    @Test
    public void testInsert() {
        User user = new User();
        user.setAge(18);
        user.setName("张无忌");
        user.setEmail("zhsan@qq.com");
        //如果自己指定了id  则按自己指定的id添加
        user.setId(100L);
        //INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
        int insert = userMapper.insert(user);
        System.out.println("insert = " + insert);
        //1564445186619142145:使用雪花算法生成的id
        Long userId = user.getId();
        System.out.println("userId = " + userId);
    }

结果:
测试添加

    @Test
    public void testUpdateById(){
        //UPDATE user SET name=?, age=? WHERE id=?
        User zhaoyuqi = new User();
        zhaoyuqi.setId(100L);
        zhaoyuqi.setSex(SexEnum.FEMALE);
        zhaoyuqi.setName("张三");
        int count = userMapper.updateById(zhaoyuqi);
        System.out.println("受影响行数 = " + count);
    }

结果:
测试修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值