如何实现后端开发框架(八)-自动生成主键ID

1. 问题描述

后端在设计数据库时每张表都需要设计一个主键,那么在开发框架上如何自动生成这个主键值呢?

2. 实现思路

在开发框架上给每张数据库表都设计一个独立的主键字段,如果数据表还需要业务主键那么就设计额外字段进行处理。

主键ID生成方式强烈推荐使用UUID就行了,不用使用数据库生成方式(数据库序列,自增长方式等),使用UUID在系统初始数据准备,系统上线数据准备,数据库数据迁移时会非常方便。

我们利用MyBatis-Plus的主键生成策略功能来实现自动生成主键ID。

参考资料: https://baomidou.com/guides/key-generator/

3. 实现步骤

往实体基类上添加通用主键ID,使用@TableId来标识主键字段,默认会使用雪花算法结合不含中划线的UUID作为ID生成方式。

如果想修改ID生成方式,例如使用数据库方式来生成ID,参考资料: https://baomidou.com/reference/#idtype

如果需要实现自定义业务ID生成,参考资料: https://baomidou.com/guides/key-generator/

@Data
@EqualsAndHashCode()
public class MyBaseEntity implements Serializable {
  private static final long serialVersionUID = 1L;

  @TableId(value = "ID")
  protected String id;

  /** 创建用户 */
  @TableField(value = "CREATE_USER", fill = FieldFill.INSERT)
  protected String createUser;

  /** 创建时间 */
  @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
  protected Date createTime;

  /** 修改用户 */
  @TableField(value = "UPDATE_USER", fill = FieldFill.INSERT_UPDATE)
  protected String updateUser;

  /** 修改时间 */
  @TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)
  protected Date updateTime;

  @TableField(exist = false)
  protected long pageSize;

  @TableField(exist = false)
  protected long currentPage;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

4. 测试代码

使用Mybatis-Plus的数据库新增API后,数据库ID就会按照配置的主键生成策略自动生成。

@RestController
@RequestMapping("/test/user")
public class UserController extends MyBaseController<UserService, User> {
  /**
   * 创建用户信息
   *
   * @param user
   * @return
   */
  @PostMapping(value = "/create")
  public boolean create(@RequestBody User user) {
    return myBaseService.save(user);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

5. 完整代码

完整代码见以下Git仓库中的"autogenerate-id"子项目:

 https://github.com/randy0098/framework-samples