春の学習メモ - Mybatis の Mapper および MapperScan アノテーションと、マッパーではない一部のインターフェイスもマッパーに処理されて Bean として作成され、起動時にエラーが報告されます。

mybatis @MapperScan の使用体験について

1. Mybatis-spring-boot-starter を参照する必要があります。参照しないと、スキャンして有効にすることができません。mybatis-plus の mybatis-plus-boot-starter で置き換えることができます。

2. インターネットから MapperScan を検索すると、basePackage を通じて複数のパッケージをスキャンするように指定していることがほとんどで、それ自体は問題ありませんが、完全な解決策ではありません。その理由は次のとおりです。

(1) スキャンされたパッケージ名が上位レベルの場合、マッパーではない一部のインターフェイスもマッパーに処理されて Spring Bean として作成され、システムの起動に失敗しますが、これは絶対にあり得ません。

(2) パッケージの範囲を絞り、マッパーに対応するパッケージのみを設定するのが最善ですが、マッパーを含むパッケージをすべてリストすると欠点もあります

- まず、リストが長くなります。いくつかの問題を解決するにはワイルドカードを使用しますが、バッグはいくつかの統一ルールを満たす必要があります。また、さまざまなレベルの状況に対処することは容易ではありません。

- 次に、マッパー パッケージを追加または調整するたびに @MapperScan に登録する必要があるため、スケーラビリティが低下します。ビジネス コードの変更はフレームワーク コードに影響します。特に複数のモジュールの場合、この問題はますますわかりにくくなります。もう 1 つのモジュールが参照される場合に @MapperScan を構成する必要があるとは誰が考えたでしょうか。

- 3 番目に、依存の原則に違反します。元々、フレームワークはビジネスに依存していませんでしたが、ビジネスの変化によりフレームワークはコードを調整する必要があります。

キーポイント:
3. したがって、問題を解決するには @MapperScan で BasePackage + annotationClass コンポーネントを使用するのが最善の方法だと思います。

(1) すべてのマッパーに @Mapper アノテーションを追加します。マッパー自体は特別なタイプのインターフェイスに属しており、特別な登録を通じて区別する必要があるため、これは合理的です。

(2) 第1条により、basePackageで上位パッケージ名を指定できるようになりました

上記の 2 つにより、一方ではマッパー パッケージの動的な変更の問題が解決されます。ビジネス コードには通常、統一されたパッケージ プレフィックス (通常は com.cortName) が付いているため、これを BasePackage として使用できます。一度設定すれば、その後の変更は影響を受けません。

例:

@MapperScan(basePackages = {
    
    "com.package1", "com.package2"}, annotationClass = Mapper.class)

@Mapper と @MapperScan の 2 つのアノテーションは、 Spring とMybatisの組み合わせで使用されるアノテーションです。

では、これら 2 つのアノテーションの違いは何でしょうか? 見てみましょう

@マッパー

1. 機能: @Mapper をインターフェイス クラスに追加すると、@Mapper アノテーションが付けられたインターフェイスの動的プロキシ クラスが自動的に生成されます。

場所を追加: インターフェイス クラスの上

2. クラスを実装する必要がある各インターフェイスに @Mapper アノテーションを追加しますが、これは比較的面倒です

@MapperScan

1. 機能: 1 つ以上のパッケージ パスを構成し、これらのパッケージ パスの下のクラスを自動的にスキャンし、それらのプロキシ クラスを自動的に生成します。

場所の追加: Springboot スタートアップ クラスの上に追加されます。

2. @MapperScan アノテーションの後、@MapperScan("com.xxx.xx") などのスキャン パッケージをカスタマイズできます。このアノテーションを使用すると、@Mapper アノテーションを 1 つずつ追加する必要がなくなります。

3. @MapperScan には多くの属性があり、最も一般的に使用されるのは次のとおりです。

annotationClass : 这个是基于包下面扫描所有的接口类并注册,也有指定的属性。   
markInterface : 基于包下面扫描所有接口类并注册,也可以指定特殊的接口为父类。
sqlSessionTemplateRef: 在指定使用sqlSessionTemplateRef的情况下,这里有一个或多个的Spring的容器。经常我们会使用一个或多个的数据库.
sqlSessionFactoryRef : 在指定使用sqlSessionFactoryRef的情况下,这里有一个或多个的Spring的容器。经常我们会使用一个或多个的数据库.
​nameGenerator :Spring的容器中,将使用BeanNameGenerator去命名检测到的组件。basePackageClasses : 这是一个安全替代basePackages()作为指定组件的扫描包。包下面的所有接口都将会被扫描。
basepackages : 基于包下面的扫描MyBatis的接口。注意是,只有是接口的将会被扫描注册,如果是具体的类将会被忽略。

おすすめ

転載: blog.csdn.net/qq_43842093/article/details/132639217