1つは、主キーIDの生成です。
通常、このデータの一意のIDとして、データベーステーブルに主キーIDがあります。
一般的な方法
- データベースの自動拡張は非常に一般的であり、データベース全体で唯一の拡張になる可能性があります。idは自然にソートされるため、ソートを伴う操作に非常に便利です。
- UUIDの自動拡張は単純ですが、サブテーブルなどの操作ではより厄介です。2番目のシートにデータを挿入するときは、前のシートの最後のデータのIDを取得する必要があるためです。UUIDは、ランダムで一意の値を持つたびに異なりますが、ランダムであるため、並べ替えはありません。
- redisredisは、redisのアトミック操作を使用してIDを生成するためにも使用できます。利点は、データベースに依存せず、パフォーマンスが優れていることですが、redisを導入するとある程度の複雑さが生じます。
mybatis-plus way
実際、以前にmpを使用してデータを追加したときは、対応する構成を行わず、デフォルトで主キーIDが付加されていました。
その構成も非常に単純で、主キー@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のいくつかの列挙値を表示できます。
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);
}
正常に実行された後、データベーステーブルを表示します。
追加すると、両方のフィールドが時間で埋められます。
これで、更新操作のみを実行する場合、update_timeのみが更新されます。
// 修改
@Test
void updateUser() {
User user = new User();
user.setId(1342322873243996161L);
user.setName("老王修改后");
userMapper.updateById(user);
}
結果は正しいです。