MyBatis-Plus之常用注解

一、@TableName

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

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

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

将表user更名为t_user ,测试查询功能

测试类

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

import com.qcby.mybatisPlus.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ZhujieTest {

    @Autowired
    private UserMapper userMapper;

    /*
    * 根据id查询
    * */
    @Test
    public void testGetById(){
        System.out.println(userMapper.selectById(1));//SELECT id,name,age,email FROM t_user WHERE id=?
    }
}

程序会抛出异常: Table 'springboot_mybatisplus.user' doesn't exist,因为现在的表名为t_user ,而默认操作 的表名和实体类型的类名一致,即user表

1.通过@TableName注解解决问题

在实体类类型上添加@TableName("t_user"),标识实体类对应的表,即可成功执行SQL语句

再运行就可以查到了

2.通过全局配置解决问题

有时在开发过程中会遇到一种问题:实体类对应的表都有固定的前缀,比如 t_ ,此时可以使用Mybatis_plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那就不需要在每个实体类上通过@TableName标识实体类对应的表了

yaml 复制代码
# 配置MyBatis日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 配置mybatis_plus操作表的默认前缀
      table-prefix: t_

再运行:

二、@TableId

经过之前的测试,发现 MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认 基于雪花算法的策略生成id

问题

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

雪花算法只能识别id,别的识别不到(前提是表里没有设置着自动递增)

测试

将实体类中的属性id改为uid,将表中的字段id也改为uid,测试添加功能


测试类

java 复制代码
/*
 * 插入一条记录
 * */
@Test
public void insert(){
    User user=new User(null, "张三", 20, "[email protected]");
    int result=userMapper.insert(user);
    System.out.println("受影响行数:"+result);
}

能插进去是因为表里设置着自动递增,因为雪花算法识别不到uid,又设置着自动递增,他走的是自动递增,所以才能插进去;

现在把自动递增去掉:

再运行这个插入数据的方法会抛出异常,Field 'uid' doesn't have a default value ,说明MyBatis-Plus没有将uid作为主键 赋值

解决

那么要想走雪花算法,不设自动递增(表中和配置文件,实体类里都没有设置),加个@TableId注解就可以了:

再运行就不报错了

@TableId的value属性

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


此时需要通过@TableId注解的value属性,指定表中的主键字段, @TableId("uid")或@TableId(value="uid")

@TableId的type属性

type属性用来定义主键策略

常用的主键策略

描述
IdType.ASSIGN_ID (默 认) 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO 使用数据库的自增策略,注意,该类型请确保数据库设置了id自增, 否则无效

配置全局主键策略

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

三、@TableField

经过之前的测试,我们可以发现, MyBatis-Plus在执行SQL语句时,要保证实体类中的属性名和 表中的字段名一致

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

第一种情况

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

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

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

相当于在MyBatis中配置

第二种情况

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

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

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

四、@TableLogic!!!

逻辑删除

物理删除

真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据

逻辑删除

假删除,将对应数据中代表是否被删除字段的状态修改为"被删除状态",之后在数据库中仍旧能看到此条数据记录

使用场景

可以进行数据恢复

实现逻辑删除

数据库表中添加一个字段is_deleted

实体类中加一个逻辑删除的属性,并加上@TableLogic注解

测试类写一个删除的方法

java 复制代码
/*
* 根据id删除
* */
@Test
public void delete2(){
    User user=new User();
    user.setId(1354776578);
    int result=userMapper.deleteById(user);
    System.out.println("受影响行数:"+result);
}

查看控制台可以看出真正执行的是修改: UPDATE t_user SET is_deleted=1 WHERE uid=? AND is_deleted=0

查看数据库这条数据也是有的

写一个查询方法

java 复制代码
/*
* 查询所有
* */
@Test
public void testSelectList(){
    userMapper.selectList(null).forEach(System.out::println);
}

可以看出被逻辑删除的数据默认不会被查询---SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0

相关推荐
RainbowSea4 分钟前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea11 分钟前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
李少兄2 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝2 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖2 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601012 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人2 小时前
java9新特性详解与实践
java·后端·面试
cg50172 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
程序猿熊跃晖3 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis