本章节将介绍 @TableId 注解的用法,该注解用于将某个成员变量指定为数据表主键。实例:
1 2 3 4 5 | @TableName ( "user" ) public class UserBean { @TableId (value = "user_id" , type = IdType.AUTO) private Integer userId; } |
上面实例中,将 UserBean 中的 userId 字段标识为主键,并且对应数据表中的 user_id 字段。
下面将介绍 @TableId 注解的属性:
value
指定数据表主键字段名称,不是必填的,默认为空字符串。
type
指定数据表主键类型,如:ID自增、UUID等。该属性的值是一个 IdType 枚举类型,默认为 IdType.NONE。
IdType 枚举
IdType 枚举可取值如下:
AUTO
数据库 ID 自增。如果我们创建数据库表时使用了 AUTO_INCREMENT 修饰主键,如下:
1 2 3 4 5 6 | CREATE TABLE ` user ` ( `user_id` int (10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID' , ` name ` varchar (100) DEFAULT NULL COMMENT '用户名' , -- ... 忽略 ... PRIMARY KEY (`user_id`) ); |
我们使用 @TableId 时可以指定为 IdType.AUTO。
NONE
无状态,该类型为 type 属性的默认主键类型(全局属性为 IdType.INPUT)。当我们设置 @TableId 类型为NONE 时,且不手动设置主键值,MyBatis Plus 将默认给出一个 Long 类型的字符串。例如:
1 2 3 4 5 6 7 8 | // JavaBean 定义 @TableId (value = "user_id" , type = IdType.NONE) private Long userId; // 调用方法 AnnotationUserBean userBean = new AnnotationUserBean( "测试-" + System .currentTimeMillis(), "男" , ( int )( Math .random() * 50 ) + 10 ); userMapper.insert(userBean); |
执行 insert 方法,输出日志如下:
1 2 | Preparing: INSERT INTO mybatis_test. user ( user_id, name , sex, age ) VALUES ( ?, ?, ?, ? ) Parameters: 1315521648090255362(Long), 测试-1602479776677(String), 男(String), 47( Integer ) |
其中,1315521648090255362 就是 MyBatis Plus 自动设置的值。
INPUT
insert 前自行 set 主键值。例如:
1 2 3 4 5 6 7 8 | // JavaBean 定义 @TableId (value = "user_id" , type = IdType.INPUT) private Long userId; // 调用方法 AnnotationUserBean userBean = new AnnotationUserBean( "测试-" + System .currentTimeMillis(), "男" , ( int )( Math .random() * 50 ) + 10 ); userMapper.insert(userBean); |
执行 insert 方法,输出日志如下:
1 2 | Preparing: INSERT INTO mybatis_test. user ( user_id, name , sex, age ) VALUES ( ?, ?, ?, ? ) Parameters: null , 测试-1602479950289(String), 男(String), 22( Integer ) |
从上面可以日志得知,当我们没有设置 user_id 主键值时,MyBatis Plus 并没有设置 Long 类型的值。
ASSIGN_ID
分配ID(主键类型为 Number(Long和Integer) 或 String)(since 3.3.0),使用接口 IdentifierGenerator 的方法 nextId(默认实现类为 DefaultIdentifierGenerator 雪花算法)。例如:
1 2 3 4 5 6 7 8 | // JavaBean 定义 @TableId (value = "user_id" , type = IdType.ASSIGN_ID) private Long userId; // 调用方法 AnnotationUserBean userBean = new AnnotationUserBean( "测试-" + System .currentTimeMillis(), "男" , ( int )( Math .random() * 50 ) + 10 ); userMapper.insert(userBean); |
执行 insert 方法,输出日志如下:
1 2 | Preparing: INSERT INTO mybatis_test. user ( user_id, name , sex, age ) VALUES ( ?, ?, ?, ? ) Parameters: 1315523711071158273(Long), 测试-1602480268514(String), 男(String), 57( Integer ) |
上面日志中的 user_id “1315523711071158273” 是通过调用 DefaultIdentifierGenerator 的 nextId 方法获取。
ASSIGN_UUID
分配 UUID,主键类型为 String (since 3.3.0),使用接口 IdentifierGenerator 的方法 nextUUID(默认 default 方法)。实例:
1 2 3 4 5 6 7 8 9 | // JavaBean 定义 @TableId (value = "user_id" , type = IdType.ASSIGN_UUID) private String userId; // 调用方法 AnnotationUser2Bean userBean = new AnnotationUser2Bean( "测试-" + System .currentTimeMillis(), "男" , ( int )( Math .random() * 50 ) + 10 ); userMapper.insert(userBean); |
执行 insert 方法,输出日志如下:
1 2 | Preparing: INSERT INTO mybatis_test. user ( user_id, name , sex, age ) VALUES ( ?, ?, ?, ? ) Parameters: 48c60eb8d6e684d0cb3ae7e0ef603239(String), 测试-1602480769751(String), 男(String), 37( Integer ) |
上面日志中的 “48c60eb8d6e684d0cb3ae7e0ef603239” 用户ID是通过 IdentifierGenerator 的 nextUUID 方法得到。
ID_WORKER(已废弃)
分布式全局唯一 ID 长整型类型(请使用 ASSIGN_ID)
UUID(已废弃)
32 位 UUID 字符串(请使用 ASSIGN_UUID)
ID_WORKER_STR(已废弃)
分布式全局唯一 ID 字符串类型(请使用 ASSIGN_ID)