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的接口。注意是,只有是接口的将会被扫描注册,如果是具体的类将会被忽略。