# MyBatis-Plus教程 - 6 映射规则
学过 MyBatis 知道,数据库表名与 Java 实体类名、表字段与 Java 属性之间都需要存在映射关系。
下面就看看 MyBatis-Plus 中如何配置这些映射。
# 6.1 表映射
在 MyBatis-Plus 中,数据库表名
和 Java 实体类名
默认是下划线和驼峰规则的映射关系。
例如:user_order(表) --> UserOrder(类)。
但是我们一般在创建数据库表的时候,都会添加表名前缀,避免关键字冲突等问题,例如: tb_user。
这样表名和实体类名就不对应了,此时可以在 Java 实体类上使用 @TableName
注解指定表名。
举个栗子:
@TableName("tb_user")
public class User {
// ...略
}
2
3
4
如果你觉得每个实体类都添加 @TableName
注解有点麻烦,可以在全局配置指定数据库表名的前缀,在 application.yaml
中配置
# mybaits-plus配置
mybatis-plus:
global-config:
db-config:
table-prefix: tb_ # 指定表名前缀
table-underline: true # 使用下划线风格,默认就为true
2
3
4
5
6
这样就可以指定数据库表名的前缀,实体类上不用添加 @TableName
注解了。如果有表的命名有例外,可以针对单独的表使用 @TableName
注解。
# 6.2 字段映射
在 MyBatis-Plus 中,表字段
和 Java 实体类属性
(getter和setter)默认就是 下划线
和 首字母小写的驼峰规则
的映射关系,不需要配置开启。
在 MyBatis 中,如果表字段
和 Java 实体类属性
不对应,那么在查询的时候需要使用 AS
设置别名,或者使用 ResultMap
来进行映射。
在 MyBatis-Plus 中可以使用 @TableField
注解,指定数据库表字段的名称。
举个栗子:
表字段为 name
,Java 实体类属性为 username
,映射如下:
@Data
@TableName("tb_user")
public class User {
private Long id;
@TableField("name")
private String username;
// ...略
}
2
3
4
5
6
7
8
9
10
11
使用 @TableField
注解指定对应的表字段名称。
# 6.3 查询忽略字段
MyBatis-Plus 默认在查询的时候,会查询出 Java 实体类中属性对应数据库的所有字段信息,有时候不想查询数据库中的某些字段,例如密码等敏感信息,那么可以在查询的时候忽略这些字段。
可以在属性上添加 @TableField(select = false)
注解,将 select
设置为 false
,那么在执行查询时,该字段不会被包含在查询结果中,即使该字段在数据库中存在。
举个例子:
@Data
@TableName("tb_user")
public class User {
// ...其他属性
@TableField(select = false)
private String password;
// ...其他属性
}
2
3
4
5
6
7
8
9
10
那么在查询生成的 SQL 中,不包含 password
字段。在后面查询进阶章节,会讲解如何查询指定字段。
# 6.4 视图属性
在 Java 实体类中存在的属性,那么 MyBatis-Plus 在进行插入、更新或查询的时候,生成的 SQL 就会包含这些属性。
如果有的属性是通过其他属性计算而来的,只是用于在前端展示,并不在数据库中存在,那么这个时候就需要忽略这些字段。
举个栗子:
@Data
@TableName("tb_user")
public class User {
// ...其他属性
@TableField(exist=false)
private String viewName;
}
2
3
4
5
6
7
8
通过添加 @TableField(exist=false)
注解,MyBatis-Plus 在插入、更新或查询的时候,会忽略该字段。
比较一下 @TableField(select=false)
和 @TableField(exist = false)
:
@TableField(select=false)
:用于字段在数据库中存,希望查询时默认不包含在内,适用于敏感字段或不需要每次都返回的字段。@TableField(exist = false)
:用于指定该字段在数据库表中不存在,适用于实体类属性与数据库表字段不完全对应的情况,在插入、更新或查询的时候,忽略这些属性。