需求
在实际开发中,例如向数据库中添加或者修改一条记录时,需要在数据库中记录自动生成添加或者修改的时间,便于数据的维护。使用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代码
- 实体类 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)在插入或者更新时自动填充
- 配置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);
}
结果: