目录
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0
mybatisplus的主键生成策略就是采用这种雪花算法方式
测试插入
- @Test
- void insert() {
- User user = new User();
- user.setName("kc");
- user.setAge(18);
- user.setEmail("123@qq.com");
- userMapper.insert(user);
- }

配置主键自增
在实体类对象中配置,前提是数据库表中也是设置自增的
- @Data
- public class User {
-
- @TableId(type = IdType.AUTO)
- private Long id;
- private String name;
- private Integer age;
- private String email;
- }
IdType源码
- public enum IdType {
- AUTO(0),数据库id自增
- NONE(1),未设置主键
- INPUT(2),手动输入
- ID_WORKER(3),默认的全局唯一id
- ID_WORKER_STR(3), ID_WORKER字符串表示法
- UUID(4);//全局唯一id uuid
- }

自动拼接动态sql

创建时间、修改时间,这些操作一般都是自动化完成的,不希望手动更新。
阿里巴巴开发手册:一般所有的数据库表:都要配上gmt_create、gmt_modified这两个字段,而且需要自动化。
在数据库表中新增这两个字段,默认值为CURRENT_TIMESTAMP,表示当前时间

数据库表通常是不能够修改的,在代码中使用自动填充
首先在对象上添加 @TableField字段
- import java.util.Date;
-
- @Data
- public class User {
-
- @TableId(type = IdType.AUTO)
- private Long id;
- private String name;
- private Integer age;
- private String email;
- @TableField(fill = FieldFill.INSERT)//插入的时候执行
- private Date creatTime;
- @TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时执行
- private Date updateTime;
-
- }
然后自定义实现类 MyMetaObjectHandler,好让spring识别并做出处理
- package com.handler;
-
- import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.ibatis.reflection.MetaObject;
- import org.springframework.stereotype.Component;
-
- import java.util.Date;
-
- @Slf4j
- @Component//得交给spring容器管理
- public class MyMetaObjectHandler implements MetaObjectHandler {
- @Override
- public void insertFill(MetaObject metaObject) {
- log.info("start insert fill...");
- //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
- this.setFieldValByName("creatTime", new Date(),metaObject);
- this.setFieldValByName("updateTime", new Date(),metaObject);
- }
-
- @Override
- public void updateFill(MetaObject metaObject) {
- log.info("start update fill...");
- this.setFieldValByName("updateTime", new Date(),metaObject);
-
- }
- }
测试插入
- @Test
- void insert() {
- User user = new User();
- user.setName("autoInertTest");
- user.setAge(123);
- user.setEmail("12133@qq.com");
- userMapper.insert(user);
- }
运行结果

测试更新
- @Test
- void update() {
- User user = new User();
- user.setId(5L);
- user.setName("kongchaoAfter");
- user.setAge(1222);
- user.setEmail("nono@qq.com");
- userMapper.updateById(user);
- }
运行结果
