我有一个用MyBatis映射器文件编写的sql,它是这样的:
<select id="somesql">
select a,b,c from tbl_name where d = ?
</select>
d
的占位符值应该是在名为Constants.java
的文件中声明的常量:
public static final String d = "d_value";
如何使用值替换占位符而不实际传递参数
<select>
构建?我试过了#{com.pkg.name.Constants.d}
,但它没有用。
没有硬编码!!!
答案 0 :(得分:10)
<select id="getConvenienceStoreList" resultType ="Store">
SELECT * FROM Store
WHERE type = ${@foo.product.constant.StoreType@CONVENIENCE_STORE}
ORDER BY id
LIMIT #{start}, #{limit}
</select>
答案 1 :(得分:2)
根据MyBatis的开箱即用行为,据我所知,你不能。
您可以尝试编写interceptor for the ParameterHandler并在那里注入值,但这并非总是可行,因为您只能在参数处理程序上使用两种方法:
getParameterObject
,它返回发送给查询的参数(可以是常量,字符串,映射,自定义对象,甚至是null,因为您的示例不是您发送的情况)参数)setParameters
我猜你可以尝试设置参数,如果你知道它在准备好的语句中的位置(大多数时候你可能没有)。我的建议是将其作为参数传递给您的查询。 MyBatis的拦截器功能没有很好的记录,所以你可能从一开始就没有得到正确的工作组合,你最终会遇到比它更值得的麻烦。