IT评测·应用市场-qidao123.com

标题: MyBatis常见Bug之 —— 数据库表或列不存在 [打印本页]

作者: 小秦哥    时间: 2025-2-18 22:20
标题: MyBatis常见Bug之 —— 数据库表或列不存在
数据库表或列不存在

1. 表不存在

在利用 MyBatis-Plus 时,虽然 MyBatis-Plus 内置了许多对单表操纵的 CRUD,但是在利用时,大概会出现 “表不存在” 的环境,如:

这是因为在 MyBatis-Plus 运行时,会默认操纵与被注入的泛型相同名字的表,即
  1. @Mapper
  2. public interface DeptMapper extends BaseMapper<Dept> { ... }
复制代码
可以认为会默认操纵 dept(MySQL 不区分大小写)表,这时如果表名与其不匹配,就会报出上述 “表不存在” 的题目,可以在实体类上利用 @TableName 注解,来指定操纵的表:
  1. @TableName("tb_dept") // 假设数据库中对应的表名为 tb_dept
  2. public class Dept { ... }
复制代码
2. 列不存在

在开辟过程中,实体类中的属性往往会比其所对应的数据库表的列多出几条数据,用来实现更多功能的实现,如:
  1. public class Emp {
  2.   private Integer id; // ID,主键
  3.   private String username; // 用户名
  4.   private String password; // 密码
  5.   // 封装部门名称
  6.   private String deptName; //部门名称
  7.   // 封装工作经历列表
  8.   private List<EmpExpr> exprList;
  9. }
复制代码
在 emp 表中并没有 deptName、exprList 对应的数据,但是在这种环境下,如果直接利用 MyBatis-Plus 内置方法查询,会出现 “列不存在” 的题目,即:

这种环境可以利用 @TableField(exist = false) 注解来解决。

@TableField 注解阐明:通常用于对普通字段注解
一般环境下我们并不必要给字段添加 @TableField 注解,一些特殊环境除外:
代码实例:
  1. @TableName("tb_emp")
  2. public class Emp {
  3.   @TableId(value = "id", type = IdType.AUTO)
  4.   private Long id;
  5.   @TableField("username")
  6.   private String name;
  7.   @TableField("is_married")
  8.   private Boolean isMarried;
  9.   @TableField("`order`")
  10.   private Integer order;
  11.   @TableField(exist = false)
  12.   private String address;
  13. }
复制代码
3. 扩展

@TableId:主键注解,标识实体类中的主键字段
注解支持两个属性:
属性类型必须指定默认值描述valueString否""字段描述typeEnum否IdType.NONE指定组件类型其中 IdType支持的类型有:
值描述AUTO数据库 ID 自增NONE无状态,未设置主键类型(注解里即是跟随全局)INPUTinsert 前自行 set 主键值ASSIGN_ID分配 ID(雪花算法)ASSIGN_UUID分配 UUID
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4