MyBatis文档展示了一种通过XML配置文件构建SqlSessionFactory
或通过Java代码构建Configuration
对象的方法。它还提到传递属性,这些属性将覆盖XML文件中指定的内容。
我正在尝试使用属性功能来提供除XML配置之外的数据源URL,但没有设置属性。
下面是我使用的配置XML(为了简洁,删除了所有的别名和映射):
<configuration>
<typeAliases>
<typeAlias alias="Item" type="com.example.project.Item"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:C:/path_to_db_file_in_the_filesystem"/>
<property name="username" value="sa"/>
<property name="password" value="sa"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/project/mappers/ItemMapper.xml"/>
</mappers>
</configuration>
XML文件适用于所有内容,但我需要通过Java代码提供url
(通过代码,它是从另一个配置文件获得的,因此必须动态地提供给MyBatis)。我知道我可以在代码中完成这一切,但这将是不必要的工作,所以我想避免这种路线,如果可能的话。
根据手册中的描述,我从XML文件中删除了url
行,并产生了以下代码:
String resource = "com/example/project/MyBatisConfiguration.xml";
Reader reader = Resources.getResourceAsReader(resource);
Properties props = new Properties();
props.setProperty("url", url);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader, props);
代码构建SqlSessionFactory
,但我得到"url不能为空"异常,表明该属性未成功覆盖。我认为属性的名称应该是一种特殊的格式,但是我找不到那种格式。
提前非常感谢所有的帮助。
在配置XML中,您可以为数据源URL插入一个占位符,如下所示:
<property name="url" value="${url}"/>
则SqlSessionFactoryBuilder
的build()
方法将XML中的"${url}"
替换为props
提供的属性"url"
的值