欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

MyBatis常见Bug之 —— 数据库表或列不存在,@TableFiel

来源: javaer 分享于  点击 8481 次 点评:161

MyBatis常见Bug之 —— 数据库表或列不存在,@TableFiel


数据库表或列不存在

1. 表不存在

在使用 MyBatis-Plus 时,虽然 MyBatis-Plus 内置了很多对单表操作的 CRUD,但是在使用时,可能会出现 “表不存在” 的情况,如:

这是因为在 MyBatis-Plus 运行时,会默认操作与被注入的泛型相同名字的表,即

@Mapper
public interface DeptMapper extends BaseMapper<Dept> { ... }

可以认为会默认操作 dept(MySQL 不区分大小写)表,这时如果表名与其不匹配,就会报出上述 “表不存在” 的问题,可以在实体类上使用 @TableName 注解,来指定操作的表:

@TableName("tb_dept") // 假设数据库中对应的表名为 tb_dept
public class Dept { ... }

2. 列不存在

在开发过程中,实体类中的属性往往会比其所对应的数据库表的列多出几条数据,用来实现更多功能的实现,如:

public class Emp {
  private Integer id; // ID,主键
  private String username; // 用户名
  private String password; // 密码

  // 封装部门名称
  private String deptName; //部门名称
  // 封装工作经历列表
  private List<EmpExpr> exprList;
}

在 emp 表中并没有 deptName、exprList 对应的数据,但是在这种情况下,如果直接使用 MyBatis-Plus 内置方法查询,会出现 “列不存在” 的问题,即:

这种情况可以使用 @TableField(exist = false) 注解来解决。


@TableField 注解说明:通常用于对普通字段注解

一般情况下我们并不需要给字段添加 @TableField 注解,一些特殊情况除外:

  1. 成员变量名与数据库字段名不一致
  2. 成员变量是以 isXXX 命名,按照 JavaBean 的规范,Mybatis-Plus 识别字段时会把 is 去除,这就导致与数据库不符。
  3. 成员变量名与数据库一致,但是与数据库的关键字冲突。使用 @TableField 注解给字段名添加转义字符
  4. 成员变量不是数据库中的字段,则需要使用 exist 表明为 false

代码实例:

@TableName("tb_emp")
public class Emp {
  @TableId(value = "id", type = IdType.AUTO)
  private Long id;

  @TableField("username")
  private String name;

  @TableField("is_married")
  private Boolean isMarried;

  @TableField("`order`")
  private Integer order;

  @TableField(exist = false)
  private String address;
}

3. 扩展

@TableId:主键注解,标识实体类中的主键字段

注解支持两个属性:

属性 类型 必须指定 默认值 描述
value String "" 字段描述
type Enum IdType.NONE 指定组件类型

其中 IdType支持的类型有:

描述
AUTO 数据库 ID 自增
NONE 无状态,未设置主键类型(注解里等于跟随全局)
INPUT insert 前自行 set 主键值
ASSIGN_ID 分配 ID(雪花算法)
ASSIGN_UUID 分配 UUID
相关栏目:

用户点评