2012-03-23 30 views
0

我遇到了一个问题,我一直在做很多搜索但仍未找到答案。我们在一个URL包含多个数据库模式,包括模式的测试副本(例如,模式1,模式2,模式1_测试,模式2_测试都在同一个网址)。我试图通过一个属性文件来配置每个模式的哪个版本。从属性文件中获取模式名称

我们正在使用Spring和MyBatis的,可惜我是新来的两个(所以请原谅我的无知或任何错误我做描述了这个问题!)


所以在我的Spring配置文件,这是在/ 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 /米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 


我尝试引用属性映射器中的一个文件在com.example.something.persistence:

<select id="test" resultType="result" parameterType="long"> 
    select ${schema1}.table.col 
    from ${schema1}.table 
</select> 

当我尝试用Maven构建失败一个TE 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”,或者你的内部版本是否在某处复制? – 2012-03-23 15:07:41

+0

是的,它在类路径上。它是一个将被部署到tomcat服务器的web应用程序。 [编辑 - 错误提交] 即使我拿出classpath部分并将其保留为相对url链接(它们在同一个文件夹中),它不会改变任何内容。 是否有任何中间步骤可以读取{$ schema1}来缩小问题的位置? – witnessmenow 2012-03-23 15:19:46

+0

我发现你指定了配置的属性文件,但在你的映射器文件中使用了属性引用。据我所知,这些属性不会传递给映射器文件。 你使用了哪个数据库?你能在你的JDBC URL中指定模式吗? – 2012-03-23 15:53:39

回答

3

我放弃了试图直接读取性能和走下从Java路线

在路过它,所以我不得不改变“参数类型”是在映射文件中的地图

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

和编辑的Java代码映射如下

import org.apache.ibatis.annotations.Param; 

... 

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

希望这可以帮助别人。

注&参考:

仔细对使用$ {} VS#{},差异来解释here

如何使用多个PARAMS从here

0

wwas服用我有类似的问题并设法通过创建自定义LanguageDriver来做到这一点。 mybatis中的语言驱动程序几乎没有钩子方法。有趣的是在加载每个定义的sql语句时调用的那个是createSqlSource。这允许您在此处修改语句。做到这一点的最好方法是扩展XMLLanguageDriver,这是默认驱动程序,用于解释在xml文件和注释中定义的查询。

的第一件事要做的就是通过添加一些标记,其将与架构(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重用。 “