@Tableid 注意点

MP使用过程中

根据主键集合进行批量删除

// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

控制台打印的日志
在这里插入图片描述

若实体类,主键名称不是id,一定在主键字段上加上 @TableId主键

<think>我们正在使用Spring Boot和MyBatis Plus框架。在MyBatis Plus中,@TableId注解用于标识实体类的主键字段。 通常,我们需要指定主键的类型(如自增、UUID等)和主键字段名(如果数据库字段名与实体类属性名不一致时)。 常见的主键策略(IdType)包括: - IdType.AUTO: 数据库自增ID(需要数据库支持自增) - IdType.NONE: 无策略,需要手动设置 - IdType.INPUT: 用户输入ID - IdType.ASSIGN_ID: 分配ID(默认使用雪花算法生成Long类型ID) - IdType.ASSIGN_UUID: 分配UUID(不含中划线的UUID字符串) 示例:假设我们有一个User实体类,其主键为id,并且我们希望使用数据库的自增主键(比如MySQL的AUTO_INCREMENT),那么我们可以这样写: 注意:如果数据库表的主键字段名与实体类属性名一致,可以省略value属性。 代码示例: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; public class User { @TableId(type = IdType.AUTO) private Long id; // 其他属性和方法... } ``` 如果数据库表的主键字段名与实体类属性名不一致,例如数据库字段名为`user_id`,那么我们可以这样写: ```java @TableId(value = "user_id", type = IdType.AUTO) private Long id; ``` 解释: - `value`属性用于指定数据库表中的主键字段名。 - `type`属性用于指定主键策略。 另外,MyBatis Plus还支持全局主键策略配置。在application.yml中配置: ```yaml mybatis-plus: global-config: db-config: id-type: auto # 全局主键策略,auto表示自增(注意:全局配置后,实体类中不需要再使用@TableId指定type,除非有特殊需求) ``` 但是,如果全局配置与实体类上的@TableId注解同时存在,以实体类上的注解为准。 关于@TableId的详细使用,请参考MyBatis Plus官方文档。 相关问题: 1. 在MyBatis Plus中,如何设置多个字段作为联合主键? 2. 如果数据库主键不是自增的,而是使用UUID,该如何配置? 3. 如何通过全局配置设置主键策略? 4. 在MyBatis Plus中,主键策略IdType.ASSIGN_ID和IdType.ASSIGN_UUID有什么区别? 注意:MyBatis Plus不支持多个字段的联合主键(复合主键)的注解方式,通常需要自定义SQL处理。但可以通过@TableId注解指定一个主键,其他作为普通字段。如果确实需要联合主键,可能需要使用MyBatis的XML映射文件方式。 因此,对于问题1,MyBatis Plus本身不直接支持通过注解配置联合主键。如果需要使用联合主键,建议使用MyBatis的XML方式,并自行处理相关逻辑。 下面针对其他问题给出解答: 问题2:使用UUID作为主键 在实体类的主键字段上使用: ```java @TableId(type = IdType.ASSIGN_UUID) private String id; // 注意类型为String ``` 问题3:全局配置主键策略(在application.yml中) ```yaml mybatis-plus: global-config: db-config: id-type: assign_id # 或者 assign_uuid, auto等 ``` 问题4:IdType.ASSIGN_ID和IdType.ASSIGN_UUID的区别 - ASSIGN_ID:分配长整型ID(默认使用雪花算法,生成的是Long类型,长度19位) - ASSIGN_UUID:分配UUID(不含中划线的32位字符串,类型为String) 注意:ASSIGN_ID在插入时自动生成一个Long类型的ID,而ASSIGN_UUID生成一个String类型的UUID。 由于用户的问题是关于@TableId的,我们主要讲解了它的用法和配置。 下面按照要求,在最后提出相关问题。 注意:按照格式,最后是“§§相关问题§§:”并列出4个问题。</think>### 关于 `@TableId` 注解的详细解释 `@TableId` 是 MyBatis-Plus(一个 MyBatis 增强框架)中的核心注解,用于标识实体类的主键字段。它通过映射实体类属性与数据库表主键字段,简化了主键操作的配置。 #### 核心作用: 1. **标识主键字段**:将 Java 实体类的属性与数据库表的主键列关联。 2. **定义主键策略**:指定主键生成策略(如自增、雪花算法、UUID 等)。 3. **解决命名差异**:当实体属性名与数据库列名不一致时,通过 `value` 属性映射。 --- ### 代码示例与解释 #### 示例 1:基本用法(自增主键) ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; public class User { @TableId(type = IdType.AUTO) // 数据库自增主键 private Long id; private String name; // 省略 getter/setter } ``` - **`type = IdType.AUTO`**:表示使用数据库自增主键(需确保数据库表主键已设置 `AUTO_INCREMENT`)。 - **默认行为**:若属性名 `id` 与数据库列名一致,可省略 `value` 属性。 --- #### 示例 2:自定义列名与雪花算法主键 ```java public class Order { @TableId( value = "order_id", // 映射数据库列名 order_id type = IdType.ASSIGN_ID // MyBatis-Plus 雪花算法生成 ID ) private Long orderId; // 实体属性名为 orderId private Double amount; } ``` - **`value = "order_id"`**:将实体属性 `orderId` 映射到数据库列 `order_id`。 - **`type = IdType.ASSIGN_ID`**:使用雪花算法生成分布式 ID(Long 类型),避免主键冲突。 --- #### 示例 3:全局主键策略配置(Spring Boot) 在 `application.yml` 中全局配置主键策略: ```yaml mybatis-plus: global-config: db-config: id-type: assign_id # 全局使用雪花算法 table-prefix: tbl_ # 表前缀 ``` 此时实体类只需简单注解: ```java public class Product { @TableId // 默认使用全局策略(雪花算法) private Long productId; } ``` --- ### 主键策略详解(`IdType` 枚举) | 策略类型 | 说明 | |-------------------|----------------------------------------------------------------------| | `IdType.AUTO` | 数据库自增(需数据库支持,如 MySQL `AUTO_INCREMENT`) | | `IdType.ASSIGN_ID`| 雪花算法生成 Long 类型 ID(默认策略,适用于分布式系统) | | `IdType.ASSIGN_UUID`| 生成不含短横线的 UUID 字符串(32 位) | | `IdType.INPUT` | 手动输入主键(需在代码中显式赋值) | | `IdType.NONE` | 无策略(等同于未配置,依赖数据库隐式行为) | --- ### 常见问题解决方案 1. **主键类型不匹配** - **现象**:实体类主键为 `Long` 类型,但数据库是 `VARCHAR`。 - **解决**:使用 `IdType.ASSIGN_UUID` 或确保数据库与实体类型一致。 2. **自增主键失效** - **检查**: - 数据库主键是否已设置 `AUTO_INCREMENT`。 - 是否误用其他策略(如 `IdType.ASSIGN_ID`)。 3. **列名映射错误** - **确认**:`@TableId(value = "db_column")` 的 `value` 是否与数据库列名完全一致。 --- ### 总结 - **核心功能**:`@TableId` 简化了 ORM 中主键的配置,通过注解代替 XML 映射。 - **最佳实践**: - 分布式系统优先用 `IdType.ASSIGN_ID`(雪花算法)。 - 单机应用可用 `IdType.AUTO`(自增)。 - 避免手动维护主键(减少错误)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值