https://blog.csdn.net/weixin_42526068/article/details/113039510
@TableId
主鍵專屬
比如數(shù)據(jù)中的表中的字段是id
但是實(shí)體類是userId
那么就需要在userId上打上這個(gè)注解
用法
設(shè)置主鍵映射 value映射主鍵字段的名字
type 設(shè)置主鍵類型 主鍵的生成策略 (圈起來的重要)
1 數(shù)據(jù)庫自增 AUTO
開發(fā)者無需賦值,自己根據(jù)當(dāng)前表中id最大值自增+1
手動賦值的話還是使用數(shù)據(jù)庫id中最大值+1 的方式賦予id
2 自動生成主鍵 使用雪花算法 NONE
配合新增使用 用的時(shí)候需要注意主鍵長度 但是3.20的時(shí)候是采取該字段最大值+1
1.數(shù)據(jù)類型改int為long
2.數(shù)據(jù)庫表的長度要改
需要注意生成的長度否則會報(bào)錯(cuò)
Caused by: org.apache.ibatis.reflection.ReflectionException:
Could not set property 'id' of 'class com.lin.mybatisplus.pojo.User'
with value '1289924709438889985' Cause: java.lang.IllegalArgumentException:
argument type mismatch
然后還需要修改數(shù)據(jù)類型,才能存進(jìn)去
3 開發(fā)者手動賦值 INPUT
如果插入操作中,沒有對id進(jìn)行賦值,那么存進(jìn)數(shù)據(jù)庫中的將為0(long)
數(shù)據(jù)庫一般會采取自增id的方式處理 當(dāng)前數(shù)據(jù)庫編號的值+1
如果給定值了,就用給定的值
4 ASSIGN_ID
等同于ID_ WORKER(3) ,ID_ WORKER STR(3) 闰渔,
使用mp自動賦值 采取雪花算法,但是3.20的時(shí)候是采取該字段最大值+1
5 ASSIGN_UUID
等同于UUID
要求主鍵類型必須是String類型,會自動生成UUID進(jìn)行賦值
需要考慮數(shù)據(jù)庫的字段設(shè)計(jì),數(shù)據(jù)庫中的int類型的,所以存不進(jìn)去,但因?yàn)橹麈I自增,如果要修改int類型為varchar類型的話,需要去除主鍵自增
@TableField
非主鍵字段使用
比如數(shù)據(jù)中的表中的字段是name
但是實(shí)體類是userName
那么就需要在userName上打上這個(gè)注解
映射非主鍵字段 value映射字段名
exist 表示是否為是數(shù)據(jù)庫字段
在VO DTO的時(shí)候,經(jīng)常會查詢一些數(shù)據(jù)庫中沒有的字段,如果沒有打上標(biāo)簽
那么查詢會報(bào)錯(cuò)(如果實(shí)體類中的成員變臉在數(shù)據(jù)庫中沒有對應(yīng)字段,可以視同)
需要設(shè)置為false
select 表示是否查詢該字段
加上不參與查詢,并且返回null
fill 表示是否自動填充
將對象存入數(shù)據(jù)的時(shí)候,由mybatisplus自動給某些字段賦值
應(yīng)用場景
create_time update_time
比如說注冊的時(shí)間和修改時(shí)間是基本上每個(gè)表都會用到的,實(shí)現(xiàn)起來就是獲取時(shí)間存入,
但是就是煩
那么就交給mp來做 (采取以下配置,并且需要創(chuàng)建處理器)
DEFAULT --默認(rèn)不處理
INSERT --插入時(shí)填充字段(第一次添加的時(shí)候)
INSERT_UPDATE --插入和更新時(shí)填充字段
(最近一次更新的時(shí)候,也就是插入和更新都滿足)
UPDATE --更新時(shí)填充字段
創(chuàng)建自動填充處理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler? {
? ? /**
? ? * 在插入的時(shí)候響應(yīng)相關(guān)操作
? ? * @param metaObject
? ? */
? ? @Override
? ? public void insertFill(org.apache.ibatis.reflection.MetaObject metaObject) {
/**
* 大意是將當(dāng)前的時(shí)間賦值給字段名? 也就是參數(shù)2 賦值給參數(shù)1 metaObject 可理解為當(dāng)前傳入對象
* 人話:就是給當(dāng)前傳入對象賦值
*/
? ? ? ? setFieldValByName("createTime",new Date(),metaObject);
? ? ? ? setFieldValByName("updateTime",new Date(),metaObject);
? ? }
? ? /**
? ? * 在插入的時(shí)候響應(yīng)相關(guān)操作
? ? * @param metaObject
? ? */
? ? @Override
? ? public void updateFill(org.apache.ibatis.reflection.MetaObject metaObject) {
? ? ? ? setFieldValByName("updateTime",new Date(),metaObject);
? ? }
}
測試
@Version
標(biāo)記樂觀鎖 -主修改操作
-防止數(shù)據(jù)被重復(fù)操作
-防止兩個(gè)線程同時(shí)操作同一個(gè)數(shù)據(jù),保證數(shù)據(jù)的安全性
原理:
標(biāo)記樂觀鎖,通過version字段來保證數(shù)據(jù)的安全性触创,當(dāng)修改數(shù)據(jù)的時(shí)候,
會以version作為條件,當(dāng)條件成立的時(shí)候才會修改成功。
version=1
線程1: update ... set version = 2 where version= 1
線程2: update ... set version = 2 where version= 1
解釋:
隨便一條線程操作成功version 改為2 那么另一條線程就執(zhí)行失敗
環(huán)境搭建:
1.數(shù)據(jù)庫添加version字段 默認(rèn)值1
2.實(shí)體類添加version成員變量 天且添加@version
3.編寫配置類
@Configuration
public class MyBatisPlusConfig {
? ? /**
? ? * @Configuration 加上就是配置類了
? ? *
? ? * @Bean? ? ? ? 返回一個(gè)樂觀鎖攔截器的對象
? ? *
? ? * 大意就是會自動掉一個(gè)方法,然后通bean注解實(shí)例化對線,添加對象到IOC容器中
? ? */
? ? @Bean
? ? public OptimisticLockerInterceptor lockerInterceptor(){
? ? ? ? return new OptimisticLockerInterceptor();
? ? }
}
測試
同時(shí)修改情況 -感興趣的可以試一下
@EnumValue
通用的枚舉類注解,將數(shù)據(jù)庫字段映射成實(shí)體類的枚舉類型成員變量
意識:將枚舉改成成員變量和數(shù)據(jù)庫的字段映射起來,根據(jù)數(shù)據(jù)庫字段的值找到對應(yīng)枚舉的對象
---第一種通過注解的方式
1.數(shù)據(jù)庫添加狀態(tài)字段
2.新建枚舉類
加入字段 -需要注意,一定要和數(shù)據(jù)庫字段映射起
在配置文件中配置枚舉包掃描
測試查詢
----第二種通過實(shí)現(xiàn)接口的方式
插入操作變更
@TableLogic
映射邏輯刪除
————————————————
版權(quán)聲明:本文為CSDN博主「lwieui」的原創(chuàng)文章娘锁,遵循CC 4.0 BY-SA版權(quán)協(xié)議钮莲,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42526068/article/details/113039510