您当前的位置: 首页 >  mybatis

MyBatis-Plus逻辑删除和字段自动填充

发布时间:2022-08-07 10:57:30 ,浏览量:7

一、ID生成策略 1、使用@TableId注解

@TableId注解:主键注解

使用位置:实体类主键字段。

@Data @ToString @TableName("t_user") public class UserDO { @TableId(value = "id", type = IdType.AUTO) private Long id; ... } 

在这里插入图片描述

2、全局ID生成策略

使用注解是针对一个POJO的。如果我们全局使用同样的 ID生成策略。那我们可以在全局配置文件中配置。就不需要在每个 POJO上使用 主键@TableId注解了。

mybatis-plus: global-config: db-config: id-type: auto
二、逻辑删除

官方文档-逻辑删除:https://baomidou.com/pages/6b03c5/

逻辑删除: 通常会在表里添加一个逻辑删除的字段,比如 enabled(1默认有效,0无效)。

MyBatis-Plus会在用户调用删除操作时将数据修改 UPDATE set enabled = 0, 在查询的时候会自动拼接只查 where enabled=1的数据。

1、全局配置

在YAML配置文件中添加全局配置

mybatis-plus: global-config: db-config: logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) 

不推荐使用全局配置,使用@TableLogic注解见名知意。

2、使用@TableLogic注解

@TableLogic注解:表字段逻辑处理注解(逻辑删除)。

1)表中添加 enabled字段

ALTER TABLE `t_user` ADD COLUMN `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否有效(1-有效,0-无效)'; 

2)在POJO实体类字段上加上 @TableLogic注解。

/**
	 * 代表逻辑删除
	 * 	value:逻辑未删除值
	 * 	delval:逻辑删除值
	 */ //@TableLogic @TableLogic(value = "1", delval = "0") private Integer enabled; 

到此,逻辑删除就配置好了,接下来测试一下删除和查询。

@Test public void testRemoveById() { System.out.println(("----- removeById method test ------")); boolean remove = userService.removeById(12L); System.out.println("remove = " + remove); } 

在这里插入图片描述

@Test public void testGetById() { System.out.println(("----- getById method test ------")); UserDO userDO = userService.getById(12L); System.out.println("userDO = " + userDO); } 

在这里插入图片描述

三、字段自动填充

官方文档-自动填充功能:https://baomidou.com/pages/4c6bcf/

在项目中,一般我们都会定义 create_time和update_time字段。针对这两个字段,每次CRUD操作时,我们都需要手动赋值或者数据库默认值。MyBatis-Plus提供了给字段自动填充数据的功能。

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', 

使用 MyBatis-Plus的自动填充功能,需要指定 fill类型,并且指定 自定义填充信息 MetaObjectHandler。

1、指定字段自动填充

在POJO中,指定 create_time和update_time字段为自动填充。

@TableField(value = "create_time", fill = FieldFill.INSERT) //@TableField(value = "create_time") private Date createTime; @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) //@TableField(value = "update_time") private Date updateTime; 

fill类型的值如下:

在这里插入图片描述 注意:如果指定了 fill为后面三个时,必须显示设置值。否则为报错:Column 'create_time' cannot be null。如果我们不显示指定设置值,我们必须定义 MetaObjectHandler。

2、自定义MetaObjectHandler
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); /**
         *方法的四个个参数:
 *      MetaObject metaObject: metaObject对象 
 *      String fieldName:POJO字段 
 *      ClassfieldType:字段类型 
 *      E fieldVal:自动填充的字段值 
 */ this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); //this.setFieldValByName("createTime", new Date(),metaObject); // 或者 this.strictInsertFill(metaObject, "updateTime", () -> new Date(), Date.class); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.strictInsertFill(metaObject, "updateTime", () -> new Date(), Date.class); } } 
3、测试

1)测试保存

@Test public void testSave() { System.out.println(("----- save method test ------")); UserDO userDO = new UserDO(); userDO.setUserName("赵云save fill"); userDO.setAge(20); userDO.setHeight(1.88); userDO.setEmail("zhaoyun@123.com"); boolean save = userService.save(userDO); System.out.println("save = " + save); System.out.println("userDO = " + userDO); } 

在这里插入图片描述

2)测试删除

@Test public void testRemoveById() { System.out.println(("----- removeById method test ------")); boolean remove = userService.removeById(111L); System.out.println("remove = " + remove); } 

在这里插入图片描述

四、执行SQL分析打印

生产环境不推荐使用,开发环境可以使用。

官方文档-自动填充功能:https://baomidou.com/pages/833fab/

引入 p6spy依赖:

 <dependency> <groupId>p6spy            
关注
打赏
1688896170
查看更多评论

暂无认证

  • 7浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0496s