做網(wǎng)站IP關(guān)鍵詞排名什么意思
目錄
一、@TableName
二、@TableId
三、@TableField
四、@TableLogic
一、@TableName
????????在使用MyBatis-Plus實(shí)現(xiàn)基本的CRUD時(shí),我們并沒有指定要操作的表,只是在Mapper接口繼承BaseMapper時(shí),設(shè)置了泛型User,而操作的表為user表
????????由此得出結(jié)論,MyBatis-Plus在確定操作的表時(shí),由BaseMapper的泛型決定,即實(shí)體類型決定,且默認(rèn)操作的表名和實(shí)體類型的類名一致。
?????????若實(shí)體類類型的類名和要操作的表的表名不一致,會(huì)出現(xiàn)什么問題?
????????將表user更名為t_user,測試查詢功能。
????????程序拋出異常,Table?'mybatis_plus.user'doesn't?exist,因?yàn)楝F(xiàn)在的表名為t_user,而默認(rèn)操作的表名和實(shí)體類型的類名一致,即user表。
?????????在實(shí)體類類型上添加@TableName("t_user"),標(biāo)識(shí)實(shí)體類對(duì)應(yīng)的表,即可成功執(zhí)行SQL語句。
????????在開發(fā)的過程中,我們經(jīng)常遇到以上的問題,即實(shí)體類所對(duì)應(yīng)的表都有固定的前綴,例如t_或tbl_
????????此時(shí),可以使用MyBatis-Plus提供的全局配置,為實(shí)體類所對(duì)應(yīng)的表名設(shè)置默認(rèn)的前綴,那么就不需要在每個(gè)實(shí)體類上通過@TableName標(biāo)識(shí)實(shí)體類對(duì)應(yīng)的表
mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默認(rèn)前綴table-prefix: t_
二、@TableId
????????MyBatis-Plus在實(shí)現(xiàn)CRUD時(shí),會(huì)默認(rèn)將id作為主鍵列,并在插入數(shù)據(jù)時(shí),默認(rèn)基于雪花算法的策略生成id。
????????若實(shí)體類和表中表示主鍵的不是id,而是其他字段,例如uid,MyBatis-Plus會(huì)自動(dòng)識(shí)別uid為主鍵列嗎?
????????實(shí)體類中的屬性id改為uid,將表中的字段id也改為uid,測試添加功能。
????????程序拋出異常,Field?'uid'doesn't?have?a?default value,說明MyBatis-Plus沒有將uid作為主鍵賦值。
????????在實(shí)體類中uid屬性上通過@TableId將其標(biāo)識(shí)為主鍵,即可成功執(zhí)行SQL語句。
????????@TableId的value屬性:
????????若實(shí)體類中主鍵對(duì)應(yīng)的屬性為id,而表中表示主鍵的字段為uid,此時(shí)若只在屬性id上添加注解@TableId,則拋出異常Unknown?column'id'in'field?list',即MyBatis-Plus仍然會(huì)將id作為表的?主鍵操作,而表中表示主鍵的是字段uid。
????????此時(shí)需要通過@TableId注解的value屬性,指定表中的主鍵字段,@TableId("uid")或@TableId(value="uid")。
????????@TableId的type屬性:
????????type屬性用來定義主鍵策略。
????????配置全局主鍵策略:
mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默認(rèn)前綴table-prefix: t_# 配置MyBatis-Plus的主鍵策略id-type: auto
????????常用的主鍵策略:
值 | 描述 |
IdType.ASSIGN_ID?(默?認(rèn)) | 基于雪花算法的策略生成數(shù)據(jù)id,與數(shù)據(jù)庫id是否設(shè)置自增無關(guān) |
IdType.AUTO | 使用數(shù)據(jù)庫的自增策略,注意,該類型請(qǐng)確保數(shù)據(jù)庫設(shè)置了id自增,?否則無效 |
三、@TableField
????????經(jīng)過以上的測試,我們可以發(fā)現(xiàn),MyBatis-Plus在執(zhí)行SQL語句時(shí),要保證實(shí)體類中的屬性名和 表中的字段名一致
????????如果實(shí)體類中的屬性名和字段名不一致的情況,會(huì)出現(xiàn)什么問題呢?
????????情況1:
????????若實(shí)體類中的屬性使用的是駝峰命名風(fēng)格,而表中的字段使用的是下劃線命名風(fēng)格
????????例如實(shí)體類屬性u(píng)serName,表中字段user_name
????????此時(shí)MyBatis-Plus會(huì)自動(dòng)將下劃線命名風(fēng)格轉(zhuǎn)化為駝峰命名風(fēng)格
????????相當(dāng)于在MyBatis中配置
????????情況2:
????????若實(shí)體類中的屬性和表中的字段不滿足情況1
????????例如實(shí)體類屬性name?,表中字段username
????????此時(shí)需要在實(shí)體類屬性上使用@TableField("username")設(shè)置屬性所對(duì)應(yīng)的字段名
四、@TableLogic
????????該注解用于表示邏輯刪除。
????????邏輯刪除:
????????物理刪除:真實(shí)刪除,將對(duì)應(yīng)數(shù)據(jù)從數(shù)據(jù)庫中刪除,之后查詢不到此條被刪除的數(shù)據(jù)
????????邏輯刪除:假刪除,將對(duì)應(yīng)數(shù)據(jù)中代表是否被刪除字段的狀態(tài)修改為“被刪除狀態(tài)”,之后在數(shù)據(jù)庫中仍舊能看到此條數(shù)據(jù)記錄
????????使用場景:可以進(jìn)行數(shù)據(jù)恢復(fù)
????????實(shí)現(xiàn)邏輯刪除:
????????step1?:數(shù)據(jù)庫中創(chuàng)建邏輯刪除狀態(tài)列,設(shè)置默認(rèn)值為0
????????step2?:實(shí)體類中添加邏輯刪除屬性
????????step3?:測試
????????測試刪除功能,真正執(zhí)行的是修改
????????UPDATE t_user?SET?is_deleted=1 WHERE?id=? AND?is_deleted=0
????????測試查詢功能,被邏輯刪除的數(shù)據(jù)默認(rèn)不會(huì)被查詢
????????SELECT?id,username?AS?name,age,email,is_deleted?FROM?t_user?WHERE?is_deleted=0