Skip to content

在定义实体类时,用@TableId指定主键,而其type属性,可以指定主键策略。 mp支持多种主键策略,默认的策略是基于雪花算法的自增id。全部主键策略定义在了枚举类IdType中,IdType有如下的取值 • AUTO 数据库ID自增,依赖于数据库。在插入操作生成SQL语句时,不会插入主键这一列 • NONE 未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID) • INPUT 需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。oracle的序列主键需要使用这种方式 • ASSIGN_ID 当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法 • ASSIGN_UUID 当实体类的主键属性为空时,才会自动填充,使用UUID • ....(还有几种是已过时的,就不再列举) 可以针对每个实体类,使用@TableId注解指定该实体类的主键策略,这可以理解为局部策略。若希望对所有的实体类,都采用同一种主键策略,挨个在每个实体类上进行配置,则太麻烦了,此时可以用主键的全局策略。只需要在application.yml进行配置即可。比如,配置了全局采用自增主键策略 # application.ymlmybatis-plus:global-config:db-config:id-type:auto复制代码 下面对不同主键策略的行为进行演示 • AUTO 在User上对id属性加上注解,然后将MYSQL的user表修改其主键为自增。

@EqualsAndHashCode(callSuper = false)@DatapublicclassUserextendsModel<User> { @TableId(type = IdType.AUTO)privateLong id; @TableField(condition = SqlCondition.LIKE)privateString name; @TableField(condition = "%s > #{%s}")privateInteger age; privateString email; privateLong managerId; privateLocalDateTime createTime; } 复制代码 测试

@TestpublicvoidtestAuto(){ Useruser=newUser(); user.setName(" 我是青蛙呱呱

"); user.setAge(99); user.setEmail("frog@baomidou.com"); user.setCreateTime(LocalDateTime.now()); userMapper.insert(user); System.out.println(user.getId()); } 复制代码 结果

可以看到,代码中没有设置主键ID,发出的SQL语句中也没有设置主键ID,并且插入结束后,主键ID会被写回到实体对象。 • NONE 在MYSQL的user表中,去掉主键自增。然后修改User类(若不配置@TableId注解,默认主键策略也是NONE) @TableId(type = IdType.NONE)privateLong id; 复制代码 插入时,若实体类的主键ID有值,则使用之;若主键ID为空,则使用主键全局策略,来生成一个ID。 • 其余的策略类似,不赘述 小结 AUTO依赖于数据库的自增主键,插入时,实体对象无需设置主键,插入成功后,主键会被写回实体对象。 INPUT完全依赖于用户输入。实体对象中主键ID是什么,插入到数据库时就设置什么。若有值便设置值,若为null则设置null 其余的几个策略,都是在实体对象中主键ID为空时,才会自动生成。 NONE会跟随全局策略,ASSIGN_ID采用雪花算法,ASSIGN_UUID采用UUID 全局配置,在application.yml中进行即可;针对单个实体类的局部配置,使用@TableId即可。对于某个实体类,若它有局部主键策略,则采用之,否则,跟随全局策略。

本站总访问 — 次