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

相关文章

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

SpringBoot集成Netty,Handler中@Autowired注解为空

最近建了个技术交流群,然后好多小伙伴都问关于Netty的问题,尤其今天的问题最特殊,功能大概是要在Netty接收消息时把数据写入数据库,那个小伙伴用的是 Spring Boot + MyBatis + Netty,所以就碰到了Handler中@Autowired注解为空的问题 参考了一些大神的博文,Spring Boot非controller使用@Autowired注解注入为null的问题,得到

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()