MyBatis-Plus常用注解详解与实战应用

2024-06-24 09:12

本文主要是介绍MyBatis-Plus常用注解详解与实战应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了大量的常用注解,使得开发者能够更方便地进行数据库操作。

MyBatis-Plus 提供的注解可以帮我们解决一些数据库与实体之间相互映射的问题。

@TableName

@TableName 用来指定表名

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

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

若实体类类型的类名和要操作的表的表名不一致,如引入的泛型为 User,需要操作的表名为 t_user,程序会抛出异常,Table 'mybatis_plus.user' doesn't exist

这种问题有两种解决方案:

@TableName 注解

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

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

全局配置

在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如 t_tbl_ 此时,可以使用 MyBatis-Plus 提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过 @TableName 标识实体类对应的表

mybatis-plus:global-config:db-config:# 设置实体类所对应的表的统一前缀table-prefix: t_

@TableId

@Tableld 用来指定表中的主键字段信息

MyBatis-Plus 在实现CRUD时,会默认将实体类名为 id 的属性作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id

若实体类和表中表示主键的不是 id,而是其他字段,例如 uid,程序抛出异常,Field ‘uid’ doesn’t have a default value,MyBatis-Plus 不会将 uid 作为主键赋值

为解决这种问题,可以在实体类中需要设定为主键的属性上通过 @TableId 将其标识为主键,即可成功执行 SQL 语句

@Date
public class User {@TableIdprivate Long uid;private String name;private Integer age;private String email;
}

@TableId 的 value 属性

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

image-20220520103030977

@TableId的type属性

type 属性用来定义主键策略:默认为雪花算法

常用的主键策略:

描述
IdType.ASSIGN_ID(默认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO使用数据库的自增策略,该类型请确保数据库设置了id自增,
IdType.INPUT自行通过 set 方法输入 id,为主键赋值
  • IdType.ASSIGN_ID通过接口 ldentifierGenerator 的方法 nextld 来生成 id 默认实现类为 DefaultldentifierGenerator 雪花算法。Long 型整数,长度为20
@Data  
public class User {  @TableId(value = "uid", type = IdType.AUTO) // 假设数据库表的主键字段为 uid,并且是自增的  private Long uid;  private String name;  private Integer age;  private String email;  // 其他字段...  
}

配置全局主键策略:

#MyBatis-Plus相关配置
mybatis-plus:configuration:#配置日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:#配置mp的主键策略为自增id-type: auto# 设置实体类所对应的表的统一前缀table-prefix: t_

@TbaleField

@TableField 用来指定表中的普通字段信息

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

如果实体类中的属性名和字段名不一致的情况:

  • 若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格:例如实体类属性 userName,表中字段 user_name,此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格

  • 若实体类中的属性和表中的字段不满足情况:例如实体类属性name,表中字段 username。此时需要在实体类属性上使用 @TableField("username") 设置属性所对应的字段名

public class User {@TableId("uid")private Long id;@TableField("username")private String name;private Integer age;private String email;
}

成员变量名以 is 开头,且是布尔值,Mybatis Plus 在底层会基于反射类型的机制获取字段名称,在这种情况下,经过反射处理,会将 is 去掉,剩余的部分驼峰转下划线作为字段名。

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

public class User {@TableId("uid")private Long id;@TableField("username")private String name;@TableField("is_married")private Boolean isMarried;private String email;
}

当成员变量名与数据库关键字冲突时,此时需要在实体类属性上使用 @TableField 添加转义字符并设置属性所对应的字段名

public class User {@TableId("uid")private Long id;@TableField("username")private String name;@TableField("is_married")private Boolean isMarried;@TableField("`order`")private Integer order;
}

成员变量不是数据库字段,即不需要被获取为字段,此时需要在实体类属性上使用 @TableField,并设置 exist 属性为 false,标记其不为数据库字段

public class User {@TableId("uid")private Long id;@TableField("username")private String name;@TableField("is_married")private Boolean isMarried;@TableField("`order`")private Integer order;@TableField(exist=false)private String address;
}

@TableLogic

@TableLogic 用于逻辑删除,可以进行数据恢复

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

  • 逻辑删除:指在数据库中不直接删除数据,而是“假删除”,将对应数据通过设置一个是否被删除字段的标志位,修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

使用 @TableLogic 注解可以声明一个逻辑删除字段,它可以是一个 boolean 类型或者一个标识删除状态的数字。

当执行删除操作时,Mybatisplus 会自动更新这个字段的值来表示数据的删除状态。在查询数据时,Mybatisplus 会自动过滤掉被标记为删除状态的数据。这种方式相比物理删除可以更好地保留数据的完整性并且方便数据的恢复。

@Data
public class User {private Long id;private String username;private Integer age;@TableLogicprivate Integer deleted;
}

总结

MyBatis-Plus通过提供这些常用注解和全局配置,使得我们能够更加方便地进行数据库操作,提高开发效率。在实际开发中,熟练掌握这些注解的用法,将有助于提高代码的质量和可维护性。

这篇关于MyBatis-Plus常用注解详解与实战应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089723

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结