Mybatisのベストプラクティスの概要と一般的なフィールドの自動入力

永続層データの保守(追加または変更)を実行する場合、通常、作成時間、変更時間、変更者、および作成を維持するために、create_time、update_time、update_by、create_byなどの非ビジネスフィールドを記録する必要があります。データレコードの人と他の情報。通常の状況では、これらのフィールドに手動で値を割り当てる必要があります。割り当てプロセスも比較的冗長であり、すべてが繰り返し操作されます。

  • 通常、create_timeにはシステムの現在の時刻が割り当てられ、update_timeにはシステム変更操作が実行されたときの現在の時刻が割り当てられます。
  • create_by(作成者)、update_by(変更者)は、現在ログインしているユーザーのユーザー名に割り当てられます
xxxYyyZzz.setUpdateBy("zimug");    //数据记录更新操作人
xxxYyyZzz.setUpdateTime(new Date());   //数据记录更新操作的时间

Mybatis plusは、一度限りの自動割り当て方法を提供します。

1つは、データベーステーブルの構造を調整することです。

例として、mysqlデータベース環境のxxx_yyy_zzzテーブルを取り上げます。元のテーブルフィールドに基づいて、次の4つの一般的なデータメンテナンスフィールドを追加します。

ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `create_by` VARCHAR(64) NOT NULL COMMENT '本条记录创建人';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '本条记录创建时间';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `update_by` VARCHAR(64) NOT NULL COMMENT '本条记录修改人';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '本条记录的修改时间';

次に、一般的なメンテナンス情報の親クラス-自動的に割り当てられたフィールド

特定のデータテーブルの新しい作成および変更情報を維持しているので、必要に応じてエンティティクラスも調整する必要があります。これらの4つのメンバー変数が各エンティティクラスに追加されないようにするために、親クラスBaseColumnsを定義します。

@Data
public class BaseColumns {

  /**
   * 本条记录创建人,insert操作的时候自动为该字段赋值
   */
  @TableField(fill = FieldFill.INSERT 
  private String createBy;

  /**
   * 本条记录创建时间,insert操作的时候自动为该字段赋值
   */
  @TableField(fill = FieldFill.INSERT)
  private LocalDateTime  createTime;

  /**
   * 本条记录更新人,insert或update操作的时候自动为该字段赋值,select = false
   */
  @TableField(fill = FieldFill.INSERT_UPDATE,select = false)  
  private String updateBy;

  /**
   * 本条记录更新时间,insert或update操作的时候自动为该字段赋值,select = false
   */
  @TableField(fill = FieldFill.INSERT_UPDATE,select = false)
  private LocalDateTime updateTime;


}
  • fill = FieldFill.INSERTは、挿入操作中にフィールドに値が自動的に割り当てられることを意味します
  • fill = FieldFill.INSERT_UPDATEは、nsertまたはupdate操作中にフィールドに値が自動的に割り当てられることを意味します
  • select = falseは、Mybatis Wrapper条件ビルダーを使用してクエリを実行するときに、この属性に対応するデータベースフィールドがクエリされないことを意味します。データ変更時間演算子は通常、操作と保守にとってより意味があるため、通常はWebページに表示する必要がないため、通常、選択クエリには含まれません。(このコンテンツは、私たちのマシンのフィールド自動入力に直接関係していませんが、実際のアプリケーションでは意味があります)

三、エンティティクラスの実現

以下のエンティティクラスXxxYyyZzzは、データベースのxxx_yyy_zzzテーブルに対応します。上記の4つの一般フィールドに加えて、xxx​​_yyy_zzzテーブルには他のビジネスフィールドも含まれています。

@Data
@EqualsAndHashCode(callSuper = true)
public class XxxYyyZzz extends BaseColumns {

    //其他的属性字段
}

第四に、自動割り当てのルール

@Component
public class MybastisColumnsHandler implements MetaObjectHandler {

    @Resource
    private JwtTokenUtil jwtTokenUtil;  //我的工具类,用于从Token令牌中获取登陆人信息

    //设置数据新增时候的,字段自动赋值规则
    @Override
    public void insertFill(MetaObject metaObject) {
      this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
      this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

      this.strictInsertFill(metaObject, "createBy", String.class, jwtTokenUtil.getUsernameFromToken());
      this.strictUpdateFill(metaObject, "updateBy", String.class, jwtTokenUtil.getUsernameFromToken());
    }

    //设置数据修改update时候的,字段自动赋值规则
    @Override
    public void updateFill(MetaObject metaObject) {
      this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
      this.strictUpdateFill(metaObject, "updateBy", String.class, jwtTokenUtil.getUsernameFromToken());
    }
}
  • データが追加されると、createTime、updateTime、createBy、およびupdateByが自動的に割り当てられます。つまり、データが初期化されます。
  • データが変更されると、updateTimeとupdateByが自動的に割り当てられます。
  • JwtTokenUtilは、現在ログインしているユーザーJWTTokenから現在ログインしているユーザーのユーザー名を取得するために作成したツールクラスです。(システムで現在のログインユーザー名を取得する方法は私のものとは異なりますが、とにかく取得できます)

5、効果を達成する

たとえば、データが更新されると、次の2行のコードを記述する必要がなく、updateFill(MetaObject metaObject)自動的に完了します。

//xxxYyyZzz.setUpdateBy("zimug");    //数据记录更新操作人
//xxxYyyZzz.setUpdateTime(new Date());   //数据记录更新操作的时间

xxxYyyZzzMapper.updateById(xxxYyyZzz);

同様に、データ挿入操作をinsertFill(MetaObject metaObject)行うと、自動的に実行されます。

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/113247807