mybatis-plus - 怎么知道我们那个字段是主键的?

先说结论

  1. 如果标注了 @TableId 则当前字段为主键
  2. 如果没有标注则寻找 id 字段为主键
  3. 两者都不满足,则打印警告 logger.warn(String.format("Warn: Could not find @TableId in Class: %s.", clazz.getName()));
    • 如果没有使用 Mybatis-Plus 'xxById' 方法,则仅仅只有警告
    • 但如果使用了 Mybatis-Plus 'xxById' 方法,则直接就会报错(因为根本不知道那个字段是主键,你让它怎么办😂)

源码分析

相关逻辑在 com.baomidou.mybatisplus.core.toolkit.TableInfoHelper#initTableFields,这里把重要代码列出来成伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void initTableFields(Class<?> clazz, GlobalConfig globalConfig, TableInfo tableInfo) {
// 1. 获取所有字段
List<Field> list = getAllFields(clazz);

// 2. 判断是否有包含 @TableId 注解的字段
boolean existTableId = isExistTableId(list);

// 3. 如果有走if逻辑,如果没有走else逻辑
if (existTableId) { // 该逻辑找 @TableId 标注字段作为主键
isReadPK = initTableIdWithAnnotation(dbConfig, tableInfo, field, clazz);
} else { // 该逻辑使用默认表主键名称 DEFAULT_ID_NAME,即 `id`
isReadPK = initTableIdWithoutAnnotation(dbConfig, tableInfo, field, clazz);
}
}