返回

Mybatis-Plus:探秘主键赋值奥秘,一网打尽各类主键用法

后端

MyBatis-Plus:揭秘主键赋值的奥秘

理解主键赋值时机,掌握数据库之钥

在数据库的世界里,主键扮演着至关重要的角色,充当着唯一标识符,确保数据的准确性和完整性。在 MyBatis-Plus 框架中,不同类型的主键有着不同的赋值时机,了解这些时机对于优化数据库性能、保障数据可靠性至关重要。

自增主键:数据库自动生成,随增随取

自增主键是最常见的类型,由数据库自动生成,随着记录的插入而递增。在 MyBatis-Plus 中,自增主键的赋值发生在执行插入操作后,框架通过 JDBC 获取自增主键值并将其赋值给实体对象。就像魔术师从帽子中变出兔子一样,框架将自增主键值从数据库中提取出来,填充到实体对象中。

// 实体类
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    // 其他属性
}

// 插入操作
User user = new User();
user.setUsername("John");
user.setPassword("123456");
int rowCount = userMapper.insert(user);

// 获取自增主键值
System.out.println("新插入的用户的ID:" + user.getId());

序列主键:预定义序列,有序生成

序列主键也是由数据库自动生成的,但与自增主键不同,序列主键是通过预先定义的序列生成的。在 MyBatis-Plus 中,序列主键的赋值过程与自增主键类似,在执行插入操作后,框架通过 JDBC 获取序列主键值并将其赋值给实体对象。

// 实体类
public class Product {
    @TableId(type = IdType.SEQUENCE)
    private Long id;
    // 其他属性
}

// 插入操作
Product product = new Product();
product.setName("iPhone 14");
product.setPrice(9999.99);
int rowCount = productMapper.insert(product);

// 获取序列主键值
System.out.println("新插入的产品的ID:" + product.getId());

UUID主键:通用唯一标识符,分布式生成

UUID(Universally Unique Identifier)是一种通用唯一标识符,它是由 32 位十六进制数字组成的字符串。在 MyBatis-Plus 中,UUID 主键的赋值发生在实体对象创建时,框架调用 UUID 生成器生成一个 UUID 值并将其赋值给实体对象的 ID 属性。

// 实体类
public class Order {
    @TableId(type = IdType.UUID)
    private String id;
    // 其他属性
}

// 创建实体对象
Order order = new Order();
order.setUserId(1L);
order.setTotalAmount(100.0);

// 获取 UUID 主键值
System.out.println("新创建的订单的ID:" + order.getId());

雪花算法主键:分布式生成,有序递增

雪花算法是一种分布式主键生成算法,可以生成唯一且有序的 ID 值。在 MyBatis-Plus 中,雪花算法主键的赋值过程与 UUID 主键类似,在实体对象创建时,框架调用雪花算法生成器生成一个雪花 ID 值并将其赋值给实体对象的 ID 属性。

// 实体类
public class Message {
    @TableId(type = IdType.SNOW_FLAKE)
    private Long id;
    // 其他属性
}

// 创建实体对象
Message message = new Message();
message.setContent("Hello, world!");

// 获取雪花算法主键值
System.out.println("新创建的消息的ID:" + message.getId());

主键赋值时机总结

主键类型 赋值时机
自增主键 执行插入操作后,通过 JDBC 获取自增主键值
序列主键 执行插入操作后,通过 JDBC 获取序列主键值
UUID 主键 实体对象创建时,通过 UUID 生成器生成 UUID 值
雪花算法主键 实体对象创建时,通过雪花算法生成器生成雪花 ID 值

常见问题解答

  1. 如何手动指定主键值?

    • MyBatis-Plus 不支持手动指定主键值,主键值由数据库或框架自动生成。
  2. 主键赋值失败时如何处理?

    • 如果主键赋值失败,框架将抛出异常,可以捕获异常并进行适当处理。
  3. 不同类型的主键性能如何比较?

    • 自增主键和序列主键性能较好,但容易产生主键冲突。UUID 主键和雪花算法主键性能较差,但可以避免主键冲突。
  4. 如何选择合适的主键类型?

    • 根据业务场景选择合适的主键类型,如果需要主键有序,则选择自增主键或序列主键;如果需要主键全局唯一,则选择 UUID 主键或雪花算法主键。
  5. 主键赋值时机对数据库性能有什么影响?

    • 合适的主键赋值时机可以优化数据库性能,避免主键冲突和锁等待。