👉 引言 💎
当我们使用MyBatis / MyBatis-plus 框架时,在往数据库中插入数据获取修改数据的时候,表中的某些非必要字段不想通过sql语句去赋值,想在数据插入或者修改的时候由框架自动进行填充。那么我们就可以使用一个注解@TableFiled()中的 fill 属性 具体使用方法如下: |
- 创建一张 user 表:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`is_deleted` tinyint(1) NULL DEFAULT NULL COMMENT '逻辑删除表标识',
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1397377088709918722 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 创建 user 实体类
@Data
@TableName("user")
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ASSIGN_ID,value = "uid") //雪花算法
private Long id;
/**
* 如果数据库中的字段名与实体类中不一致
*/
@TableField(value = "user_name")
private String name;
@TableField(fill = FieldFill.INSERT)
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
@TableField(value = "is_deleted")
private Boolean deleted; // 1 未删除 -1 已删除
}
- xml文件
<mapper namespace="com.ausware.mapper.UserMapper">
<sql id="Base_Column_List">
uid, user_name, age, email
</sql>
<sql id="Base_Column_List2">
user_name, age, email
</sql>
<insert id="addUser" parameterType="com.ausware.entity.User">
insert into user
(<include refid="Base_Column_List2"></include>)
values (#{user.name},#{user.age},#{user.email})
</insert>
</mapper>
- 配置类
通过实现MetaObjectHandler 接口重写其中的插入填充和修改填充的方法
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//判断当前对象的自动填充属性是否包含当前属性
if (metaObject.hasSetter("createTime")){
log.info("插入数据进行时间填充数据------");
//实现填充业务逻辑
this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now());
this.strictInsertFill(metaObject,"updateTime", LocalDateTime.class,LocalDateTime.now());
}
//如果业务层自己赋值就不需要执行自动填充
Object age = this.getFieldValByName("age", metaObject);
if(age == null){
log.info("插入数据进行年龄填充数据------");
this.strictInsertFill(metaObject,"age", Integer.class,18);
}
}
@Override
public void updateFill(MetaObject metaObject) {
if (metaObject.hasSetter("updateTime")) {
log.info("修改数据进行时间填充数据------");
//实现填充业务逻辑
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
}
- service
Boolean addUser(User user);
- serviceImpl
@Override
public Boolean addUser(User user) {
return userMapper.addUser(user);
}
- controller
@ApiOperation(value = "新增用户")
@PostMapping("/add")
public Boolean addUser(@RequestBody List<User> user){
return userService.saveBatch(user);
}
测试