4

在阅读了Mapper XMLs之后,我不禁想知道如何将一些常见的转换应用于参数。例如...

<select id="selectPerson" parameterType="String" resultType="hashmap">
  <!-- #{name} should always be upper case and have a trailing % -->
  SELECT * FROM PERSON WHERE FIRST_NAME like #{name} 
</select> 

在阅读了这个这个之后,我可以做一些观察。

  1. 使用诸如upperorconcat'||'or之类的 SQL 函数'+'进行转换会降低 DB2 的性能
  2. 我总是可以包装映射器或在服务层中公开细节,但这看起来很乱

我想要的是能够做类似的事情......

<select id="selectPerson" parameterType="String" resultType="hashmap">
  <!-- #{name} should always be upper case and have a trailing % -->
  SELECT * FROM PERSON WHERE FIRST_NAME like #{name.upperCase() + '%'} 
</select> 

这样的事情是否可能或第二好的解决方案是什么?

更新:似乎 MyBatis 使用 OGNL 进行一些表达式评估。例如,ifand${}表达式使用 OGNL,但#{}除非有某种方法可以欺骗它,否则它似乎不会。

4

2 回答 2

14

绑定

MyBatis 允许使用<bind/>.

Bind 在当前语句的范围内创建一个新变量。绑定值的 OGNL 语句可以使用传入的_parameter对象来计算一个新的绑定值,然后 MyBatis 可以使用该值来构造准备好的语句。


例子

您使用绑定的示例:

<select id="selectPerson" parameterType="String" resultType="hashmap">
  <!-- #{name} should always be upper case and have a trailing % -->
  <bind name="nameStartsWith" value="_parameter.getName().upperCase() + '%'"/>
  SELECT * FROM PERSON WHERE FIRST_NAME like #{nameStartsWith} 
</select>

来源

于 2013-06-07T01:44:25.633 回答
0

我也遇到了同样的问题。但我没有找到任何解决方案。所以我不得不预处理#{name}来自调用函数的参数。

于 2012-02-08T02:52:14.723 回答