1. 概述
Mybatis-plus为我们支持了许多种的主键策略,主键策略是指Mybatis-plus可以自动生成主键的策略,不需要手动插入主键,Mybatis-plus的主键策略帮我们自动生成主键
2.官方网站
主键策略 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/e131bd/
3.主键策略
public enum IdType {
/**
* 数据库自增
* 注:需设置数据库自增
*/
AUTO(0),
/**
* 不设置任何策略,但是会跟随全局策略
*/
NONE(1),
/**
* 手动输入
*/
INPUT(2),
/**
* 使用雪花算法生成主键
*/
ASSIGN_ID(3),
/**
* 使用UUID生成主键
*/
ASSIGN_UUID(4);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
4.实例
在字段上面加上注解即可使用Mybatis-plus的主键策略
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
5.自定义主键策略实现
通过实现IdentifierGenerator接口,撰写自定义id策略
/**
* @author wangli
* @data 2022/4/15 16:05
* @Description:自定义ID生成器,仅作为示范
*/
@Slf4j
@Component
public class CustomIdGenerator implements IdentifierGenerator {
private final AtomicLong al = new AtomicLong(1);
@Override
public Long nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
log.info("bizKey:{}", bizKey);
MetaObject metaObject = SystemMetaObject.forObject(entity);
String name = (String) metaObject.getValue("name");
final long id = al.getAndAdd(1);
log.info("为{}生成主键值->:{}", name, id);
return id;
}
}
6.全局主键策略实现
6.1 导入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
6.2 在yml文件中设置全局主键策略
注:我在此使用的是雪花算法的主键策略
server:
port: 1000
spring:
application:
name: tanhua-usercenter
main:
allow-bean-definition-overriding: true
#redis
redis:
host: 192.168.56.10
port: 6379
#全局时间策略
jackson:
time-zone: GMT+8
default-property-inclusion: always
date-format: yyyy-MM-dd HH:mm:ss
#全局主键策略:雪花算法主键策略
mybatis-plus:
global-config:
db-config:
id-type: ASSIGN_ID
6.3 在实体类中使用注解
在主键上添加注解@TableId(type= IdType.NONE),定义了全局策略如果要使用全局策略必须使用IdType.NONE,这种表示不设置任何策略,但是如果设置了全局策略,则会跟随全局策略,如果设定其他主键策略的情况,会优先使用当前设置的主键策略。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo extends BasePojo implements Serializable{
/**
* 由于userinfo表和user表之间是一对一关系
* userInfo的id来源于user表的id
*/
@ApiModelProperty(value = "主键")
@TableId(type= IdType.NONE)
private Long id; //用户id
@ApiModelProperty(value = "昵称")
@TableField("mobile")
private String mobile; //昵称
@ApiModelProperty(value = "用户头像")
@TableField("avatar")
private String avatar; //用户头像
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64411.html