表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇

2023-09-18 18:46:48

悟纤:师傅,脑瓜疼~

师傅:徒儿这是怎么了?

悟纤:师傅,你了解冷暴力吗?

师傅:略懂略懂。

悟纤:那冷暴力是怎么定义的?

师傅:冷暴力是暴力的一种,其表现形式多为通过冷淡、轻视、放任、疏远和漠不关心,致使他人精神上和心理上受到侵犯和伤害。冷暴力是目前为社会公认的会对行为相对人造成心理、精神伤害的行为。

悟纤:有点抽象呢。

师傅:以下是冷暴力的一些常见表现和症状:

(1)沉默和忽视:冷暴力者会选择沉默,忽视对方的存在和感受,不回应对方的问题或需求。可能他人的存在感到无动于衷,没有表达关心和爱的行为。

(2)拒绝交流和沟通:冷暴力者可能会故意避免与他人建立沟通和交流的联系,不与对方交谈,独自行动,不与对方分享自己的想法和感受。

(3)贬低和轻视:冷暴力者可能使用贬低和嘲笑的方式来打击对方的自尊心和自信心。可能以轻蔑和讽刺的语气对待对方,嘲笑对方的言行或外貌。

悟纤:师傅,那我感觉最近有点被无视了,对方不管怎么样都不愿意开口和我沟通交流问题。

师傅:是的,这个就是冷暴力的具体的一种表现了。

悟纤:冷暴力真的是太折磨人了。

师傅:确实是,可能对方没有意识到这是一种冷暴力,等大家都没有情绪的时候,还是要沟通一下,把问题抛出来,然后以后碰到问题之后,使用一种更好的方式进行问题的解决。

师傅:关注外在不可控,还是优先关注自己的内在成长,冷暴力本身也是对自身无法解决问题的一种无奈的表现。

悟纤:学习,学习,我要学习,我要干干斯达迪。

导读

Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。

在前面的小节中,对于MyBatis-Plus的使用已经有了一个基本的了解了,本文将介绍 MybatisPlus 注解包相关类详解。

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《MyBatis-Plus是什么以及特性[MyBatis-Plus系列]》

02.《MyBatis-Plus快速开始 [MyBatis-Plus系列]》

03.《MyBatis-Plus快速实现增删改 [MyBatis-Plus系列]》

04.《MyBatis-Plus实现普通查询/分页查询[MyBatis-Plus系列]》

05.《使用LambdaQueryWrapper再也不担心字段拼写错误了 [MyBatis-Plus系列]》

一、@TableName

•描述:表名注解,标识实体类对应的表

•使用位置:实体类

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

可配置的属性:

属性

类型

必须指定

默认值

描述

value

String

""

表名

schema

String

""

schema

keepGlobalPrefix

boolean

false

是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)

resultMap

String

""

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

autoResultMap

boolean

false

是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)

excludeProperty

String[]

{}

需要排除的属性名 @since 3.3.1

关于 autoResultMap 的说明:

MP 会自动构建一个 resultMap 并注入到 MyBatis 里(一般用不上),请注意以下内容:

因为 MP 底层是 MyBatis,所以 MP 只是帮您注入了常用 CRUD 到 MyBatis 里,注入之前是动态的(根据您的 Entity 字段以及注解变化而变化),但是注入之后是静态的(等于 XML 配置中的内容)。

而对于 typeHandler 属性,MyBatis 只支持写在 2 个地方:

(1)定义在 resultMap 里,作用于查询结果的封装

(2)定义在 insert 和 update 语句的 #{property} 中的 property 后面(例:#{property,typehandler=xxx.xxx.xxx}),并且只作用于当前 设置值

除了以上两种直接指定 typeHandler 的形式,MyBatis 有一个全局扫描自定义 typeHandler 包的配置,原理是根据您的 property 类型去找其对应的 typeHandler 并使用。

二、@TableId

•描述:主键注解

•使用位置:实体类主键字段

@TableName("sys_user")public class User {    @TableId(type = IdType.AUTO)    private Long id;    private String name;    private Integer age;    private String email;}

可配置的属性:

属性

类型

必须指定

默认值

描述

value

String

""

主键字段名

type

Enum

IdType.NONE

指定主键类型

#IdType枚举值:

描述

AUTO

数据库 ID 自增

NONE

无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT

insert 前自行 set 主键值

ASSIGN_ID

分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)

ASSIGN_UUID

分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

ID_WORKER

分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)

UUID

32 位 UUID 字符串(please use ASSIGN_UUID)

ID_WORKER_STR

分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)

三、@TableField

•描述:字段注解(非主键)

public class User {    @TableId(type = IdType.AUTO)    private Long id;    @TableField(value = "nickname")    private String name;    private Integer age;    private String email;}

可配置属性:

属性

类型

必须指定

默认值

描述

value

String

""

数据库字段名

exist

boolean

true

是否为数据库表字段

condition

String

""

字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window)

update

String

""

字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)

insertStrategy

Enum

FieldStrategy.DEFAULT

举例:NOT_NULL
insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)

updateStrategy

Enum

FieldStrategy.DEFAULT

举例:IGNORED
update table_a set column=#{columnProperty}

whereStrategy

Enum

FieldStrategy.DEFAULT

举例:NOT_EMPTY
where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>

fill

Enum

FieldFill.DEFAULT

字段自动填充策略

select

boolean

true

是否进行 select 查询

keepGlobalFormat

boolean

false

是否保持使用全局的 format 进行处理

jdbcType

JdbcType

JdbcType.UNDEFINED

JDBC 类型 (该默认值不代表会按照该值生效)

typeHandler

Class<? extends TypeHandler>

UnknownTypeHandler.class

类型处理器 (该默认值不代表会按照该值生效)

numericScale

String

""

指定小数点后保留的位数

关于`jdbcType`和`typeHandler`以及`numericScale`的说明:

numericScale只生效于 update 的 sql. jdbcType和typeHandler如果不配合@TableName#autoResultMap = true一起使用,也只生效于 update 的 sql. 对于typeHandler如果你的字段类型和 set 进去的类型为equals关系,则只需要让你的typeHandler让 Mybatis 加载到即可,不需要使用注解

#FieldStrategy

描述

IGNORED

忽略判断

NOT_NULL

非 NULL 判断

NOT_EMPTY

非空判断(只对字符串类型字段,其他类型字段依然为非 NULL 判断)

DEFAULT

追随全局配置

NEVER

不加入SQL

#FieldFill

描述

DEFAULT

默认不处理

INSERT

插入时填充字段

UPDATE

更新时填充字段

INSERT_UPDATE

插入和更新时填充字段

四、@Version

•描述:乐观锁注解、标记 @Version 在字段上

具体案例会在后面的章节进行详细讲解。

五、@TableLogic

•描述:表字段逻辑处理注解(逻辑删除)

属性

类型

必须指定

默认值

描述

value

String

""

逻辑未删除值

delval

String

""

逻辑删除值

六、@OrderBy

•描述:内置 SQL 默认指定排序,优先级低于 wrapper 条件查询

属性

类型

必须指定

默认值

描述

isDesc

boolean

true

是否倒序查询

sort

short

Short.MAX_VALUE

数字越小越靠前

小结

本文主要介绍了MP中常见的注解,用到的注解主要是:

(1)@TableName:表名注解,标识实体类对应的表

(2)@TableId:主键注解

(3)@TableField:字段注解

(4)@TableLogic:表字段逻辑处理注解(逻辑删除)

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

更多推荐

C语言:选择+编程(每日一练)

目录选择题:题一:题二:题三:题四:题五:编程题:题一:珠玑妙算思路一:题二:两数之和思路一:本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!感谢大佬们的一键三连!感谢大佬们的一键三连!感谢大佬们的一键三连!选择题:题一:1、有以下函数,该函数的功能是()intfun(c

python-wordcloud词云

导入模块fromwordcloudimportWordCloudimportjiebaimportimageioimportmatplotlib.pyplotaspltfromPILimportImageGrabimportnumpyasnpwordcloud以空格为分隔符号,来将文本分隔成单词PILpillow模块i

网络安全(黑客)自学

前言一、什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web防御技术(WAF)。作为一个合格的网络安全

Spring WebSocket 认证与授权:掌控安全通道,迈向巅峰之旅!

一、需要了解的事项http和WebSocket的安全链和安全配置是完全独立的。SpringAuthenticationProvider根本不参与Websocket身份验证。将要给出的示例中,身份验证不会发生在HTTP协商端点上,因为JavaScriptSTOMP(websocket)库不会随HTTP请求一起发送必要的身

ARM DAY3

硬件模块与总线连接:各种硬件模块(如GPIO控制器)与CPU(或内核)通过总线进行连接。这个总线负责数据和指令的传输。特殊功能寄存器(SFRs)的角色:每个硬件模块内部都有一组特殊功能寄存器(SFRs)。这些寄存器是硬件模块的一部分,用于存储该模块的当前状态和配置信息。它们在特定的内存地址中有其对应的位置。使用LDR读

华为MTL流程的六个模块初步解析

大家好!昨天华研荟给大家介绍了华为MTL流程的基本概念和发展历程,今天我们来了解下华为MTL流程的六个模块。如昨天所述,华为的MLT流程主要有六个模块:市场洞察、市场管理、联合创新、销售赋能、激发需求、营销质量管理。接下来,我们来了解这六个模块。1.市场洞察在这里指的是通过观察和分析市场动态,了解市场趋势、需求和竞争环

【Android】线程下载资源保证资源到位采用了 OkHttp的三方网络下载 & 文件缓存策略

背景使用SVGA的三方的url播放方式会比较慢,至少延迟3s以上才会出现svga效果,所以改变策略:将线上的svga全部下载到本地进行播放,那么就得将采用网络缓存的方式实现效果。实现那么就得实现以下几点:初次下载缓存判重下载下载的地址就放在这里。这里也是常规的文件路径下载通过上下文类获取即可,如果参数路径没有,就会再构

ETHERCAT转MODBUS TCP/IP协议网关

产品介绍JM-ECT-TCPIP是自主研发的一款EtherCAT从站功能的通讯网关。该产品主要功能是将EtherCAT网络和TCP/IP网络连接起来。本网关连接到EtherCAT总线中做为从站使用,连接到TCP/IP网络中做为服务器或客户端使用。产品参数技术参数u网关做为EtherCAT网络的从站,可以连接倍福、欧姆龙

ASIC-WORLD Verilog(11)过程时序控制

写在前面在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。这是网站原文:VerilogTutorial这是系列导航:Verilog教程系列文章导航过程块和时序控制

深入浅出学Verilog--基础语法

1、简介Verilog的语法和C语言非常类似,相对来说还是非常好学的。和C语言一样,Verilog语句也是由一连串的令牌(Token)组成。1个令牌必须由1个或1个以上的字符(character)组成,令牌可以是:注释(Comment)空白符(Whitespace)运算符(Operator)数字(Number)字符串(

新手如何学习RPA,怎么学,从哪下手,学习资源哪里来?

随着人工智能技术的迅速发展,RPA(RoboticProcessAutomation)已经成为企业自动化流程的一个重要工具。越来越多的新手开始学习RPA技术,以便在职场中获得更多的竞争优势。本文将介绍新手如何学习RPA,从哪里开始学习,以及有哪些学习资源可以利用。一、了解RPA基础知识学习RPA的第一步是了解其基础知识

热文推荐