2012-03-23 5 views
0

현재 검색을 많이 해왔지만 아직 답변을 찾을 수 없다는 문제가 있습니다.등록 정보 파일에서 스키마 이름 가져 오기

Backgorund 문제 : 스키마의 테스트 복사본 (예 : schema1, schema2, schema1_test, schema2_test가 모두 같은 URL에 있음)을 포함하여 하나의 URL에 여러 개의 DB 스키마가 있습니다. 각 스키마의 버전을 속성 파일을 통해 구성 가능한 것으로 사용하려고합니다.

(그래서이 문제를 설명 할 나의 무지 나 실수를 용서하십시오!) 내 스프링 설정 파일에 따라서


, 인 우리는 봄과 MyBatis로를 사용하고 불행하게도 나는 모두에 새로운 해요 /의 SRC/메인/자원에 저장, 나는 다음과 같은 조각이있다 : (난 단지 "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/m 같은 폴더에 클래스 경로에 있어야 아인/자원)

<?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 


내가 매퍼 파일 중 하나에 참조에게 재산을 시도 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' 

의견을 보내 주시면 대단히 감사하겠습니다. 내가 직접 속성을 읽으려고에 포기하고 자바 경로

에서 건네 내려 갔다

+0

"/ src/main/resources에 저장되며 클래스 경로에 있어야합니다."<==이 경우를 확인할 수 있습니까? 클래스 경로에 "/ src/main/resources"폴더가 있습니까? 아니면 어딘가에 복사하여 빌드 할 수 있습니까? –

+0

네, classpath에 있습니다. 그것은 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); 

희망을 다음과 같이

그리고는 자바 매퍼 코드를 편집했다.

주 & 참고 : # {} 대 $ {}의 사용에

주의는 차이가 어떻게 여러 PARAMS을 사용하는 here

0

에서 복용 wwas 내가 유사한했다

here 설명 문제를 해결하고 사용자 정의 LanguageDriver을 작성하여이를 수행 할 수 있습니다. mybatis의 언어 드라이버에는 몇 가지 방법이 있습니다. 흥미로운 것은 createSqlSource으로 정의 된 모든 SQL 문을로드하는 동안 호출됩니다. 이렇게하면이 시점에서 명령문을 수정할 수 있습니다.이를 수행하는 가장 좋은 방법은 xml 파일과 주석에 정의 된 쿼리를 해석하는 기본 드라이버 인 XMLLanguageDriver을 확장하는 것입니다.

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

이제 우리는 사용자 정의를 만듭니다 할

우선 (SCHEMA_MARKER은 아래에 제시되어 사용자 정의 laguage 드라이버 클래스에서 가져옵니다) 스키마로 대체됩니다 일부 마커를 추가하여 쿼리를 수정하는 것입니다 주어진 스키마로 마커를 대체 할 언어 드라이버.

예 : 우리는 우리의 언어 드라이버 생성자를 통해 우리의 스키마의 이름을 통과보다도

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에 의해 재사용됩니다.

관련 문제