【mybatis-plus】主键id生成、字段自动填充

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【mybatis-plus】主键id生成、字段自动填充

一、主键id的生成


数据库表里通常都会有一个主键id,来作为这条数据的唯一标识。


常见的方式


  1. 数据库自动增长
  2. 这种很常见了,可以做到全库唯一。因为id是天然排序的,对于涉及到排序的操作会很方便。
  3. UUID
    上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦。因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id。
    UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了。
  4. redis
    redis也可以用来生成id,利用redis的原子操作。好处是可以不依赖数据库,性能好,但是随之因为redis的引入,带来了一定的复杂度。


mybatis-plus的方式


其实在之前使用mp进行新增数据的时候,我并没有进行对应的配置,默认就会带有主键id。


1268169-20201225114324464-485605341.png


对其配置也很简单,在主键上加注解,@TableId(type = IdType.ID_WORKER)


@Data
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 新增的时候update也有值
    private Date updateTime;
}


在idea编辑器里,可以按住ctrl+鼠标左击,看到IdType的几个枚举值。


1268169-20201225114953877-1336415341.png


  • AUTO:就是利用数据库自增了
  • NONE:未设置,需要手动设置值
  • INPUT: 需要手动设置值
  • UUID:生成UUID类型的主键id
  • ID_WORKER:生成19位的值,数字类型
  • ID_WORKer_STR:生成19位的值,字符串类型


关于mp的这个19位值的生成,可以做个了解,利用了snowflake算法。


snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。


其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),


12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。


二、mp实现自动填充


在操作数据库的时候还有一种常见操作,就是一些字段的填充,比如常见的create_time、update_time等,填充方式都是相同的。


那么除了每次的手动填充,还可以自动填充。而在MP里设置自动填充只要2步即可:


1.添加注解


@TableField(fill = FieldFill.INSERT)@TableField(fill = FieldFill.INSERT_UPDATE)


@Data
public class User {
    @TableId(type = IdType.ID_WORKER)
    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;
}


2.自定义实现类 MyMetaObjectHandler


这里需要我们自己写一个实现类


@Component //此注解表示 将其交给spring去管理
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);
    }
}


对了,要在数据库表里增加对应的字段create_timeupdate_time。添加后可以试一下了,先来新增一条测试数据:


//    新增
    @Test
    void addUser() {
        User user = new User();
        user.setName("老王");
        user.setAge(66);
        user.setEmail("laowang@123.com");
        userMapper.insert(user);
    }


执行成功后查看数据库表:


1268169-20201225121517859-1880591721.png


新增的时候,2个字段都填充了时间。


那现在只做更新操作的时候,只会去更新update_time。


//    修改
    @Test
    void updateUser() {
        User user = new User();
        user.setId(1342322873243996161L);
        user.setName("老王修改后");
        userMapper.updateById(user);
    }


1268169-20201225121737372-1306012954.png


结果正确。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
187 8
|
9天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
29天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
34 1
|
4月前
|
Java 数据库连接 测试技术
mybatis plus 获取新增实体的主键
mybatis plus 获取新增实体的主键
145 8
|
4月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
59 7
|
4月前
|
算法 Java 数据库连接
mybatis plus 主键策略
mybatis plus 主键策略
56 2
|
4月前
|
Oracle 关系型数据库 Java
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
116 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。