如何将方法应用于MyBatis中的参数

时间:2012-02-07 23:09:57

标签: db2 mybatis ognl

在阅读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> 

在阅读thisthis之后,我可以发表一些意见。

  1. 使用upperconcat'||''+'等SQL函数在DB2中执行转换杀死性能
  2. 我总是可以包装映射器或在服务层中公开细节,但这看起来很混乱
  3. 我想要的是能够做一些像......

    <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进行某些表达式评估。例如,if${}表达式使用OGNL但#{}似乎不会出现,除非有某种方法可以欺骗它。

2 个答案:

答案 0 :(得分:12)

绑定

MyBatis允许使用<bind/>在上下文中创建方法和属性的值。

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


实施例

使用bind的示例:

<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>

来源

答案 1 :(得分:1)

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