MybatisPlus详解(二)

本文详细介绍了MybatisPlus的主键生成策略,包括ID_WORK、AUTO和INPUT策略,并提供了雪花算法的简介。同时,还探讨了更新操作的实现,以及通过数据库和代码级别实现自动填充创建时间和更新时间的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主键生成策略

1、 测试添加一条数据

@Test
void testSave() {

    User user = new User();
    user.setName("will");
    user.setAge(3);
    user.setEmail("abc@163.com");

    int result = userMapper.insert(user); // 帮我们自动生成ID

    System.out.println(result); // 受影响的行数

    System.out.println(user); // id,自动回填
}

在这里插入图片描述
在这里插入图片描述

2、 所有主键生成策略介绍

public enum IdType {
    AUTO(0), // 数据库id自增
    NONE(1), // 未设置主键
    INPUT(2), // 手工输入
    ID_WORKER(3), // 默认的全局唯一id
    UUID(4), // 全局唯一的id uuid
    ID_WORKER_STR(5); // ID_WORKER的字符串表示法
}

3、 默认主键生成策略ID_WORK

雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake。雪花算法支持的TPS可以达到419万左右(2^22*1000)。

4、 自增策略AUTO

 修改实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.AUTO)
    private Long id; // 对应数据库
    private String name;
    private Integer age;
    private String email;

}

 数据库表字段一定要是自增!
在这里插入图片描述

 再次测试添加操作
在这里插入图片描述

5、 手工输入策略INPUT

 修改实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.INPUT)
    private Long id; // 对应数据库
    private String name;
    private Integer age;
    private String email;

}

 数据库表字段取消自增!
在这里插入图片描述

 修改添加操作代码

@Test
void testSave() {

    User user = new User();
    user.setId(10L);
    user.setName("will");
    user.setAge(3);
    user.setEmail("abc@163.com");

    int result = userMapper.insert(user); // 帮我们自动生成ID

    System.out.println(result); // 受影响的行数

    System.out.println(user); // id,自动回填
}

 再次测试添加操作
在这里插入图片描述

更新操作测试

1、 编码

// 更新测试
@Test
void testUpdate() {

    User user = new User();
    user.setId(10L);
    user.setName("will123");
    user.setAge(3);
    user.setEmail("abc@163.com");

    userMapper.updateById(user);

}

2、 测试根据ID更新,观察生成语句

在这里插入图片描述

3、 观察数据库

在这里插入图片描述

自动填充处理

创建时间、修改时间等字段,这些字段的更新一般都是自动化完成的,不希望手动更新!

方式一:数据库级别

1、在表中新增字段create_time、update_time

在这里插入图片描述
在这里插入图片描述

2、更新实体类,添加字段createTime、updateTime

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.INPUT)
    private Long id; // 对应数据库
    private String name;
    private Integer age;
    private String email;
    private Date createTime;
    private Date updateTime;

}

3、再次执行更新操作

在这里插入图片描述

4、查看更新结果
在这里插入图片描述

方式二:代码级别

1、 删除数据库默认值,更新操作

在这里插入图片描述

2、 更新实体类,使用注解

package com.will.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.INPUT)
    private Long id; // 对应数据库
    private String name;
    private Integer age;
    private String email;
    // 字段填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

3、 编写填充策略

package com.will.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component //一定不要忘记把处理器加入ICO容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    // 更新时候的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

4、 测试添加一条数据,观察创建时间

@Test
void testSave() {
    User user = new User();
    user.setId(11L);
    user.setName("will01");
    user.setAge(3);
    user.setEmail("abc@163.com");
    int result = userMapper.insert(user); // 帮我们自动生成ID
    System.out.println(result); // 受影响的行数
    System.out.println(user); // id,自动回填
}

在这里插入图片描述
在这里插入图片描述

5、 测试更新一条数据,观察更新时间

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帅帅的猪头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值