mybatis-plus使用ASSIGN_ID来作为生成主键

本文介绍了如何将mybatis-plus的主键生成策略从数据库自增和UUID改为使用SnowFlake算法。详细分析了SnowFlake算法的原理,包括64位long型数字的各个组成部分,并提供了源码分析和改造步骤。改造主要包括修改字段类型和添加@TableId注解,最终实现分布式ID的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

之前项目中的主键使用数据库自增,发现后台不太友好。之后又换成了UUID,字符串逐渐不易检索。项目使用了mybatis-plus,查阅文档发现可以使用分布式ID

开始更换

mybatis-plus 版本为3.3.1

文档地址:https://mp.baomidou.com/guide/annotation.html#tableid
在这里插入图片描述

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <
<think>好的,我现在需要帮助用户了解如何在MyBatis-Plus使用varchar类型作为主键。首先,用户的问题是关于主键配置的,所以我要回忆一下MyBatis-Plus的相关知识。 根据引用内容,MyBatis-Plus支持标准SQL的数据库,所以使用varchar作为主键应该是可行的,但具体配置可能需要调整。接下来,我需要考虑实体类的配置。通常,主键字段会用@TableId注解,默认类型是雪花算法的Long类型。如果要改成varchar,需要指定类型为IdType.ASSIGN_ID或者IdType.INPUT,具体取决于用户是否手动赋值。 然后,数据库表结构也需要对应修改,确保主键字段是varchar类型,并且长度足够。此外,主键生成策略可能需要用户自己处理,比如使用UUID或者自定义的字符串生成方式,这时在插入数据时需要手动设置主键值。 还要注意全局配置,比如在application.yml中设置id-type为none,这样MyBatis-Plus就不会自动生成主键,而是依赖用户输入。同时,逻辑删除的配置可能不影响主键类型,但需要确认其他插件或配置是否冲突。 用户可能还会关心如何自动生成varchar主键,比如用UUID,这时候可以在实体类中使用@TableId(type = IdType.ASSIGN_UUID),但需要确认MyBatis-Plus版本是否支持。或者,在插入前手动生成UUID并设置到实体中。 最后,需要验证这些步骤是否正确,比如创建表、配置实体类、测试插入操作,确保没有错误。可能遇到的问题包括主键重复、类型不匹配等,需要提醒用户注意主键唯一性和生成策略的可靠性。</think>### MyBatis-Plus 中配置 varchar 类型主键的实现方法 在 MyBatis-Plus使用 varchar 类型作为主键,需通过 **实体类注解配置** 和 **数据库表结构调整** 共同实现。以下是具体步骤: --- #### 1. **实体类配置** 在实体类的主键字段上使用 `@TableId` 注解,并指定 `type` 属性为 `IdType.ASSIGN_ID` 或 `IdType.INPUT`,以支持字符串类型主键: ```java @Data @TableName("your_table") public class YourEntity { @TableId(value = "id", type = IdType.ASSIGN_ID) // 或 IdType.INPUT private String id; // 主键类型为 String // 其他字段... } ``` - **`IdType.ASSIGN_ID`**:MyBatis-Plus 会自动生成字符串类型主键(需配合分布式 ID 生成器,如雪花算法变体)。 - **`IdType.INPUT`**:需手动设置主键值(例如通过 UUID 或业务规则生成)。 --- #### 2. **数据库表结构调整** 确保数据库表中主键字段为 `varchar` 类型,并设置合适的长度: ```sql CREATE TABLE your_table ( id VARCHAR(32) PRIMARY KEY, -- 根据需求调整长度 deleted INT DEFAULT 0, -- 逻辑删除字段(引用[3]) -- 其他字段... ); ``` --- #### 3. **全局主键策略配置(可选)** 在 `application.yml` 中配置全局主键生成策略(若需要统一管理): ```yaml mybatis-plus: global-config: db-config: id-type: none # 关闭默认的雪花算法,依赖手动赋值或自定义生成器 logic-delete-field: deleted # 逻辑删除字段(引用[3]) logic-delete-value: 1 logic-not-delete-value: 0 ``` --- #### 4. **主键生成示例** - **手动赋值**(适用于 `IdType.INPUT`): ```java YourEntity entity = new YourEntity(); entity.setId(UUID.randomUUID().toString().replace("-", "")); // 生成32位UUID yourMapper.insert(entity); ``` - **自动生成**(需自定义生成器或工具类): 可结合 `IdentifierGenerator` 接口实现自定义主键生成逻辑[^2]。 --- #### 5. **注意事项** - **唯一性**:确保生成的字符串主键全局唯一,避免冲突。 - **性能**:varchar 主键在索引查询效率上可能略低于数值类型,需根据业务场景权衡。 - **兼容性**:MyBatis-Plus 原生支持标准 SQL 的数据库(如 MySQL、PostgreSQL)[^1]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值