MyBatisPlus中的常用注解

目录

一、@TableName注解

在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表 ,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表

由此得出结论, MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致

总结上面的意思是:如果泛型是User,它就会自动去查找数据库中数据库表名为user的表中的数据。

1、问题

实体类类型的类名和要操作的表的表名不一致 ,会出现什么问题?

在进行测试的时候,会报错,出现找不到对应表的错误。

2、通过@TableName解决问题

可以通过使用@TableName来进行解决问题,使用@TableName来指定查找数据库中的某张表,这样就不会出现找不到表的错误了。

数据库中的表名如下:

实体类中的内容如下:

java 复制代码
package com.qcby.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")
public class User {
    @TableId("id")
    private Long uid;
    private String name;
    private Integer age;
    private String email;
}

实体类的名称是User,指定表名为t_user,测试会通过,不加入该注解测试失败。

3、通过全局配置解决问题

在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t_或tbl_

此时,可以使用MyBatis-Plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就 不需要在每个实体类上通过@TableName标识实体类对应的表。

需要通过下面的代码实现:

java 复制代码
mybatis-plus:
  global-config:
    db-config:
      table-prefix: t

这样就可以不用使用@TableName对没一张表指定数据库中的表名。

总结:@TableName的优先级强过于使用全局配置的优先级。

二、@TableId注解

MyBatis-Plus在实现CRUD时,会默认将id作为主键列 ,并在插入数据时,默认 基于雪花算法 的策略生成id。
上面的一句话的重点是:默认使用雪花算法生成id,这个抢过于表结构设置了id自增的约束。

1、问题

若实体类和表中表示主键的不是id,而是其他字段,例如uid , MyBatis-Plus会自动识别uid为主键列吗?

我们实体类中的属性id改为uid,将表中的字段id也改为uid,测试添加功能程序抛出异常, Field 'uid'doesn't have a default value,说明MyBatis-Plus没有将uid作为主键赋值

2、通过@TableId解决问题

在实体类中uid属性上通过@TableId将其标识为主键,即可成功执行SQL语句。

上面的使用条件是:实体类中的字段名与数据库中的字段名一一对应。
如果实体类中的字段名与数据库中的字段名不对应的话,则需要使用到@TableId中的value属性。

若实体类中主键对应的属性为id,而表中表示主键的字段为uid,此时若只在属性id上添加注解 @TableId,则抛出异常Unknown column'id'in'field list',即MyBatis-Plus仍然会将id作为表的 主键操作,而表中表示主键的是字段uid此时需要通过@TableId注解的value属性,指定表中的主键字段, @TableId("uid")或

@TableId(value="uid")

3、@TableId的type属性

常用的键值策略:

默认为雪花算法,可以在@TableId中的type进行设定,也可以进行全局配置。
配置全局主键策略:

xml 复制代码
mybatis-plus:
configuration:
# 配置MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: t_
# 配置MyBatis-Plus的主键策略
id-type: auto

三、@TableField注解

MyBatis-Plus在执行SQL语句时,要保证实体类中的属性名和 表中的字段名一致。

1、问题

如果实体类中的属性名和字段名不一致的情况,会出现什么问题呢?

上面的问题又分为了两种情况,第一种符合驼峰命名规则的,第二种不符合驼峰命名规则的

1、情况1

若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格

例如实体类属性userName,表中字段user_name

此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格

相当于在MyBatis中配置
总结:MyBatisPlus默认支持驼峰命名,MyBatis不支持驼峰命名,需要自己全局配置。

2、情况2

若实体类中的属性和表中的字段不满足情况1

例如实体类属性name ,表中字段username

此时需要在实体类属性上使用@TableField("username")设置属性所对应的字段名

四、@TableLogic注解

1、逻辑删除

物理删除 :真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
逻辑删除 :假删除,将对应数据中代表是否被删除字段的状态修改为"被删除状态",之后在数据库

中仍旧能看到此条数据记录
使用场景:可以进行数据恢复

2、实现逻辑删除

在数据库中设置状态编辑字段,设置为不是null,且默认值为0

在实体类中状态编辑字段添加@TableLogic:

xml 复制代码
package com.qcby.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
//@TableName("t_user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Long uid;
    private String name;
    private Integer age;
    private String email;
    @TableLogic
    @TableField("isDelete")
    private Integer isDelete;
}

执行删除语句,得到以下的结果:

sql 复制代码
UPDATE user SET isDelete=1 WHERE id=? AND isDelete=0

所有的删除语法都变成了update更新语法:

相关推荐
盼哥PyAI实验室42 分钟前
MySQL 数据库入门第一课:安装、账户、库、表与数据操作详解
数据库·mysql
h***59332 小时前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql
郑重其事,鹏程万里3 小时前
键值存储数据库(chronicle-map)
数据库·oracle
Doro再努力3 小时前
【MySQL数据库09】外键约束与多表查询基础
数据库·mysql
gkhost3 小时前
Linux基础——Oracle部署
oracle·表空间··instances
ss2733 小时前
019:深入解析可重入互斥锁:原理、实现与线程安全实践
java·数据库·redis
高级程序源3 小时前
springboot社区医疗中心预约挂号平台app-计算机毕业设计源码16750
java·vue.js·spring boot·mysql·spring·maven·mybatis
O***Z6163 小时前
三分钟内快速完成MySQL到达梦数据库的迁移
数据库·mysql
友友马4 小时前
『QT』窗口 (一)
开发语言·数据库·qt