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

And*_*ite 3 db2 ognl mybatis

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

<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> 
Run Code Online (Sandbox Code Playgroud)

看完这个这个,我可以发表一些看法.

  1. 使用SQL的功能,如upperconcat'||''+'做变换杀死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> 
Run Code Online (Sandbox Code Playgroud)

这样的事情是可能的,还是第二个最好的解决方案?

更新:似乎MyBatis使用OGNL进行一些表达式评估.例如,if${}表达式中使用OGNL但#{}不会出现,除非有某种方式来欺骗它.

小智 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>
Run Code Online (Sandbox Code Playgroud)

资源


Moi*_*ain 0

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