数据库表或列不存在
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 注解,一些特殊情况除外:
- 成员变量名与数据库字段名不一致
- 成员变量是以
isXXX命名,按照JavaBean的规范,Mybatis-Plus识别字段时会把is去除,这就导致与数据库不符。 - 成员变量名与数据库一致,但是与数据库的关键字冲突。使用
@TableField注解给字段名添加转义字符 - 成员变量不是数据库中的字段,则需要使用
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 |
来源链接:https://www.cnblogs.com/Abner-rudolf/p/18723016
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
















暂无评论内容