# 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 {
    // ...略
}
1
2
3
4

如果你觉得每个实体类都添加 @TableName 注解有点麻烦,可以在全局配置指定数据库表名的前缀,在 application.yaml 中配置

# mybaits-plus配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_		# 指定表名前缀
      table-underline: true  # 使用下划线风格,默认就为true
1
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;
    
    // ...略
}
1
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;
  
    // ...其他属性
}
1
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;
}
1
2
3
4
5
6
7
8

通过添加 @TableField(exist=false) 注解,MyBatis-Plus 在插入、更新或查询的时候,会忽略该字段。


比较一下 @TableField(select=false)@TableField(exist = false)

  • @TableField(select=false) :用于字段在数据库中存,希望查询时默认不包含在内,适用于敏感字段或不需要每次都返回的字段。
  • @TableField(exist = false) :用于指定该字段在数据库表中不存在,适用于实体类属性与数据库表字段不完全对应的情况,在插入、更新或查询的时候,忽略这些属性。