Mybatis Plus 常用注解(超详细)

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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

前言

大家好,我是小哈。

本文主要带大家来看下 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;

}

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

结语

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