MP 映射匹配兼容性
2025/9/17大约 4 分钟
MyBatis-Plus 映射匹配兼容性
映射匹配兼容性
前面我们已经能从表中查询出数据,并将数据封装到模型类中,这整个过程涉及到一张表和一个模型类,那么问题就来了:
问题1:表字段与编码属性设计不同步
- 当表的列名和模型类的属性名发生不一致,就会导致数据封装不到模型对象
- MP给我们提供了一个注解
@TableField
,使用该注解可以实现模型类属性名和表的列名之间的映射关系
问题2:编码中添加了数据库中未定义的属性
- 当模型类中多了一个数据库表不存在的字段,就会导致生成的sql语句中在select的时候查询了数据库不存在的字段
- 解决方案用到的还是
@TableField
注解,它有一个属性叫exist
,设置该字段是否在数据库表中存在
问题3:采用默认查询开放了更多的字段查看权限
- 查询表中所有的列的数据,就可能把一些敏感数据查询到返回给前端,这个时候我们就需要限制哪些字段默认不要进行查询
- 解决方案是
@TableField
注解的一个属性叫select
,该属性设置默认是否需要查询该字段的值
知识点1:@TableField
名称 | @TableField |
---|---|
类型 | 属性注解 |
位置 | 模型类属性定义上方 |
作用 | 设置当前属性对应的数据库表中的字段关系 |
相关属性 | value(默认):设置数据库表字段名称 exist:设置属性在数据库表字段中是否存在,默认为true,此属性不能与value合并使用 select:设置属性是否参与查询,此属性与select()映射配置不冲突 |
表名与实体类名不一致
当数据库表名与实体类名不一致时,需用 @TableName
注解进行映射。
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("tbl_user") // 指定表名
public class User {
private Long id;
private String name;
// ...
}
知识点2:@TableName
名称 | @TableName |
---|---|
类型 | 类注解 |
位置 | 模型类定义上方 |
作用 | 设置当前类对应于数据库表关系 |
相关属性 | value(默认):设置数据库表名称 |
字段名与属性名不一致
当表字段名与实体属性名不一致时,需用 @TableField
注解进行映射。
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
@TableField("pwd") // 数据库字段为pwd,实体属性为password
private String password;
// ...
}
实体类多余/缺失字段处理
1. 实体类多了数据库没有的字段
用 @TableField(exist = false)
标记,避免SQL报错。
@Data
public class User {
private Long id;
private String name;
@TableField(exist = false) // 该字段不参与数据库映射
private Integer online;
}
2. 实体类缺少数据库字段
- 不影响查询,只是不会映射到实体属性。
- 建议保持实体与表结构同步,便于维护。
隐藏/排除字段
有些字段(如密码)不希望默认查询,可用 @TableField(select = false)
。
@Data
public class User {
private Long id;
private String name;
@TableField(value = "pwd", select = false) // 查询时默认不查该字段
private String password;
}
如需查询被隐藏字段,可在Wrapper中手动指定:
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getId, User::getName, User::getPassword);
全局表前缀配置
若所有表都有统一前缀(如 tbl_
),可全局配置,无需每个实体都加 @TableName
。
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_ # 全局表前缀
常见错误与解决方案
场景 | 错误现象 | 解决方案 |
---|---|---|
实体属性多于表字段 | Unknown column 'xxx' in 'field list' | 用@TableField(exist=false) |
表名/字段名不一致 | 查询不到/插入失败 | 用@TableName/@TableField映射 |
敏感字段被查出 | 数据泄露风险 | 用@TableField(select=false) |
实战小结与最佳实践
- 实体类属性与表字段保持同步,减少维护成本
- 表名/字段名不一致时,优先用注解映射
- 多余属性用 exist=false,敏感字段用 select=false
- 全局表前缀推荐用配置文件统一管理
- 遇到映射相关报错,优先检查注解和配置
下一篇:MP 主键策略与逻辑删除