Mybatis Plus 常用注解(超详细)

更新时间 2023-01-13 14:24:23

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

前言

大家好,我是小哈。

本文主要带大家来看下 Mybatis Plus 框架中,使用频率非常高的几个注解及其属性值,因为编写此本教程目的是为了大家快速入门并使用 Mybatis Plus,关于注解更高级的用法请参考官网。

实体类常用注解

@TableName

作用:表名注解,标识实体类对应的表。

使用示例:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2022-12-13 14:13
 * @version: v1.0.0
 * @description: TODO
 **/
@TableName("t_user")
public class User {
    /**
     * 主键 ID
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer gender;
}

有没有什么法子可以不用添加 @TableName 注解,让框架自动解析映射?

主要有以下两种方法:

  1. 当表名和实体类的命名一致时,如表名 user , 实体类为 User 时,可不用添加 @TableName 注解,Mybatis Plus 会自动完成映射,不过实际项目中,表名规范规定都会带有前缀。

  2. 还可以通过全局配置声明表明前缀,比如你的项目里,表名规范全部以 t_ 开头,则可以在 application.yml 配置文件中添加如下配置,这样就可以不用添加 @TableName 注解,MP 会自动拼接:

   mybatis-plus:
     global-config:
       db-config:
         table-prefix: t_

@TableId

作用:主键注解。

使用示例:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2022-12-13 14:13
 * @version: v1.0.0
 * @description: TODO
 **/
@TableName("t_user")
public class User {
    /**
     * 主键 ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer gender;
}

@TableId 注解有两个属性值:

属性类型必须指定默认值描述
valueString""主键字段名
typeEnumIdType.NONE (默认雪花算法生成 ID)指定主键类型

@IdType

作用:指定主键 ID 类型

描述
AUTO数据库 ID 自增
NONE未设置主键类型(默认)
INPUT插入数据前,需自行设置主键的值
ASSIGN_ID分配 ID(主键类型为 Number(LongInteger)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID (默认 default 方法)
ID_WORKER分布式全局唯一 ID 长整型类型 (推荐使用 ASSIGN_ID)
UUID32 位 UUID 字符串 (推荐使用 ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一 ID 字符串类型 (推荐使用 ASSIGN_ID)

@TableField

作用:指定数据库字段注解(非主键)

假设表的字段名与实体类的字段名不一致,可通过它来指定,比如表字段名为 user_name 映射到实体类的字段 name 上,代码如下:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2022-12-13 14:13
 * @version: v1.0.0
 * @description: TODO
 **/
@TableName("t_user")
public class User {
    /**
     * 主键 ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    @TableField("user_name")
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer gender;
}

@TableLogic

作用:逻辑删除注解。

@TableName("t_user")
public class User {
    /**
     * 主键 ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer gender;

    /**
     * 逻辑删除
     */
    @TableLogic
    private Integer isDeleted;
}

具体如何使用,请参阅后续《逻辑删除》 小节,有详细教程。

@Version

作用:乐观锁注解。

@TableName("t_seckill_goods")
public class SeckillGoods {
    /**
     * 主键 ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 商品名称
     */
    private String goodsName;
    /**
     * 库存
     */
    private Integer count;
    /**
     * 乐观锁版本号
     */
    @Version
    private Integer version;

}

具体如何使用,请参阅后续《乐观锁》 小节,有详细教程。

结语

本文带着大家快速了解了项目开发中常用的一些实体类注解,希望对小伙伴们有所帮助。