百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Mybatis Plus框架学习指南-第八节内容(常用的注解)

mhr18 2025-07-21 16:02 12 浏览 0 评论

注解

@TableName

基本概念

表名注解,标识实体类对应的表

作用域

实体类上

属性

value

表名

resultMap

xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定

autoResultMap

是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入),默认值是false。当设置为true时,MyBatis-Plus会自动为该实体类生成ResultMap配置

主要用途

1、类型处理器自动应用

当实体字段使用了自定义TypeHandler时,autoResultMap=true确保类型转换正确执行:

2、复杂类型映射

处理非基本类型的字段映射:

3、字段名映射处理

当数据库字段名与实体属性名不一致时

excludeProperty

需要排除的属性名

注意事项

在使用MyBatis Plus框架时,若实体类未添加@TableName注解,默认的表名规则如下:

1、默认表名生成规则

MyBatis Plus会将实体类的类名直接转换为小写形式作为数据库表名不会自动进行驼峰转下划线的转换。

示例:

实体类 User 表名 user

实体类 UserInfo 表名 userinfo(而非 user_info)

2、如何修改默认行为

若需启用驼峰转下划线的表名映射,可通过以下配置实现

在 application.yml 中配置

启用后,实体类 UserInfo 将映射到表 user_info

总结

(1)默认行为:表名 = 实体类名的小写形式(无驼峰转下划线)。

(2)推荐实践:

若数据库表名遵循驼峰转下划线规范,建议全局配置 table-underline: true。

复杂场景(如多前缀、特殊表名)可直接使用 @TableName 注解。

@TableId

基本说明

主键注解

使用位置

实体类主键字段上

属性

value

主键字段名

type

指定主键类型,默认值:IdType.NONE

IdType

@TableField

基本说明

字段注解(非主键)

属性

value

数据库字段名

exist

是否为数据库表字段,默认值为true,表示存在

condition

字段 where 实体查询比较条件,默认 `=` 等值

whereStrategy

字段验证策略之 where: 表示该字段在拼接where条件时的策略。默认值为FieldStrategy.DEFAULT

IGNORED:

直接拼接 column=#{columnProperty}
NOT_NULL:

<if test="columnProperty != null">column=#{columnProperty}</if>
NOT_EMPTY:

<if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>

fill

字段自动填充策略

select

是否进行 select 查询,默认值为true

numericScale

指定小数点后保留的位数,只生效与 mp 自动注入的 method,建议配合TableName#autoResultMap()一起使用

insertStrategy

字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略。

updateStrategy

当更新操作时,该字段拼接set语句时的策略

typeHandler

类型处理器

@TableLogic

基本概念

用于标记一个字段作为逻辑删除字段。@TableLogic 注解可以应用在实体类的字段上,用于指定一个字段作为逻辑删除字段。被标记的字段需要满足以下条件:

1、字段的类型必须为整数类型(如 int、Integer、long、Long 等),也可以为boolean类型、字符类型。

2、逻辑删除字段的默认值代表未删除状态

3、删除状态的值需要设置对应的删除标识值。

作用域

使用在字段上

属性

value

默认逻辑未删除值(该值可无、会自动获取全局配置)

delval

默认逻辑删除值(该值可无、会自动获取全局配置)

示例

我们有一个名为 User 的实体类,并希望实现逻辑删除功能,可以这样使用 @TableLogic 注解。

在上述示例中,我们在 deleted 字段上添加了 @TableLogic 注解,表示该字段将作为逻辑删除字段。默认情况下该字段的值为 0 表示未删除状态,当需要删除一条记录时,可以将 deleted 字段的值设置为对应的删除标识值,例如 1。当使用 MyBatis Plus 提供的删除方法或通过条件构造器进行删除操作时,MyBatis Plus 会自动根据逻辑删除字段的值生成相应的删除条件,从而实现逻辑删除的功能。

总结

@TableLogic 注解是 MyBatis Plus 提供的用于实现逻辑删除的注解,用于指定一个字段作为逻辑删除字段,并配置对应的删除标识值。使用该注解可以方便地实现逻辑删除功能,避免直接从数据库中物理删除记录。使用@TableLogic注解可以实现数据的逻辑删除,有助于维护数据的完整性和可追溯性,同时避免了物理删除操作可能带来的数据丢失风险。开发者无需手动编写逻辑删除的代码,MyBatis-Plus 会自动处理这一过程。

@Version

基本说明

@Version 是 MyBatis-Plus 提供的乐观锁注解,用于实现数据库层面的并发控制,防止数据并发修改时的冲突。

作用域

用在字段上

核心原理

基本用法

1、实体类配置

2、表结构

配置乐观锁插件

实际使用示例

1、插入操作

2、更新操作

并发场景演示

支持的数据类型

注意事项

1、只对 updateById() 和 update() 方法生效

2、version 字段不要手动修改

3、批量更新不支持乐观锁

优点

1、避免数据并发修改冲突

2、性能好,无需加锁

3、实现简单,只需一个注解

缺点

1、更新失败需要业务层处理重试逻辑

2、只适用于低并发场景

3、高并发时失败率较高

总结

通过 @Version 注解,MyBatis-Plus 为你提供了简单易用的乐观锁解决方案,有效防止数据并发修改问题。

@InterceptorIgnore

基本说明

@InterceptorIgnore 是 MyBatis Plus 中的一个注解,通常用于在特定方法或类上标记,表示在执行这些方法或类时,忽略某些拦截器的作用。MyBatis Plus 中的拦截器机制可以在执行 SQL 语句之前或之后执行一些逻辑,比如自动填充、性能分析等。通过 @InterceptorIgnore 注解,你可以在特定的操作上关闭这些拦截器的执行。

作用范围

用在类或者方法上。

使用场景

1、忽略自动填充功能

如果你在某个方法中不希望触发自动填充(例如,插入操作时不自动填充创建时间、更新时间等字段),你可以使用该注解。

2、性能分析的忽略

在某些情况下,你可能希望跳过性能分析拦截器的分析,不记录 SQL 执行的性能数据。

3、分页拦截器的忽略

在某些情况下,可能希望跳过分页拦截器,直接执行完整的查询。

作用

@InterceptorIgnore 注解默认会禁用 MyBatis Plus 默认拦截器(如分页、自动填充等)的作用。它可以用在方法上或类上,具体方式如下:

方法级别:只在该方法中忽略拦截器的执行。

类级别:在该类中的所有方法中忽略拦截器的执行。

使用方法

1、引入依赖

2、方法或类上使用 @InterceptorIgnore 注解

在方法上使用:表示只对该方法忽略拦截器。

在类上使用:表示对该类的所有方法都忽略拦截器。

示例 1:方法上使用 @InterceptorIgnore

在上述代码中,addUser 方法上加了 @InterceptorIgnore 注解,这意味着在执行 addUser 方法时,MyBatis Plus 的拦截器(例如自动填充)将被忽略。

示例 2:类上使用 @InterceptorIgnore

在上述代码中,@InterceptorIgnore 被应用到 UserServiceImpl 类上,这意味着该类的所有方法都会忽略 MyBatis Plus 的拦截器

属性

tenantLine

行级租户

dynamicTableName

动态表名

blockAttack

攻击 SQL 阻断解析器,防止全表更新与删除

illegalSql

dataPermission

sharding

others

注意事项

1、与其他注解配合使用

@InterceptorIgnore 可以与其他 MyBatis Plus 功能结合使用,例如自动填充功能、性能分析功能、分页拦截器等,来灵活控制是否执行特定功能。

2、影响范围

如果你使用的是类级别的注解,那么该类中的所有方法都将忽略拦截器。如果只想控制某个特定方法,应该将注解应用到方法上。

3、可能的副作用

在某些情况下,忽略拦截器可能会导致预期之外的行为(例如,自动填充字段没有被填充,分页查询没有应用分页限制等)。在使用时需要谨慎,确保你了解这些功能在某些方法中被禁用后的影响。

总结

@InterceptorIgnore 是MyBatis Plus 提供的一个注解,用来在某些场景下禁用拦截器的作用。你可以选择将它应用到方法级别或者类级别,来灵活控制 MyBatis Plus 的拦截器是否在特定操作中生效。它通常用于禁用自动填充、分页、性能分析等功能。

@KeySequence

基本概念

@KeySequence 注解用于生成数据库主键的策略。它可以与 @TableId 注解一起使用,用于指定主键字段的生成规则。当使用数据库自增主键不适用或者需要使用其他主键生成策略时,可以使用 @KeySequence 注解来指定主键生成规则。它通过获取指定序列(Sequence)或表(Table)的下一个主键值,并将其作为主键填入数据库表中。专门用于支持 Oracle、PostgreSQL 等数据库的序列(Sequence)主键生成策略。

源码

核心作用

为实体类指定数据库序列名称,实现主键自动生成:

使用位置

使用在类上

属性

value

序列名

dbType

数据库类型

基本用法

实体类配置:

配置序列生成器

注意事项

1、必须配置 IdType.INPUT

2、序列必须存在

@MybatisPlusTest

基本概念

@MybatisPlusTest 是 MyBatis-Plus 提供的一个用于简化单元测试的注解,通常用于测试 MyBatis-Plus 集成的 DAO 层。它的作用是帮助开发者更方便地进行与 MyBatis-Plus 相关的数据库操作测试,特别是在进行集成测试时,减少配置的复杂度。

说明

这个注解是从
mybatis-plus-boot-starter-test
3.5.3.1版本才有的。

核心作用

创建一个轻量级的测试环境,只加载 MyBatis-Plus 相关的配置和 Bean:

基本用法

自动配置组件

使用 @MybatisPlusTest 会自动配置:

1、DataSource:数据源

2、SqlSessionFactory:MyBatis 会话工厂

3、SqlSessionTemplate:MyBatis 模板

4、@Mapper 接口:所有 Mapper 接口

5、MyBatis-Plus 插件:分页、乐观锁等插件

与其他测试注解对比

优势

1、轻量级

只加载必要组件,测试启动快

2、隔离性

每个测试方法独立,互不影响

3、便捷性

自动配置数据库和 MyBatis-Plus

4、真实性

使用真实的数据库操作,而非 Mock

总结

@MybatisPlusTest 为 MyBatis-Plus 项目提供了专业的数据层测试解决方案。

@EnumValue

基本概念

@EnumValue 注解的作用是标记枚举类型中的某个字段值,该字段值会用于数据库存储和查询的映射。当你在实体类中使用枚举类型字段时,MyBatis-Plus 默认会将枚举类型对象存储为字符串或数字,但你可以通过 @EnumValue 来指定具体的字段值映射方式,通常用于数据库与枚举之间的转换。

使用方式

假设我们有一个枚举类 Gender,其值可以是 MALE 和 FEMALE,我们希望将它们分别存储为 1 和 0(而不是默认的字符串)

@EnumValue 注解标记了 value 字段,它表示数据库中存储的实际值。

这个 value 字段是 Gender 枚举的“存储值”,在数据库中会被映射为 1(MALE)和 0(FEMALE)。

数据库映射

在数据库表中,我们会将 Gender 枚举的值存储为整数 1 或 0。例如:

@EnumValue 与 EnumTypeHandler 配合使用

MyBatis-Plus 会自动根据 @EnumValue 注解来进行枚举值的数据库存储与映射。因此,通常不需要额外指定 EnumTypeHandler。如果没有使用 @EnumValue,你还可以通过 EnumTypeHandler 来手动指定枚举的映射方式。

总结

@EnumValue 注解的作用是指定枚举类中用于映射数据库的字段。它帮助 MyBatis-Plus 将枚举类型与数据库字段之间的转换工作自动化。通过在枚举类中使用 @EnumValue 注解,你可以控制枚举值在数据库中的存储方式(如数字或字符串)。这个注解大大简化了枚举与数据库的映射工作,使得代码更加简洁、易于维护。

@OrderBy

基本概念

@OrderBy 是 MyBatis-Plus 提供的排序注解,用于在实体类字段上指定默认的排序规则,在查询时自动添加 ORDER BY 子句。

源码

核心作用

为实体类字段设置默认排序规则,在执行查询时自动生成排序条件

基本用法

1、单字段排序

2、多字段排序


相关推荐

风险突出的高危端口汇总 一网打尽 !

高危端口一直是攻击者关注的焦点,了解这些端口的风险、攻击方式及防护策略至关重要。一、文件传输类端口1.TCP20/21:FTP服务端口FTP(文件传输协议)用于文件的上传和下载。其明文传输特性使得...

9. Redis Operator (2) —— Sentinel部署

0.简介上一篇,我们借由Redis的单机部署,学习了一下Operator的基本使用,今天,我们在此基础上,部署一下Redis的Sentinel模式。Sentinel本质上是为了解...

Spring Boot3 整合 Redis 后解决缓存穿透问题全解析

在当今互联网软件开发领域,构建高效、稳定的应用系统是每个开发者的追求。对于从事互联网软件开发的人员来说,SpringBoot和Redis都是极为常用的技术工具。当在SpringBoot3...

Spring Boot3 整合 Redis 后解决缓存雪崩问题全解析

在当今互联网软件开发领域,高并发、高性能的系统需求日益增长。对于从事互联网软件开发的人员来说,构建高效的缓存机制至关重要。SpringBoot3作为一款流行的Java框架,与Redis这一...

Sa-Token 多账号体系下Redis持久化问题

在使用Sa-Token框架实现多账号体系时,当后端服务重启后,系统报错"未能获取对应StpLogic,type=XXX"。这种情况通常发生在配置了Redis持久化存储的场景下...

外贸独立站缓存迷惑行为:你的Redis可能正在制造更多问题!

上周帮一个深圳卖家排查网站卡顿,发现他们用Redis缓存了整站HTML——"你们这是把缓存当备份用呢?"结果每次更新产品都要手动清空缓存,编辑小哥差点辞职...最近对象缓存圈两大魔教...

别再用top和htop了,这几款终端神器让你的服务器状态一目了然

当top命令成为性能瓶颈:一个深夜运维的真实困境凌晨三点,服务器告警短信突然炸响。老王盯着屏幕上top命令的黑白界面,CPU使用率飙升到90%却找不到具体进程,内存占用数据分散在不同列,磁盘I/O更是...

Redis学习笔记:管道(Pipelining)技术详解(第三章)

在掌握了Redis的基础命令后,如何进一步提升批量操作的效率?管道(Pipelining)技术是解决这一问题的关键。本章将深入解析管道的工作原理、使用场景及与其他技术的对比,帮助你在高并发场景下优化R...

Redis8.0有哪些新特性(redis最新特性)

Redis8.0引入了多项新特性和功能增强,以下是其中的一些亮点:1、数据结构:向量集合(VectorSet):这是一种新的数据类型,专为向量相似性搜索设计。它基于有序集(sortedset)...

Netty 的对象池(netty objectdecoder)

Netty是一个高性能的网络通信框架,广泛用于构建高并发、低延迟的TCP/UDP服务。为了提升性能,Netty内部大量使用了对象池(ObjectPool)技术来减少频繁创建和销毁对象带来的...

Redis学习笔记:核心命令与数据类型操作指南(第二章)

上一章我们梳理了Redis的核心应用场景与选型逻辑,本章将聚焦Redis的命令体系,从键操作到各数据类型的核心命令,帮你快速掌握Redis的"操作语法"。一、键(Key)命令:Redi...

Redis面试核心考点总结(覆盖 90% 的 Redis 面试场景)

一、基础核心数据类型与适用场景String:缓存、计数器(INCR)、分布式锁(SETNX)Hash:存储对象(用户信息、商品属性)List:消息队列(LPUSH/BRPOP)、时间线Set:标...

Redis ListPack有哪些具体应用场景?

Redis的Listpack是一种紧凑的数据结构,适用于存储少量数据。它被设计为ziplist的一种改进版本,旨在解决ziplist中存在的连锁更新问题,并提供更高效的内存使用和访问速度。以下是Lis...

SpringBoot实现单点登录(SSO)的4种方案

单点登录(SingleSign-On,SSO)是企业应用系统中常见的用户认证方案,它允许用户使用一组凭证访问多个相关但独立的系统,无需重复登录。对于拥有多个应用的企业来说,SSO可以显著提升用户体验...

刚刚,给学妹普及了登录的两大绝学

今天跟大家聊一个比较基础的话题,就是实现登录的方式有哪些?适合刚入行的朋友。华山之Session绝学Session我们称之为会话控制,是一种在服务器端保持会话状态的解决方案。通俗点来讲就是客户...

取消回复欢迎 发表评论: