「Mybatis-plus」主キーIDの生成、フィールドの自動入力

1つは、主キーIDの生成です。

通常、このデータの一意のIDとして、データベーステーブルに主キーIDがあります。

一般的な方法

  1. データベースの自動拡張は非常に一般的であり、データベース全体で唯一の拡張になる可能性があります。idは自然にソートされるため、ソートを伴う操作に非常に便利です。
  2. UUIDの自動拡張は単純ですが、サブテーブルなどの操作ではより厄介です。2番目のシートにデータを挿入するときは、前のシートの最後のデータのIDを取得する必要があるためです。UUIDは、ランダムで一意の値を持つたびに異なりますが、ランダムであるため、並べ替えはありません。
  3. redisredisは、redisのアトミック操作を使用してIDを生成するためにも使用できます。利点は、データベースに依存せず、パフォーマンスが優れていることですが、redisを導入するとある程度の複雑さが生じます。

mybatis-plus way

実際、以前にmpを使用してデータを追加したときは、対応する構成を行わず、デフォルトで主キーIDが付加されていました。

image.png

その構成も非常に単純で、主キー@TableId(type = IdType.ID_WORKER)に注釈を追加します。

@Data
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 新增的时候update也有值
    private Date updateTime;
}

アイデアエディターでは、Ctrlキーを押しながら左クリックして、IdTypeのいくつかの列挙値を表示できます。

「Mybatis-plus」主キーIDの生成、フィールドの自動入力

AUTO
NONE
INPUT
UUID
ID_WORKER
ID_WORKer_STR

この19ビット値のmpの生成については、スノーフレークアルゴリズムを使用して詳細を確認できます。

SnowflakeはTwitterのオープンソースの分散ID生成アルゴリズムであり、その結果、長いIDが生成されます。

核となるアイデアは、ミリ秒数として41ビット、マシンIDとして10ビット(5ビットはデータセンター、マシンIDの5ビット)、ミリ秒以内のシリアル番号として12ビットを使用することです(つまり、各ノードはミリ秒4096ID)、最後に符号ビットがあり、常に0です。

第二に、mpは自動充填を実現します

データベースを操作するときの一般的な操作もあります。これは、一般的なcreate_time、update_timeなど、いくつかのフィールドへの入力です。入力方法は同じです。

毎回手動で充填するだけでなく、自動で充填することもできます。また、MPで自動入力を設定するのに必要な手順は2つだけです。

1.コメントを追加する

@TableField(fill = FieldFill.INSERT)、@ TableField(fill = FieldFill.INSERT_UPDATE)。

@Data
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)        // 新增的时候填充数据
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 新增或修改的时候填充数据
    private Date updateTime;
}

2.カスタム実装クラスMyMetaObjectHandler

ここでは、実装クラスを自分で作成する必要があります

@Component //此注解表示 将其交给spring去管理
public class MyMetaObjectHandler implements MetaObjectHandler {
    @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);
    }
}

ちなみに、データベーステーブルに対応するフィールドcreate_timeとupdate_timeを追加してください。追加した後、試してみることができます。最初にテストデータを追加しましょう。

//    新增
    @Test
    void addUser() {
        User user = new User();
        user.setName("老王");
        user.setAge(66);
        user.setEmail("[email protected]");
        userMapper.insert(user);
    }

正常に実行された後、データベーステーブルを表示します。

「Mybatis-plus」主キーIDの生成、フィールドの自動入力

追加すると、両方のフィールドが時間で埋められます。

これで、更新操作のみを実行する場合、update_timeのみが更新されます。

//    修改
    @Test
    void updateUser() {
        User user = new User();
        user.setId(1342322873243996161L);
        user.setName("老王修改后");
        userMapper.updateById(user);

    }

「Mybatis-plus」主キーIDの生成、フィールドの自動入力

結果は正しいです。

おすすめ

転載: blog.csdn.net/doubututou/article/details/111684254