如何在 MyBatis XML 文件中动态更改数据库名称?
How to change the database name dynamically in MyBatis XML file?
我正在使用 Spring Boot with MyBatis。我在一个映射器 XML 文件中有以下查询。
<select id="someFunction" resultMap="someResultMap">
SELECT *
FROM p LEFT JOIN anotherDatabase.table AS q ON p.id = q.id
</select>
实际上 "anotherDatabase" 在我的查询中是硬编码的,因为我不想只为这个查询添加另一个数据源。但是我怎样才能动态地创建这个 "anotherDatabase" 名称(也许在某些属性文件中配置它)因为它可能会在部署的不同环境中发生变化?
虽然丑陋的解决方案,但您可以使用参数:不是传统的 JDBC/SQL 参数 #{schema}
,而是直接参数 ${schema}
。看到那里的美元符号 ($) 了吗?
使用直接参数 ${param}
时,您可以将任何内容插入 SQL。如果您愿意,甚至可以是完整的 SQL 语句。谨慎使用,仅作为最后手段。
请仔细考虑将直接参数插入 SQL 容易受到 SQL 注入 的影响。您需要仔细控制 schema
property/parameter 的值,使其不来自用户或任何外部来源。如果你这样做,就可以放心使用了。
但是,更简洁的解决方案是使用单独的数据源。唯一的缺点是,如果您需要包含来自两个数据源的表的事务,您可能需要启用两阶段提交。
我正在使用 Spring Boot with MyBatis。我在一个映射器 XML 文件中有以下查询。
<select id="someFunction" resultMap="someResultMap">
SELECT *
FROM p LEFT JOIN anotherDatabase.table AS q ON p.id = q.id
</select>
实际上 "anotherDatabase" 在我的查询中是硬编码的,因为我不想只为这个查询添加另一个数据源。但是我怎样才能动态地创建这个 "anotherDatabase" 名称(也许在某些属性文件中配置它)因为它可能会在部署的不同环境中发生变化?
虽然丑陋的解决方案,但您可以使用参数:不是传统的 JDBC/SQL 参数 #{schema}
,而是直接参数 ${schema}
。看到那里的美元符号 ($) 了吗?
使用直接参数 ${param}
时,您可以将任何内容插入 SQL。如果您愿意,甚至可以是完整的 SQL 语句。谨慎使用,仅作为最后手段。
请仔细考虑将直接参数插入 SQL 容易受到 SQL 注入 的影响。您需要仔细控制 schema
property/parameter 的值,使其不来自用户或任何外部来源。如果你这样做,就可以放心使用了。
但是,更简洁的解决方案是使用单独的数据源。唯一的缺点是,如果您需要包含来自两个数据源的表的事务,您可能需要启用两阶段提交。