书接上文,讲解完MP的基本知识,我们已经可以独立完成增删改查的功能,本文将讲解一些MP更加深入的知识,让我们开始吧
主键策略
简单来说就是我们该用哪种方式生成主键,这里的主键策略和IdType相关,每一种IdType代表着一种主键生成策略
示例:@TableId(value = “id”, type = IdType.INPUT)
全部的IdType如下:
值 | 描述 | 备注 |
---|---|---|
AUTO | 数据库 ID 自增 | AUTO自动增长策略,这个配合数据库使用,Mysql可以,但是Oracle不行 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) | 在 application.properties 中添加如下配置:mybatis-plus.global-config.db-config.id-type=auto |
INPUT | insert 前自行 set 主键值 | INPUT进行自己传递主键即可,进行插入工作,但在插入之前一定要检查数据库是否已经存在了该主键Mybatis-Plus 内置了5个数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展,下面会详细讲解) |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) | 使用雪花算法自动生成主键 ID(雪花算法自行了解) |
ASSIGN_UUID | 分配 UUID,主键类型为 String,使用接口IdentifierGenerator的方法nextUUID(默认 default 方法) | 自动生成不含中划线的 UUID 作为主键 |
接下来我们分别测试一下吧
测试主键策略-AUTO
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@Test
public void testMPKeyGenerator() {
User user = new User();
user.setName("张三");
user.setEmail("123@qq.com");
user.setAge(12);
user.setCreateTime(LocalDateTime.now());
boolean save = userService.save(user);
System.out.println(save);
}
测试结果:主键ID+1
测试主键策略-NONE
application.properties
mybatis-plus:
global-config:
db-config:
id-type: auto
@TableId(value = "id", type = IdType.NONE)
private Long id;
测试结果:主键ID+1
注意:注解里等于跟随全局,下面是TableId代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableId {
String value() default "";
IdType type() default IdType.NONE;
}
测试主键策略-INPUT
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@Test
public void testMPKeyGenerator() {
User user = new User();
user.setId(100l);
user.setName("张三");
user.setEmail("123@qq.com");
user.setAge(12);
user.setCreateTime(LocalDateTime.now());
boolean save = userService.save(user);
System.out.println(save);
}
注意:如果在input策略下不自己设置主键值,并且数据库主键不是自动增长就会报错
虽然MP内置了5种5个数据库主键序列:
- DB2KeyGenerator
- H2KeyGenerator
- KingbaseKeyGenerator
- OracleKeyGenerator
- PostgreKeyGenerator
我们可以这样使用(由于作者只有MySQL数据库,所以这里代码参照官方):
实体类
@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class YourEntity {
@TableId(value = "ID_STR", type = IdType.INPUT)
private String idStr;
}
配置类
@Configuration
public class MPConfig {
@Bean
public IKeyGenerator keyGenerator()