MyBatisPlusのデータベーステーブルにデータを挿入します。@ TableIdアノテーションは、シーケンスIDの自動インクリメント機能を実現するためにMyBatisPlusで使用されます。

自動インクリメントシーケンスIDの自動挿入機能を実現するMyBatisPlusの@TableIdアノテーション

この注釈は、主に、対応するデータベーステーブルのエンティティクラスのプライマリキー属性に使用されます。

書き込み:@TableId(value = "database primary key field"、type =IdType。6つのタイプの1つ)
例:@TableId(value = "user_id"、type = IdType.AUTO)
IdTypeには多くの属性があるため、現時点で把握する必要があります。 AUTO属性は問題ありませんが、この例でも主にAUTO属性の機能を紹介しています。

1.注釈のタイプの値の意味

    //IdType.ID_WORKER_STR 默认的;底层使用了雪花算法;类型为Integer
    //IdType.AUTO 数据库自增;数据库上也要勾上自增
    //IdType.NONE 没有设置主键类型;跟随全局;全局的主键策略如果没有设置,默认是雪花算法
    //IdType.INPUT 手动输入;必须手动输入,数据库自增也没用;
    //IdType.UUID 全局唯一id;无序;字符串;
    //ID_WORKER_STR 全局唯一(idWorker的字符串表示)

2.タイプの値はAUTOです

MyBatisPlusがデータベーステーブルにデータを挿入するとき、プライマリキーがidであり、idがデータベーステーブルの自動インクリメント列として設定されている場合、@ Tableld(value = "id"がjavaエンティティの対応する属性に書き込まれている場合) 、type = IdType.Auto)アノテーションの場合、データを挿入するときにidの値を書き込む必要はありません。プログラムは、自動インクリメントルールに従ってidの値をデータベースに挿入しますが、Javaエンティティのid属性にアノテーション@TableIdを書き込まない場合(value = "id"、type = IdType.Auto)の場合、値は挿入時にidに追加されますが、自己インクリメントの規則ではなく、スノーフレークアルゴリズムの規則に従います。次の図は、javaエンティティ属性を自己インクリメントに設定するためのものです。

ここに写真の説明を挿入

次の図は、データベース内の対応するプライマリキーフィールドを自動インクリメントに設定するためのものです。

ここに写真の説明を挿入

この場合、挿入時にidの値を設定する必要はなく、以下に示すように、idの値が自動的にインクリメントおよび生成されます。

ここに写真の説明を挿入

データベースのidフィールドに自動インクリメントシーケンスを設定しただけで、javabeanの対応するid属性に@Tableld(value = "id"、type = IdType.Auto)アノテーションを設定しなかった場合、idは次のようになります。スノーフレークアルゴリズムに従って生成されます。

スノーフレークアルゴリズム

SnowflakeはTwitterのオープンソースの分散ID生成アルゴリズムであり、その結果、長いIDになります。核となるアイデアは、ミリ秒数として41ビット、マシンIDとして10ビット(5ビットはデータセンター、マシンIDの5ビット)、ミリ秒以内のシリアル番号として12ビット(各ノードがミリ秒ごとに生成できることを意味します)を使用することです。 4096 ID)、最後に符号ビットがあり、常に0です。

1. SnowFlakeアルゴリズムによって生成されたidの結果は64ビット整数であり、その構造は次のとおりです。

img

●1ビット、使用しません。バイナリシステムでは、1の最上位ビットは負の数ですが、生成するIDは通常整数を使用するため、最上位ビットは0に固定されます。

●41ビット。タイムスタンプ(ミリ秒)の記録に使用されます。
○41ビットは241 − 1 2 ^ {41} -1を表すことができます24 11つの数値、
○正の整数を表すためにのみ使用される場合(コンピューターの正の数値には0が含まれます)、表すことができる値の範囲は次のとおりです:0〜241 − 1 2 ^ {41} -124 11、マイナス1は、表現できる値の範囲が1ではなく0から始まるためです。
○つまり、41ビットは2 41 − 1 2 ^ {41} -1を表すことができます24 11ミリ秒の値を単位年に換算すると(2 41 − 1)/(1000 ∗ 60 ∗ 60 ∗ 24 ∗ 365)= 69(2 ^ {41} -1)/(1000 * 60 * 60 * 24 * 365)= 6924 11 / 1 0 0 06 06 02 43 6 5 =6 9

10ビット。作業マシンIDを記録するために使用されます。
○210 = 1024 2 ^ {10} = 1024で展開可能21 0=1 0 2 4ノード(5桁のdatacenterIdと5桁のworkerIdを含む)
○5桁(ビット)で表すことができる最大の正の整数は2 5 − 1 = 31 2 ^ {5} -1 = 31です。251=3 1、つまり32個の数字0、1、2、3、... 31を使用して、異なるdatecenterIdまたはworkerIdを表すことができます。

同じミリ秒以内に生成されたさまざまなIDを記録するために使用される12桁のシリアル番号。
○12ビットで表現できる最大の正の整数は212 − 1 = 4095 2 ^ {12} -1 = 409521 21=4 0 9 5、つまり、0、1、2、3、... 4094などの4095番号を使用して、同じマシンによって同時に生成された4095 IDシリアル番号(ミリ秒)を表すことができます。

Javaの64ビット整数はlong型であるため、JavaのSnowFlakeアルゴリズムによって生成されたIDはlongに格納されます。

SnowFlakeは次のことを保証できます。
●生成されたすべてのIDは時間の傾向に応じて増加します
●重複したIDは分散システム全体で生成されません(区別するdatacenterIdとworkerIdがあるため)

3.プライマリキーが例外のシーケンスを増やすように設定されていない場合

主キーIDが自動インクリメントシーケンスに設定されていないが、ユーザー挿入時にID値が設定されていない場合、以下のような異常が発生します。

ここに写真の説明を挿入

自動インクリメントシーケンス例外をプライマリキーに設定してから非表示にします。設定方法は次のとおりです。

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45950109/article/details/112525780
おすすめ