悪友である Mybatis と Mybatis-plus について簡単に説明しましょう。

序文

落とし穴に陥った個人的な経験ですが、欠点についてさらにアドバイスをお願いします。

文章

Mybatis-plus の公式 Web サイトでは、この古典的な始まりを誰もがよく知っていると思います。

mp (Mybatis-plus、後で呼びます) は Mybatis の強力なパートナーであると主張しており、開発効率を向上させるために Mybatis と協力するために生まれました。それでは、開発プロセス中に親密になることは本当に可能ですか?彼らは何に注意すべきでしょうか?

1. Mybatis-plus の Xiaozao ——フィールド アノテーション @TableField

データベース テーブルのフィールド名が対応するエンティティ クラスの属性名と異なる場合、mp は@TableFieldアノテーションを使用してそれを宣言します。

 これは間違いなく非常に便利で、mp を使用してデータベースを操作するときに、テーブルのフィールドとエンティティ クラスの属性名のマッピング関係を気にする必要がありません。ただし、mp が使用できる Mybatis が必ずしも動作するとは限りません

@TableField は Mybatis の XML ステートメントにマッピング関係を提供できないため、Mybatis は XML で <resultMap> を構成してマッピング関係を指定する必要があります。

2. Mybatis-plusの自動生成戦略

これはおそらく、あまりにも長い間プロジェクトに取り組んでいなかった後に犯した間違いです。mp には、一意の ID を生成するスノーフレーク アルゴリズムなど、優れた自動生成戦略があります。自動的に生成する必要がある属性をフィールドで宣言する必要があります

    // 主键
    @TableId(value = "pid", type = IdType.ASSIGN_ID)
    private String pid;

    // 其他需要自动生成的字段属性
    @TableField(value = "create_time", fill = FieldFill.INSERT_UPDATE)
    private Date createTime;

次に、他の属性値に対応するポリシーを設定しますMetaObjectHandler インターフェースの下に insertFill メソッドと updateFill メソッドを実装して、それぞれフィールド値を挿入または更新するときの生成戦略を構成する必要があります

/**
 * @author 1.
 * @version 1.0
 * @description:  mybatis-plus属性字段自动填充处理类
 * @date 2023/7/28 17:35
 */
@Component
public class AutoFill2FieldsHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("publishTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("publishTime", new Date(), metaObject);
    }
}

また、学習の過程で、フィールドの型や属性の型が一致せず生成できない、主キーの自動インクリメントの設定が有効にならないなど、MP の ID 生成戦略に悩まされている人が多かったことがわかりました。 。

最初の質問では、主キー フィールドのタイプと対応する属性のタイプは両方とも文字列であるため、生成と挿入はスムーズです

2 番目の質問については、このブロガーの記事を参照してください: @TableId(type = IdType.AUTO) は有効になりませんicon-default.png?t=N6B9http://t.csdn.cn/JiF0q

3. Mybatis-plusとMybatisの注意すべき共通点:データベースのキーワード競合問題

mp を使用してテーブル データ クエリ操作を実行していたときに、この問題が発生しました。そのとき、table に対応するエンティティ クラスに desc という名前の属性がありました。後でテストを実行すると、生成された SQL ステートメントが間違っていて、異常を報告する

Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; xxxxx..

 SQL 構文エラー。確認後に見つかり、解決されました。こちらの記事をご覧いただきありがとうございます:

Mysql キーワードとの競合icon-default.png?t=N6B9http://t.csdn.cn/Vgbns

4. MybatisのマッピングインターフェースをSpringコンテナにエレガントに追加する方法

ここで、Mybatis の XML ファイルはインターフェイスとのマッピング関係を確立するため、呼び出しが容易になり、XML 内の SQL ステートメントを確実に実行できることを述べておきます。Mybatis が Spring と統合されてからは、自動アセンブリ原理により開発効率が大幅に向上しました。マッピング インターフェイスを Spring コンテナに追加するには、次の 2 つの方法があります。

1. @Mapper アノテーションをインターフェースに追加します

@Mapper
public interface MyEntityMapper extends BaseMapper<MyEntity> {
    //...
}

2. @MapperScan アノテーションをスタートアップ クラスに追加します(マッピング インターフェイスの @Mapper はこの時点で追加するかどうかを選択できます)。

@SpringBootApplication(scanBasePackages = {"org.limit.study"})
@MapperScan(basePackages = {"指定映射接口所在的包路径"})
public class ServeApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServeApiApplication.class, args);
    }
}

ただし、この時点でマッピングインターフェイスの @Mapper アノテーションが追加されていない場合、自動インジェクションは完了できますが、Idea のプロンプト機能が赤色になるため、手動で無視するだけで済みます

あとがき

上記はすべて最近の個人プロジェクト開発であり、今後も更新され続けます。学習とは、常に前に戻って古い知識を拾うことが必要なプロセスです!プロジェクトが徐々に改善された後、オープンソース化される予定ですので、ご期待ください!スターとして参加することは大歓迎です~

おすすめ

転載: blog.csdn.net/Ccc67ol/article/details/132047321