mybatis-plus之如何根據(jù)數(shù)據(jù)庫主鍵定義字段類型
mybatis-plus根據(jù)數(shù)據(jù)庫主鍵定義字段類型
查看mybatis-plus源代碼IdType
package com.baomidou.mybatisplus.annotation;
public enum IdType {
? AUTO(0), ? ? ? ? ? ?//數(shù)據(jù)庫自增 依賴數(shù)據(jù)庫
? NONE(1), ? ? ? ? ? ?//表示該類型未甚至主鍵類型 (如果沒有主鍵策略)默認根據(jù)雪花算法生成
? INPUT(2), ? ? ? ? ? //用戶輸入ID(該類型可以通過自己注冊填充插件進行填充)
? //下面這三種類型,只有當插入對象id為空時 才會自動填充
? ID_WORKER(3), ? ? ? //全局唯一(idWorker)數(shù)值類型
? UUID(4), ? ? ? ? ? ?//全局唯一(UUID)
? ID_WORKER_STR(5); ? //全局唯一(idWorker的字符串表示)
? private int key;
? private IdType(int key) {
? ? this.key = key;
? }
? public int getKey() {
? ? return this.key;
? }
}在實體類中ID屬性字段加注解
@TableId(type = IdType.AUTO) 主鍵自增 數(shù)據(jù)庫中需要設(shè)置主鍵自增 private Long id; @TableId(type = IdType.NONE) 默認 跟隨全局策略走 private Long id; @TableId(type = IdType.UUID) UUID類型主鍵 private Long id; @TableId(type = IdType.ID_WORKER) 數(shù)值類型 ?數(shù)據(jù)庫中也必須是數(shù)值類型 否則會報錯 private Long id; @TableId(type = IdType.ID_WORKER_STR) 字符串類型 ? 數(shù)據(jù)庫也要保證一樣字符類型 private Long id; @TableId(type = IdType.INPUT) 用戶自定義了 ?數(shù)據(jù)類型和數(shù)據(jù)庫保持一致就行 private Long id;
全局主鍵策略實現(xiàn)
在application.yml文件中進行全局設(shè)置
mybatis-plus: ? mapper-locations: ? ? - com/mp/mapper/* ? global-config: ? ? db-config: ? ? ? id-type: uuid/none/input/id_worker/id_worker_str/auto ? 表示全局主鍵都采用該策略(如果全局策略和局部策略都有設(shè)置,局部策略優(yōu)先級高)
mybatis-plus操作數(shù)據(jù)庫自增主鍵和時間字段的設(shè)置
1. 主鍵ID設(shè)置@Table(type=IdType.AUTO)后報錯,或者數(shù)據(jù)庫任然保持19位默認雪花加密
- 沒設(shè)置數(shù)據(jù)庫主鍵ID為自增。
- 遇到任然雪花加密的措施,網(wǎng)上說法是數(shù)據(jù)庫自增關(guān)了再開,試了沒用,直接刪表重建發(fā)現(xiàn)有用。
2.給enetity字段的時間設(shè)置自動填充
在給類型添加標簽-
@TableField(fill = FieldFill.INSERT)和 @TableField(fill = FieldFill.INSERT_UPDATE)
重寫標簽自定義實現(xiàn)類 MyMetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final ZoneId ZONE_UTC = ZoneId.of("UTC");
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}3. 樂觀鎖問題
樂觀鎖十分樂觀,總是認為不會出現(xiàn)問題。無論干什么都不會去上鎖。如果出現(xiàn)問題就再測試加鎖處理。
悲觀鎖,覺得總會出問題,所以干什么都會先上鎖。
樂觀鎖實現(xiàn)方式:
- 取出記錄時,獲取當前 version
- 更新時,帶上這個 version
- 執(zhí)行更新時, set version = newVersion where version = oldVersion
- 如果 version 不對,就更新失敗
注意版本更新,改mbp版本為3.4.2即可
4.數(shù)據(jù)庫設(shè)置邏輯刪除時,注意
字段名不要叫delete,這東西在數(shù)據(jù)庫里是個關(guān)鍵字,救命。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理
EhCache是一個純Java的進程內(nèi)緩存框架,具有快速、上手簡單等特點,是Hibernate中默認的緩存提供方。本文講述下SpringBoot2 整合Ehcache組件的步驟2021-06-06
SpringCloud?Eureka服務注冊中心應用入門詳解
這篇文章主要介紹了Spring?Cloud?Eureka服務注冊中心入門流程分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
Elasticsearch term 查詢之精確值搜索功能實現(xiàn)
term查詢是Elasticsearch中用于精確值搜索的一種基本方式,通過了解 term 查詢的工作原理和使用方法,你可以更好地利用 Elasticsearch 進行結(jié)構(gòu)化數(shù)據(jù)的搜索和分析,本文將詳細介紹 term 查詢的工作原理、使用場景以及如何在 Elasticsearch 中應用它,感興趣的朋友一起看看吧2024-06-06
spring event 事件異步處理方式(發(fā)布,監(jiān)聽,異步處理)
這篇文章主要介紹了spring event 事件異步處理方式(發(fā)布,監(jiān)聽,異步處理),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
關(guān)于重寫equals()方法和hashCode()方法及其簡單的應用
這篇文章主要介紹了關(guān)于重寫equals()方法和hashCode()方法及其簡單的應用,網(wǎng)上的知識有些可能是錯誤的,關(guān)于?equals()?方法的理解,大家討論不一樣,需要的朋友可以參考下2023-04-04

