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更新语法:

相关推荐
霖霖总总20 小时前
[小技巧23]全面理解 MySQL 的 WAL 机制:原理、影响与可观测性
数据库·mysql
列御寇20 小时前
MongoDB分片集概述
数据库·mongodb
又是忙碌的一天20 小时前
SpringMVC响应
java·服务器·数据库
W001hhh20 小时前
260110
java·数据库
冰暮流星21 小时前
sql语句之select语句的基本使用
数据库·sql·mysql
沙白猿21 小时前
Redis报错:A bean with that name has already been defined in class path resource
spring boot·redis·mybatis
vyuvyucd21 小时前
插件式开发:C++与C#实战指南
java·前端·数据库
少云清21 小时前
【性能测试】3_性能测试基础 _指标
运维·服务器·数据库·性能测试·性能测试指标
+VX:Fegn089521 小时前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
Vicky-Min1 天前
NetSuite Credit Memo导入的基础CSV模板
oracle·erp