サブライブラリーサブテーブルMyBatisの使用についてのトーク

サブライブラリー

時々、テーブルの一部の便宜のためにサブライブラリーは、グローバルライブラリーと呼ばれるすべてのライブラリに関する情報を格納する必要がある場合。以下のような:ユーザーのすべてのユーザーを格納するテーブル。

この時点で、アイデアデータベースは、ライブラリがNの複数に分割されているグローバルライブラリとビジネスライブラリー、ビジネスライブラリのサブライブラリーに分割され、グローバルライブラリは、単に開発を容易にするために、個々のテーブルを置きます。

私たちはグローバルDAOを必要とする。この時間は、我々はMyBatisのDAOのうちの2つをサポートする必要があります

二DAO(bizDaoとglobalDao)は2 sqlSessionFactory、bizSqlSessionFactoryとglobalSqlSessionFactoryと二つのマネージャーのTransactionManagerを必要とします

指定されたサービスのデータベースには、動的なデータソースを要求します

サブライブラリープロジェクトは、複数のデータベースを持っている、問い合わせるべきライブラリを決定するためにあなたの要求に応じて動的にMyabtisに割り当てられているデータソースを指定するために、複数のデータソース(データソース)があります

春は継承できAbstractRoutingDataSource書き換えインターフェース(determineCurrentLookupKey)のビジネスニーズ(ライブラリ1,2,3,4 ...)に応じて、現在のdbkeyを返します。

グローバルライブラリとの事マネージャのビジネスライブラリー

物事がベースのサービスであるため、それはまた、サービスの種類に応じて、サービスおよびグローバルサービスビジネスサービスに(ThreadLocalのにグローバルなプロセスとAOPの勧告を)お勧めします

実施PlatformTransactionManagerのインターフェース、インターフェースをgetTransaction()(ThreadLocalの上記電流から何かを得るためにマネージャ)動的オブジェクト指定されたマネージャを返すことができる方法を

質問:なぜAbstractRoutingDataSource複数のデータソースのものが動的構成マネージャを必要としませんか?

概要:ビジネスライブラリとグローバルライブラリ二つの異なるデータソースを持って、春の継承されたデータソースのビジネスライブラリAbstractRoutingDataSourceを

ばねは(のみbizSqlSessionFactory RoutingDataSourceの点でデータソースNで除算されるデータソースのコレクションを有しRoutingDataSource

グローバルglobalSqlSessionFactoryはまた、bizSqlSessionFactoryときAbstractRoutingDataSource設定を削減しながら、そうするためのプロパティが、開発は直感的ではありません。

ポイントテーブル

ライブラリ上のアイデアのポイントは、動的DateSourceとのTransactionManagerを割り当てられ、

シートスコア:インターセプタはMyBatisの中のテーブル名の動的な変化を記述することです

1.インターセプター

内部SqlSessionFactoryBean プライベート・インターセプター[]プラグインは、属性がインターセプタを設定することができます

インターセプタの当社独自の定義は、実装するインターセプタインタフェースを

インタフェースは、次のコメントを追加する必要があります

@Intercepts({@Signature(タイプ= StatementHandler.classは、方法は= "準備"、引数= {Connection.class })})

我々は、動的SQLおよびSQLの解析を変更する必要が迎撃2.

@Intercepts({ 
    @Signature(タイプ = StatementHandler。クラス、メソッド= "準備"、引数= {接続。クラス})
})
パブリック クラス MybatisInterceptorが実装インターセプタ{ 
    
    @Override 
    パブリックオブジェクトインターセプト(呼び出しの呼び出し)がスローされたThrowable {
         場合(呼び出しを.getTarget()のinstanceof StatementHandler){ 
            RoutingStatementHandlerハンドラ = (RoutingStatementHandler)invocation.getTarget();
            // 通过反射拿到声明对象
            StatementHandlerデリゲート=(StatementHandler)ReflectUtil.getFieldValue(ハンドラ、 "デリゲート" )。
            BoundSql boundSql = delegate.getBoundSql()。
            文字列のSQL = boundSql.getSql()。
            ストリングpageSql = SQL + "リミット1"。// 操作SQL
             // 再通过反射把新SQL设置进去 
            ReflectUtil.setFieldValue(boundSql、 "SQL" 、pageSql)。
        } 
        戻りinvocation.proceed()。
    }

MyBatisの4つのオブジェクト、および原則プラグイン

おすすめ

転載: www.cnblogs.com/ssskkk/p/11109597.html