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

一、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 ....");
        /**
         *方法的四个个参数:<br/>
         *      MetaObject metaObject: metaObject对象 <br/>
         *      String fieldName:POJO字段 <br/>
         *      Class<T> fieldType:字段类型 <br/>
         *      E fieldVal:自动填充的字段值 <br/>
         */
        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);  }  }

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依赖:

<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
    <dependency>
      <groupId>p6spy</groupId>
      <artifactId>p6spy</artifactId>
      <version>3.9.1</version>
    </dependency>

1、添加 spy.properties配置文件

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

2、修改数据源配置

修改驱动类和 url的前缀。

spring:
  ## 数据源配置
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver # com.mysql.cj.jdbc.Driver
    # url: jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
    url: jdbc:p6spy:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
    username: root
    password: 123456

3、测试查询

多了红色的部分,其实我们使用 MyBatisLogFormat插件也是可以得到真实执行的SQL语句。

– 求知若饥,虚心若愚。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容