目录
主键生成策略
- 数据库自增长
- UUID
- Redis生成id
- snowflake(雪花算法)
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);
-
}
运行结果
转载:https://blog.csdn.net/weixin_60719453/article/details/127771997
查看评论