背景
最近、プロジェクトが開始される予定であり、データ移行プログラムを開発する必要があります。プログラムの主な機能は、1つのデータベースでデータを照会し、一連の処理後に別のデータベースにインポートすることです。開発の利便性と速度を考慮します。当然、私はそれを春やマイバティスと統合することを考えました。 MyBatisの自動コード生成を使用しても、DAO層の多くの開発を節約できます。
統合のピット
以前のプロジェクト:私は以前にこの種の同様のプログラムを行ったことがあるので、SpringとMybatis統合の構成を直接使用して変更しました。以前の統合構成は次のとおりです。
1.データベースURLとユーザー名とパスワードの構成可能性を考慮して、この情報をプロパティファイルに入れます。 Spring構成ファイルで使用されます
<コンテキスト:プロパティプレイスホルダーlocation = "classpath:config.properties" />
2.スプリング構成ファイルのMyBatisとSpringの統合構成はこのようなものです
<bean id = "sqlsessionfactory"> <プロパティ名= "datasource" ref = "dataSource" /> < /bean> <bean> <bean> <beant name = "basepackage" value = "com.lagou.chat.record.transfer.dao" />> < /bean>
上記の構成に問題はありません。したがって、構成を新しいプロジェクトにコピーするだけです
現在のプロジェクト:古いプロジェクトの構成をコピーしますが、新しいプロジェクトは2つのデータベースに接続する必要があるため、自然に2つのデータソース(レコードとIM)が必要であるため、古い構成は次のように変更されます。
1.プロパティファイルを使用する構成は変更されていません
2。以前は、データソース(sqlsessionFactory)が1つしかなかったため、<プロパティ名= "sqlsessionfactory" ref = "sqlsessionfactory"/>は、mapperscannoconfigurerで構成されていませんでした。デフォルトのSQLSessionFactoryが使用されるためです。しかし、今では2つのデータソースがありますが、それらを指定しないと間違いなく混乱が生じます。そのため、構成は次のように変更されます
<bean id = "record_sqlsessionfactory"> <プロパティ名= "dataSource" ref = "record_datasource" /> < /bean> <bean id = "config1"> <パイプロパティname = "basepackage" value = " /> < /bean> <bean id = "im_sqlsessionfactory"> <プロパティ名= "datasource" ref = "im_datasource" /> < /bean> <bean id = "config2"> <プロパティ名= "basepackage" value = "com.xxx.util.rollback.im.im.dao ref = "im_sqlsessionfactory" /> < /bean>
その結果、新しいプロジェクトを実行すると、Spring構成ファイルの$ {jdbc.url}、$ {jdbc.name}などのプロパティをプロパティの指定された値に置き換えることができません。最初は、当然、スプリングとマイバティスの統合が原因であるとは思っていなかったため、スプリング構成ファイルが間違っているかどうか、プロパティファイルが間違っているかどうか、プロパティファイルが参照されていないか、プロパティファイルがクラスパスディレクトリにコンパイルされていないかなどを確認し続けます。私はインターネットに頼らなければなりませんでした。最後に答えを見つけました
修正方法:構成を次のように変更し、問題は解決されました。
<bean id = "record_sqlsessionfactory"> <プロパティ名= "datasource" ref = "record_datasource" /> < /bean> <bean id = "config1"> <プロパティname = "basepackage" value = "com.xxx.util.rollback.record.dao" value = "Record_sqlSessionFactory" /> < /bean> <bean id = "im_sqlsessionfactory"> <プロパティ名= "dataSource" ref = "im_datasource" /> < /bean> <bean> <bean> <bean> " name = "sqlsessionfactorybeanname" value = "im_sqlsessionfactory"/> </bean>
SQLSessionFactoryプロパティをSQLSessionFactoryBeanNameに変更することです。もちろん、REFも価値に変更する必要があります。 SqlSessionFactoryBeanNameプロパティは文字列型だからです
理由
春に自動スキャンにorg.mybatis.spring.mapper.mapperscannerconfigurerを使用する場合、sqlsessionfactoryが設定されている場合、プロパティホルデントファイガーは無効である可能性があります。
これは、MapperScannerConconigurerが実際には、Beanの定義段階を解析しているためです。現時点でSQLSessionFactoryを設定すると、一部のクラスが事前に初期化されます。現時点では、PropertyPlaceHolderConfigurerには定義の変数を置き換える時間がなく、式が文字列としてコピーされました。ただし、SQLSessionFactoryプロパティが設定されていない場合、SpringのSessionFactory NameがSQLSessionFactoryでなければならないことを確認する必要があります。そうしないと、自動的に注入されません。
上記は、<Context:Property-PlaceHolder>を使用したときにMyBatisを統合する春の落とし穴です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!