2012-03-23 18 views
0

私は検索をたくさん行っていますが、答えはまだ見つかりませんでした。プロパティファイルからスキーマ名を取得

問題のバックログ:スキーマのテストコピー(たとえば、schema1、schema2、schema1_test、schema2_testはすべて同じURLにあります)を含む1つのURLに複数のDBスキーマがあります。私は、各スキーマのどのバージョンがプロパティファイルを介して構成可能に使用されるようにしようとしています。

(私は問題を説明します自分の無知や間違いをお許しください!)私の春の設定ファイルでそう


、である私たちは、春とMyBatisのを使用していて、残念ながら、私は両方に新たなんです下に格納され (私は唯一の「configLocation」プロパティを追加し、後で「sqlSessionFactoryBeanName」プロパティを追加しました)

<!-- define the SqlSessionFactory --> 
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="typeAliasesPackage" value="com.example.domain" /> 
    <property name="configLocation" value="classpath:mybatisConfig.xml" /> 
</bean> 

<!-- scan for mappers and let them be autowired --> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.example.something.persistence" /> 
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 
</bean> 


マイmybatisConfig.xml(:SRC /メイン/リソース/の下に保存され、私は、次のスニペットを持っています/ src/mクラスパス上にある必要がありますAIN /リソース、)同じフォルダに

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
<properties resource="sqlmapconfig.properties" /> 
</configuration> 


sqlmapconfig.properties()

schema1=schema1_test 


そして私はマッパーファイルのいずれかでプロパティを参照してみてくださいin com.example.something.persistence:

私がMavenでビルドしようとすると、 st:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'schema1' in 'class java.lang.Long' 

ご迷惑をおかけして申し訳ございません。私は直接のプロパティを読み取ろうとする上であきらめたとJavaのルート

からで、それを渡してダウンした

+0

"/ src/main/resourcesの下に保存されていますが、これはクラスパス上にある必要があります。" <==これが正しいと確認できますか?クラスパスに "/ src/main/resources"というフォルダがありますか、それともどこかにコピーしていますか? –

+0

ええ、クラスパスにあります。それはtomcatサーバに展開されるwebappです。 [編集 - 間違って投稿] クラスパス部分を取り出して相対URLリンクとして残しても(同じフォルダにあります)、何も変更されません。 {$ schema1}を読んで問題のある箇所を絞り込むことができる中間段階はありますか? – witnessmenow

+0

configのプロパティファイルを指定していますが、マッパーファイルのプロパティ参照を使用しています。私が知る限り、プロパティはmappersファイルに引き継がれません。 どのデータベースを使用していますか? JDBC URLにスキーマを指定できますか? –

答えて

3

は、だから私は、マッパーファイルのマップする「のParameterType」を変更しなければならなかった

<select id="test" resultType="result" parameterType="map"> 
    select ${schema1}.table.col 
    from ${schema1}.table where number=#{number} 
</select> 

そして

import org.apache.ibatis.annotations.Param; 

... 

public List<result> test(@Param("number") long number, @Param("schema1") String schema1); 

を次のようにJavaのマッパーコードを編集したが、これは誰かに役立ちます願っています。

ノート&参考文献:

#{}対$ {}の使用に慎重に、違いがhere

を説明し、私は似ていたhere

0

から取っwwasどのように複数のparamsを使用する方法問題を解決し、カスタムLanguageDriverを作成してこれを行うことができました。 mybatisの言語ドライバにはいくつかのフック方法があります。興味深いのはcreateSqlSourceで、定義されたすべてのSQL文をロードするときに呼び出されます。これにより、この時点でステートメントを変更することができます。これを行う最善の方法は、xmlファイルと注釈で定義されたクエリを解釈するデフォルトのドライバであるXMLLanguageDriverを拡張することです。

最初に行うべきこと(SCHEMA_MARKERが、以下に提示されたカスタムlaguageドライバクラスから輸入された)スキーマに置き換えられますいくつかのマーカーを追加することで、あなたのクエリを変更することです:今、私たちは、カスタムを作成

public interface MyMabatisMapper { 
    @Select("select * from " + SCHEMA_MARKER + ".myTable ") 
    List<MyObjects> getObjects(); 
} 

指定されたスキーマでマーカを置き換える言語ドライバです。

例:私たちは私たちの言語ドライバにコンストラクタを介して私たちのスキーマの名前を渡された上

public class QueriesModifyingDriver extends XMLLanguageDriver { 

    public static final String SCHEMA_MARKER = "###MY_SCHEMA###"; 
    public static final String SCHEMA_MARKER_PATTERN = SCHEMA.replaceAll("#", "\\#"); 

    private final String schemaName; 

    // NOTE: Name of the schema passed in constructor !!! 
    public QueriesModifyingDriver(String schemaName) { 
    this.schemaName = schemaName; 
    } 

    @Override 
    public SqlSource createSqlSource(org.apache.ibatis.session.Configuration configuration, String script, Class<?> parameterType) { 
    String modifiedScript = script.replaceAll(SCHEMA_MARKER_PATTERN, schemaName); 

    return super.createSqlSource(configuration, modifiedScript, parameterType); 
    } 
}; 

。これで、mybatisにこの言語ドライバをインストールするだけです。以下の例では、注釈の設定を使用してSpringが使用されることを前提としています。スキーマ名がプロパティmy.schema.nameから読み込まれますが、それは当然の任意の供給源から得ることができます。

@Bean 
    public SqlSessionFactory mybatisSqlSessionFactory(DataSource dataSource, @Value("${my.schema.name}") String schemaName) throws Exception { 

    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 
    sqlSessionFactoryBean.setDataSource(dataSource); 

    org.apache.ibatis.session.Configuration mybatisConfiguration = sqlSessionFactoryBean.getObject().getConfiguration(); 

    QueriesModifyingDriver queriesModifyingDriver = new QueriesModifyingDriver(schemaName); 
    mybatisConfiguration.getLanguageRegistry().register(queriesModifyingDriver); 

    mybatisConfiguration.setDefaultScriptingLanguage(QueriesModifyingDriver.class); 

    return sqlSessionFactoryBean.getObject(); 
    } 

これは、すべてのqueryonly一度(起動時に)言語ドライバプロセスので、非常に効果的な方法であることに注意してくださいとこの変更されたクエリは、後でmybatisによって再利用されます。

関連する問題