使用Mybatis-plus框架,新增或修改数据时自动为字段填充值

👉 引言 💎

csdn

当我们使用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);
    }

测试

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_子栖_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值