是否可以在我的batis“select”中使用temp变量?

时间:2014-09-18 08:08:35

标签: java sql mybatis

我现在有这个:

<select id="associations-short-sql" resultMap="associationInfoForListMap">
    <![CDATA[
        select
               a.id as d,
               a.name as name,
               a.somenum as number
        from
               associations a
    ]]>
    <if test="id!= null">
        where a.id = #{id}
    </if>
</select>

但我需要添加过滤功能。因此,如果uri查询具有参数名称,我想要像查询一样添加条件。 id和name都必须是可选的。因此,如果没有在url查询中设置params,那么查询必须是:

        select
               a.id as d,
               a.name as name
               a.somenum as number
        from
               associations a

如果设置了id,则查询必须为:

        select
               a.id as d,
               a.name as name
               a.somenum as number
        from
               associations a
        where a.id = #{id}

如果设置了名称,则查询必须为

        select
               a.id as d,
               a.name as name
               a.somenum as number
        from
               associations a
        where a.name like '%#{name}%'

如果名称和数字集查询必须是:

        select
               a.id as d,
               a.name as name
               a.somenum as number
        from
               associations a
        where a.name like '%#{name}%' and number like '%#{number}%'

但是,当设置一些参数时,我必须保持选择语句顺序正确(我的意思是whereand部分)。这是一个相当简单的例子,但它可能要复杂得多。对于参数name,我应该检查是否设置了number,参数号I应该检查是否设置了name。对于id,我应该检查是否设置了名称和号码。如果我有10个参数%!@#!@怎么办? :)

是否可以在某些临时变量中存储where条件?保持正确的订单会容易得多。谢谢。

1 个答案:

答案 0 :(得分:2)

至少有两种选择。

动态SQL

第一个选项是使用dynamic sql,并且适用于许多情况是内置的,并且不需要其他配置:

<select id="associations-short-sql" resultMap="associationInfoForListMap">
  <![CDATA[
    select
           a.id as d,
           a.name as name,
           a.somenum as number
    from
           associations a
  ]]>
  <where>
    <if test="id != null">
      a.id = #{id}
    </if>
    <if test="id == null">
      <if test="name != null">
        AND a.name = #{name}
      </if>
      <if test="number != null">
        AND a.number = #{number}
      </if>
    </if>
  </where>
</select>
<where>子句为空并且不将其插入结果sql时,

where元素处理大小写。如果您仅通过name,它还会在开头修剪额外的AND。

脚本

另一种选择是使用scriptingvelocity engine中的脚本更具表现力和强大功能。通常表示法更紧凑。 您的示例可能如下所示:

<select id="associations-short-sql" resultMap="associationInfoForListMap">
  <![CDATA[
    select
           a.id as d,
           a.name as name,
           a.somenum as number
    from
           associations a
  ]]>
  #where()
    #if($_parameter.id)
      a.id = @{id}
    #else
      #if($_parameter.name)
        AND a.name = @{name}
      #end
      #if($_parameter.number)
        AND a.number = @{number}
      #end
    #end
  #end
</select>

此外,速度允许您拥有变量,循环等。